详解使用 DockerHub 官方的 mysql 镜像生成容器


写在前面:看到网上关于利用 DockerHub 官方的 mysql 镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教。


我的需求:利用 docker 镜像快速建立一个 mysql 容器。


于是我去找度娘,谷哥,看了好多以官方 centos 镜像为基础,制作基于 centos 的 mysql 镜像,但是制作后发现镜像大小已经超过 1G,对于一般的 docker 镜像来说太臃肿了。


自己私下想:不至于吧,mysql 的镜像这么大?然后去仓库看了下


https://hub.docker.com/_/mysql/  (英文水平比较好的直接看这链接文档来就好了,嘿嘿)


言归正传 ->


  我自己隐约觉得,用官方的就好了,因为这已经暂时满足我的需求了。其他人自己制作 mysql 镜像有他们的特殊需求吧!  所以我就先使用官方的了! 


拉下来一看 Docker Hub 目前官方提供的 mysql 镜像才 380.2MB。


一、下载官方的 mysql 镜像


[root@localhost ~]# docker pull mysql

下载完成后查看镜像:


[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest 1195b21c3a45 10 weeks ago 380.2 MB

 


二、生成容器 


生成容器时,调用的启动脚本是 /entrypoint.sh; 通过查看 /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

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


[root@localhost mysql_data]# docker run -d -p 3307:3306 --name mysql -P -e mysqld -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_USER=yope -e MYSQL_PASSWORD=yope -e MYSQL_DATABASE=testDb -v /mysql_data:/var/lib/mysql mysql 
492ffa26d8653561208aed28eb62c61e9bae0de91ef911769c35f9e4eae6b272
[root@localhost mysql_data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
492ffa26d865 mysql "docker-entrypoint.sh" 10 seconds ago Up 7 seconds 0.0.0.0:3307->3306/tcp mysql

重要参数说明:


 --name mysql


指定容器名称为 mysql;


-p 3307:3306


指定映射端口 将宿主机端口 3307 映射到容器 3306 端口;


-v /mysql_data:/var/lib/mysql


映射数据库存放位置。将宿主机的目录“/mysql_data”映射到容器的“/var/lib/mysql”目录;这是因为默认情况下数据库的数据库文件和日志文件都会存放于容器的 AUFS 文件层,这不仅不使得容器变得越来越臃肿,不便于迁移、备份等管理,而且数据库的性能也会受到影响。因此建议挂载到宿主机的目录到容器内。


查看本地的 mysql_data 是否生成容器内的数据库:


[root@localhost /]# ll /mysql_data/
总用量 188452
-rw-r----- 1 systemd-bus-proxy ssh_keys 56 820 22:25 auto.cnf
-rw-r----- 1 systemd-bus-proxy ssh_keys 1329 820 22:25 ib_buffer_pool
-rw-r----- 1 systemd-bus-proxy ssh_keys 79691776 820 22:25 ibdata1
-rw-r----- 1 systemd-bus-proxy ssh_keys 50331648 820 22:25 ib_logfile0
-rw-r----- 1 systemd-bus-proxy ssh_keys 50331648 820 22:25 ib_logfile1
-rw-r----- 1 systemd-bus-proxy ssh_keys 12582912 820 22:25 ibtmp1
drwxr-x--- 2 systemd-bus-proxy ssh_keys 4096 820 22:25 mysql
drwxr-x--- 2 systemd-bus-proxy ssh_keys 8192 820 22:25 performance_schema
drwxr-x--- 2 systemd-bus-proxy ssh_keys 8192 820 22:25 sys
drwxr-x--- 2 systemd-bus-proxy ssh_keys 19 820 22:25 testDb
[root@localhost /]#

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


测试方案一:


在宿主机上通过端口访问容器中的 mysql 服务


[root@localhost /]# yum -y install mysql

测试登录:


[root@localhost mysql_data]# mysql -u root -p -h 127.0.0.1 -P 3307
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.13 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>

测试方案二:


自己本地利用 mysql 连接工具(eg:Navicat 等)进行连接,注意映射出来的真实端口不一定是 3306 就好了。


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


(这个注意本人没有落实验证,如果描写信息有错,还望指出)


 


三、进入到新生成的容器 (名为 mysql 的容器)


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


[root@localhost /]# docker exec -it mysql /bin/bash

查看进程:


root@492ffa26d865:/# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1 0.2 9.7 1262696 182200 ? Ssl 14:52 0:00 mysqld
root 127 0.2 0.1 20216 1884 ? Ss 14:57 0:00 /bin/bash
root 133 0.0 0.0 17492 1148 ? R+ 14:58 0:00 ps -aux

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


root@492ffa26d865:/# ls -l /var/lib/mysql/
total 188452
-rw-r----- 1 mysql mysql 56 Aug 20 14:52 auto.cnf
-rw-r----- 1 mysql mysql 1329 Aug 20 14:52 ib_buffer_pool
-rw-r----- 1 mysql mysql 50331648 Aug 20 14:52 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Aug 20 14:52 ib_logfile1
-rw-r----- 1 mysql mysql 79691776 Aug 20 14:52 ibdata1
-rw-r----- 1 mysql mysql 12582912 Aug 20 14:52 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Aug 20 14:52 mysql
drwxr-x--- 2 mysql mysql 8192 Aug 20 14:52 performance_schema
drwxr-x--- 2 mysql mysql 8192 Aug 20 14:52 sys
drwxr-x--- 2 mysql mysql 19 Aug 20 14:52 testDb

进入 mysql:


root@492ffa26d865:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.13 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, 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,需要手工安装


root@492ffa26d865:/# apt-get update && apt-get -yq install vim

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


root@492ffa26d865:/# vim /etc/mysql/my.cnf

vim 编辑器在此不做详述。


如果已经有一个比较成熟的 my.cnf 的配置方案,可以在宿主机上新建一个文件夹将已经设置好的 my.cnf 和 conf.d 这二个文件放到里面,


然后在新建容器的时候,直接使用参数”-v” 将这个文件夹映射到容器的”/etc/mysql”目录上即可。


The End