共计 7418 个字符,预计需要花费 19 分钟才能阅读完成。
一直在尝试以官方 CentOS 镜像为基础,制作基于 CentOS 的 MySQL 镜像。但是制作后发现镜像大小已经超过 1.5G,这对于一般的 Docker 镜像来说太臃肿了。Docker Hub 官方提供的 CentOS 镜像才 324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧!
一、下载官方的 mysql 镜像
docker pull mysql
下载完成后查看镜像:
[ | ]|
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE | |
mysql latest e206c8d4ffcf 4 days ago 324.3 MB |
二、生成容器
我在第一次生成容器时使用之前生成容器的方法,生成的容器运行后会马上退出。
[ | ]|
c98c9e052d5d5a7981218140f0128390190e0e8d6e72d78ca05a29e2ed161c9f | |
[ | ]|
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES | |
c98c9e052d5d mysql "/entrypoint.sh mysq 4 seconds ago Exited (1) 3 seconds ago mad_kirch |
查看 logs
[ | ]|
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_ROOT_PASSWORD | |
MYSQL_USER | |
MYSQL_PASSWORD | |
MYSQL_DATABASE | |
/var/lib/mysql | |
/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
[ | ]|
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”目录上即可。
更多 Docker 相关教程见以下内容:
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04 安装 Docker http://www.linuxidc.com/linux/2014-08/105656.htm
Ubuntu 使用 VNC 运行基于 Docker 的桌面系统 http://www.linuxidc.com/Linux/2015-08/121170.htm
阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
Ubuntu 15.04 下安装 Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132398.htm
