详解如何使用Docker Hub官方的MySQL镜像生成容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯!一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。

欢迎关注大数据和人工智能技术文章发布的微信公众号:清研学堂,在这里你可以学到夜白(作者笔名)精心整理的笔记,让我们每天进步一点点,让优秀成为一种习惯!

一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了。Docker Hub官方提供的CentOS镜像才324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧!

一、下载官方的mysql镜像

docker pull mysql

下载完成后查看镜像:

[root@localhost mysql_data]# docker images
REPOSITORY          TAG                 IMAGE ID CREATED VIRTUAL SIZE mysql latest e206c8d4ffcf 4 days ago 324.3 MB

二、生成容器 
我在第一次生成容器时使用之前生成容器的方法,生成的容器运行后会马上退出。

[root@localhost mysql_data]# docker run -d -P mysql
c98c9e052d5d5a7981218140f0128390190e0e8d6e72d78ca05a29e2ed161c9f
[root@localhost mysql_data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c98c9e052d5d mysql "/entrypoint.sh mysq 4 seconds ago Exited (1) 3 seconds ago mad_kirch

查看logs

[root@localhost mysql_data]# docker logs c98c
error: database is uninitialized and MYSQL_ROOT_PASSWORD not set
  Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?

提示说是因为没有使用参数MYSQL_ROOT_PASSWORD 
但是除了这个参数还有没有其他参数呢?想到这里,我看到生成容器时,调用的启动脚本是/entrypoint.sh,我想应该查一下这个脚本的内容确定一下。

但是这个容器无法启动,根本就没法查看,那只能是新生成一个查看/entrypoint.sh脚本的容器了:

[root@localhost mysql_data]# docker run mysql cat /entrypoint.sh
#!/bin/bash
set -e

# if command starts with an option, prepend mysqld
if [ "${1:0:1}" = '-' ]; then set -- mysqld "$@" fi if [ "$1" = 'mysqld' ]; then # Get config DATADIR="$("$@" --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')" if [ ! -d "$DATADIR/mysql" ]; then if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" ]; then echo >&2 'error: database is uninitialized and MYSQL_ROOT_PASSWORD not set' echo >&2 ' Did you forget to add -e MYSQL_ROOT_PASSWORD=... ?' exit 1 fi mkdir -p "$DATADIR" chown -R mysql:mysql "$DATADIR" echo 'Running mysql_install_db' mysql_install_db --user=mysql --datadir="$DATADIR" --rpm --keep-my-cnf echo 'Finished mysql_install_db' mysqld --user=mysql --datadir="$DATADIR" --skip-networking & pid="$!" mysql=( mysql --protocol=socket -uroot ) for i in {30..0}; do if echo 'SELECT 1' | "${mysql[@]}" &> /dev/null; then break fi echo 'MySQL init process in progress...' sleep 1 done if [ "$i" = 0 ]; then echo >&2 'MySQL init process failed.' exit 1 fi # sed is for https://bugs.mysql.com/bug.php?id=20545 mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/FCTY/' | "${mysql[@]}" mysql "${mysql[@]}" <<-EOSQL -- What's done in this file shouldn't be replicated -- or products like mysql-fabric won't work SET @@SESSION.SQL_LOG_BIN=0; DELETE FROM mysql.user ; CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ; DROP DATABASE IF EXISTS test ; FLUSH PRIVILEGES ; EOSQL if [ ! -z "$MYSQL_ROOT_PASSWORD" ]; then mysql+=( -p"${MYSQL_ROOT_PASSWORD}" ) fi if [ "$MYSQL_DATABASE" ]; then echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" | "${mysql[@]}" mysql+=( "$MYSQL_DATABASE" ) fi if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then echo "CREATE USER '"$MYSQL_USER"'@'%' IDENTIFIED BY '"$MYSQL_PASSWORD"' ;" | "${mysql[@]}" if [ "$MYSQL_DATABASE" ]; then echo "GRANT ALL ON \`"$MYSQL_DATABASE"\`.* TO '"$MYSQL_USER"'@'%' ;" | "${mysql[@]}" fi echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}" fi echo for f in /docker-entrypoint-initdb.d/*; do case "$f" in *.sh) echo "$0: running $f"; . "$f" ;; *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;; *) echo "$0: ignoring $f" ;; esac echo done if ! kill -s TERM "$pid" || ! wait "$pid"; then echo >&2 'MySQL init process failed.' exit 1 fi echo echo 'MySQL init process done. Ready for start up.' echo fi chown -R mysql:mysql "$DATADIR" fi exec "$@" 

通过查看/entrypoint.sh脚本内容,总结参数如下

mysqld #启动mysql服务,必须使用
MYSQL_ROOT_PASSWORD #设置mysql的root密码,必须使用
#以下二个参数添加除root之外的用户并设置密码,可选。
MYSQL_USER 
MYSQL_PASSWORD
#设置生成容器时需要新建的数据库,可选
MYSQL_DATABASE
#容器的mysql数据库默认的保存路径是:
/var/lib/mysql
#容器的配置文件my.cnf的路径为: /etc/mysql/my.cnf

使用上要的参数生成新的容器:

mkdir /mysql_data
docker run -d -P -e mysqld -e MYSQL_ROOT_PASSWORD=147258 -e MYSQL_USER=steven -e MYSQL_PASSWORD=147258 -e MYSQL_DATABASE=discuz -v /mysql_data:/var/lib/mysql mysql

命令详解: 
1、设置容器的mysql的root密码为”147258”; 
2、新添加一个名为“steven”的用户,密码设置为“147258”; 
3、在生成容器的同时新建一个名为“discuz”的数据库; 
4、将宿主机的目录“/mysql_data”映射到容器的“/var/lib/mysql”目录。这是因为默认情况下数据库的数据库文件和日志文件都会存放于容器的AUFS文件层,这不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。

查看新生成的容器:

[root@localhost mysql_data]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS                     NAMES
9a5733de65cf        mysql               "/entrypoint.sh mysq   4 seconds ago       Up 3 seconds                0.0.0.0:32792->3306/tcp   determined_lovelace
32c10755406e        mysql               "/entrypoint.sh cat 29 minutes ago Exited (0) 29 minutes ago jolly_torvalds c98c9e052d5d mysql "/entrypoint.sh mysq 34 minutes ago Exited (1) 34 minutes ago mad_kirch

容器的3306端口已经映射给了宿主机的32792端口。如果需要将容器的3306端口开放给指定的宿主机端口,请使用参数 “-p 宿主机端口:3306”。 
查看本地的mysql_data是否生成容器内的数据库:

[root@localhost ~]# ll /mysql_data/
总用量 110608
-rw-rw---- 1 999 999       56 10月 18 09:55 auto.cnf drwx------ 2 999 999 4096 10月 18 09:55 discuz -rw-rw---- 1 999 999 12582912 10月 18 11:10 ibdata1 -rw-rw---- 1 999 999 50331648 10月 18 11:10 ib_logfile0 -rw-rw---- 1 999 999 50331648 10月 18 09:55 ib_logfile1 drwx------ 2 999 999 4096 10月 18 09:55 mysql drwx------ 2 999 999 4096 10月 18 09:55 performance_schema

已经生成相关的文件和默认数据库,同时也新建了”disucz”数据库.

测试:在宿主机上通过端口访问容器中的mysql服务: 
安装 mysql

yum -y install mysql

测试:

[root@localhost ~]# mysql -u steven -p -h 127.0.0.1 -P 32792
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.6.27 MySQL Community Server (GPL) Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

测试成功!

需要注意的是:宿主机上的UID和GID是999。这是容器里用户mysql的UID和GID。千万另进行权限变更,否则容器对这个目录进行读写就会出现问题。如果觉得不舒服,可以在本地新建一个mysql_docker的用户指定UID和GID是999。

三、进入到新生成的容器 
由于官方的镜像没有提供sshd服务,所以可以选择在生成容器之前先自行安装sshd服务,重新生成镜像,然后再生成容器。这部分在之前的文章里提过,所以就不多说了。

另一种方法是使用exec命令直接进入到容器内部 
查看生成的容器ID

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE COMMAND CREATED STATUS PORTS NAMES 9a5733de65cf mysql "/entrypoint.sh mysq 11 minutes ago Up 11 minutes 0.0.0.0:32792->3306/tcp determined_lovelace

使用exec进入容器,同时进行相关操作:

[root@localhost ~]# docker exec -it  9a57 /bin/bash

查看进程:

root@9a5733de65cf:/# ps aux
USER       PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1 0.0 11.5 678020 118008 ? Ssl 03:10 0:00 mysqld root 33 0.3 0.1 20156 1916 ? Ss 03:23 0:00 /bin/bash root 38 0.0 0.1 17432 1140 ? R+ 03:23 0:00 ps aux

查看数据库所在的文件夹:

root@9a5733de65cf:/# ls -l /var/lib/mysql/
total 110608
-rw-rw---- 1 mysql mysql       56 Oct 18 01:55 auto.cnf drwx------ 2 mysql mysql 4096 Oct 18 01:55 discuz -rw-rw---- 1 mysql mysql 50331648 Oct 18 03:10 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 Oct 18 01:55 ib_logfile1 -rw-rw---- 1 mysql mysql 12582912 Oct 18 03:10 ibdata1 drwx------ 2 mysql mysql 4096 Oct 18 01:55 mysql drwx------ 2 mysql mysql 4096 Oct 18 01:55 performance_schema

进入mysql:

root@9a5733de65cf:/# mysql -u steven -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 2 Server version: 5.6.27 MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>

四、修改容器中mysql的配置文件 
默认镜像中并没有安装vi或者vim,需要手工安装。

apt-get update && apt-get -yq install vim

然后就可以使用vim 来修改mysql的配置文件:

vim /etc/mysql/my.cnf

如果已经有一个比较成熟的my.cnf的配置方案,可以在宿主机上新建一个文件夹将已经设置好的my.cnf和conf.d这二个文件放到里面,在新建窗口的时候,直接使用参数”-v” 将这个文件夹映射到容器的”/etc/mysql”目录上即可。

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
3天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
2天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
12 0
|
2天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
10 0
|
2天前
|
关系型数据库 MySQL Linux
本地虚拟机centos7通过docker安装主从mysql5.7.21
本地虚拟机centos7通过docker安装主从mysql5.7.21
10 0
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
3天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
3天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
3天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复