新聞中心
一直在嘗試以官方centos鏡像為基礎(chǔ),制作基于CentOS的mysql鏡像。但是制作后發(fā)現(xiàn)鏡像大小已經(jīng)超過1.5G,這對于一般的Docker鏡像來說太臃腫了。Docker Hub官方提供的CentOS鏡像才324MB。目前來說我還沒有找到什么好的方法把我制作的鏡像的體積減下來,所以就先使用官方的吧!

創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、池州網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為池州等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、下載官方的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=... ?
提示說是因為沒有使用參數(shù)MYSQL_ROOT_PASSWORD
但是除了這個參數(shù)還有沒有其他參數(shù)呢?想到這里,我看到生成容器時,調(diào)用的啟動腳本是/entrypoint.sh,我想應(yīng)該查一下這個腳本的內(nèi)容確定一下。
但是這個容器無法啟動,根本就沒法查看,那只能是新生成一個查看/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腳本內(nèi)容,總結(jié)參數(shù)如下
mysqld #啟動mysql服務(wù),必須使用
MYSQL_ROOT_PASSWORD #設(shè)置mysql的root密碼,必須使用
#以下二個參數(shù)添加除root之外的用戶并設(shè)置密碼,可選。
MYSQL_USER
MYSQL_PASSWORD
#設(shè)置生成容器時需要新建的數(shù)據(jù)庫,可選
MYSQL_DATABASE
#容器的mysql數(shù)據(jù)庫默認的保存路徑是:
/var/lib/mysql
#容器的配置文件my.cnf的路徑為:
/etc/mysql/my.cnf
使用上要的參數(shù)生成新的容器:
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、設(shè)置容器的mysql的root密碼為”147258”;
2、新添加一個名為“steven”的用戶,密碼設(shè)置為“147258”;
3、在生成容器的同時新建一個名為“discuz”的數(shù)據(jù)庫;
4、將宿主機的目錄“/mysql_data”映射到容器的“/var/lib/mysql”目錄。這是因為默認情況下數(shù)據(jù)庫的數(shù)據(jù)庫文件和日志文件都會存放于容器的AUFS文件層,這不僅不使得容器變得越來越臃腫,不便于遷移、備份等管理,而且數(shù)據(jù)庫的性能也會受到影響。因此建議掛載到宿主機的目錄到容器內(nèi)。
查看新生成的容器:
[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端口已經(jīng)映射給了宿主機的32792端口。如果需要將容器的3306端口開放給指定的宿主機端口,請使用參數(shù) “-p 宿主機端口:3306”。
查看本地的mysql_data是否生成容器內(nèi)的數(shù)據(jù)庫:
[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
已經(jīng)生成相關(guān)的文件和默認數(shù)據(jù)庫,同時也新建了”disucz”數(shù)據(jù)庫.
測試:在宿主機上通過端口訪問容器中的mysql服務(wù):
安裝 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。千萬另進行權(quán)限變更,否則容器對這個目錄進行讀寫就會出現(xiàn)問題。如果覺得不舒服,可以在本地新建一個mysql_docker的用戶指定UID和GID是999。
三、進入到新生成的容器
由于官方的鏡像沒有提供sshd服務(wù),所以可以選擇在生成容器之前先自行安裝sshd服務(wù),重新生成鏡像,然后再生成容器。這部分在之前的文章里提過,所以就不多說了。
另一種方法是使用exec命令直接進入到容器內(nèi)部
查看生成的容器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進入容器,同時進行相關(guān)操作:
[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
查看數(shù)據(jù)庫所在的文件夾:
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
如果已經(jīng)有一個比較成熟的my.cnf的配置方案,可以在宿主機上新建一個文件夾將已經(jīng)設(shè)置好的my.cnf和conf.d這二個文件放到里面,在新建窗口的時候,直接使用參數(shù)”-v” 將這個文件夾映射到容器的”/etc/mysql”目錄上即可。
本文名稱:詳解如何使用DockerHub官方的MySQL鏡像生成容器
網(wǎng)頁路徑:http://www.dlmjj.cn/article/djpeedg.html


咨詢
建站咨詢
