>>>我的博客<<<
一、使用docker run命令直接啟動一個mysql容器
1.1 下載官方tomcat鏡像
[root@dev ~]# docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 6589 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 2086 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 484 [OK]
docker.io docker.io/zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 107 [OK]
docker.io docker.io/hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 90
docker.io docker.io/zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server ... 61 [OK]
docker.io docker.io/centurylink/mysql Image containing mysql. Optimized to be li... 60 [OK]
docker.io docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 38 [OK]
docker.io docker.io/tutum/mysql Base docker image to run a MySQL database ... 32
docker.io docker.io/centos/mysql-57-centos7 MySQL 5.7 SQL database server 31
docker.io docker.io/mysql/mysql-cluster Experimental MySQL Cluster Docker images. ... 31
docker.io docker.io/schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back... 20 [OK]
docker.io docker.io/bitnami/mysql Bitnami MySQL Docker Image 15 [OK]
docker.io docker.io/zabbix/zabbix-proxy-mysql Zabbix proxy with MySQL database support 15 [OK]
docker.io docker.io/linuxserver/mysql A Mysql container, brought to you by Linux... 14
docker.io docker.io/centos/mysql-56-centos7 MySQL 5.6 SQL database server 8
docker.io docker.io/circleci/mysql MySQL is a widely used, open-source relati... 6
docker.io docker.io/openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima... 6
docker.io docker.io/dsteinkopf/backup-all-mysql backup all DBs in a mysql server 4 [OK]
docker.io docker.io/frodenas/mysql A Docker Image for MySQL 2 [OK]
docker.io docker.io/mysql/mysql-router MySQL Router provides transparent routing ... 2
docker.io docker.io/openzipkin/zipkin-mysql Mirror of https://quay.io/repository/openz... 1
docker.io docker.io/ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
docker.io docker.io/cloudfoundry/cf-mysql-ci Image used in CI of cf-mysql-release 0
docker.io docker.io/cloudposse/mysql Improved `mysql` service with support for ... 0 [OK]
[root@dev mysql]# docker pull mysql:5.7.19
Trying to pull repository docker.io/library/mysql ...
5.7.19: Pulling from docker.io/library/mysql
85b1f47fba49: Pull complete
27dc53f13a11: Pull complete
095c8ae4182d: Pull complete
0972f6b9a7de: Pull complete
1b199048e1da: Pull complete
159de3cf101e: Pull complete
963d934c2fcd: Pull complete
f4b66a97a0d0: Pull complete
f34057997f40: Pull complete
ca1db9a06aa4: Pull complete
0f913cb2cc0c: Pull complete
Digest: sha256:bfb22e93ee87c6aab6c1c9a4e7cdc68e9cb9b64920f28fa289f9ffae9fe8e173
Status: Downloaded newer image for docker.io/mysql:5.7.19
[root@dev mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
marvin/tomcat latest 098f61ab6f8b 22 hours ago 489 MB
nginx_image1 latest c4d5f5accc06 24 hours ago 109 MB
docker.io/tomcat latest 2d43521f2b1a 6 days ago 463 MB
docker.io/nginx latest 8b89e48b5f15 7 days ago 109 MB
docker.io/mysql 5.7.19 3e3878acd190 9 months ago 412 MB
[root@dev mysql]#
1.2 創建用于掛載的目錄
[root@dev local]# pwd
/usr/local
[root@dev local]# mkdir mysql
[root@dev local]# mkdir mysql/data
[root@dev local]# mkdir mysql/conf.d
[root@dev local]# cd mysql/
[root@dev mysql]# ll
total 8
drwxr-xr-x 2 root root 4096 Jul 24 14:18 conf.d
drwxr-xr-x 2 root root 4096 Jul 24 14:18 data
[root@dev mysql]#
命令解析:
mkdir /usr/local/mysql/data #用于掛載mysql數據文件
mkdir /usr/local/mysql/conf.d #用于掛載mysql配置文件
1.3 啟動容器
[root@dev mysql]# docker run --name mysql5.7 -p 3306:3306 -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=112233 -d mysql:5.7.19
10151eef645f8621441585354ad11d1f98514cdb253c5d1b77db6c0c50327420
[root@dev mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10151eef645f mysql:5.7.19 "docker-entrypoint..." 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql5.7
6f189daf5880 marvin/tomcat "catalina.sh run" 22 hours ago Up 22 hours 0.0.0.0:8080->8080/tcp tomcat8
[root@dev mysql]#
其他參數:
–restart always:開機啟動
–privileged=true:提升容器內權限
-e MYSQL_USER=”marvin”:添加用戶marvin
-e MYSQL_PASSWORD=”pwd123”:設置marvin的密碼偉pwd123
-e MYSQL_ROOT_PASSWORD=”rootpwd123”:設置root的密碼偉rootpwd123
–character-set-server=utf8:設置字符集為utf8
–collation-server=utf8_general_ci:設置字符比較規則為utf8_general_ci
注意:如果運行時添加了marvin用戶,用root登錄后執行用戶授權ALTER USER 'marvin'@'%' IDENTIFIED WITH mysql_native_password BY 'password123';
,才能用遠程客戶端訪問數據庫。
1.4 檢查結果
[root@dev mysql]# docker exec -it mysql5.7 mysql -uroot -p112233
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.11 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql>
成功安裝mysql
1.5 設置遠程客戶端登錄
mysql> grant all privileges on *.* to root@"%" identified by "root.123" with grant option;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql>
通過客戶端創建數據一個數據庫,創建一張表
在server端用命令行查看:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| demo |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use demo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| test |
+----------------+
1 row in set (0.00 sec)
mysql> select * from test;
Empty set (0.00 sec)
mysql>
再看宿主機文件目錄:
[root@dev data]# pwd
/usr/local/mysql/data
[root@dev data]# ll
total 188480
-rw-r----- 1 polkitd ssh_keys 56 Jul 24 16:46 auto.cnf
-rw------- 1 polkitd ssh_keys 1675 Jul 24 16:46 ca-key.pem
-rw-r--r-- 1 polkitd ssh_keys 1074 Jul 24 16:46 ca.pem
-rw-r--r-- 1 polkitd ssh_keys 1078 Jul 24 16:46 client-cert.pem
-rw------- 1 polkitd ssh_keys 1675 Jul 24 16:46 client-key.pem
drwxr-x--- 2 polkitd ssh_keys 4096 Jul 24 16:52 demo
-rw-r----- 1 polkitd ssh_keys 1321 Jul 24 16:46 ib_buffer_pool
-rw-r----- 1 polkitd ssh_keys 79691776 Jul 24 16:52 ibdata1
-rw-r----- 1 polkitd ssh_keys 50331648 Jul 24 16:52 ib_logfile0
-rw-r----- 1 polkitd ssh_keys 50331648 Jul 24 16:46 ib_logfile1
-rw-r----- 1 polkitd ssh_keys 12582912 Jul 24 16:52 ibtmp1
drwxr-x--- 2 polkitd ssh_keys 4096 Jul 24 16:46 mysql
drwxr-x--- 2 polkitd ssh_keys 4096 Jul 24 16:46 performance_schema
-rw------- 1 polkitd ssh_keys 1675 Jul 24 16:46 private_key.pem
-rw-r--r-- 1 polkitd ssh_keys 451 Jul 24 16:46 public_key.pem
-rw-r--r-- 1 polkitd ssh_keys 1078 Jul 24 16:46 server-cert.pem
-rw------- 1 polkitd ssh_keys 1675 Jul 24 16:46 server-key.pem
drwxr-x--- 2 polkitd ssh_keys 12288 Jul 24 16:46 sys
[root@dev data]#
完美!
二、 使用dockerfile啟動mysql容器
2.1、編寫docker file
在當前目錄(/usr/local/mysql/)創建dockerfile文件,編輯內容如下:
FROM docker.io/mysql:5.7.19
#設置免密登錄
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#將所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql
COPY conf.d /etc/mysql/conf.d
RUN chmod 755 /mysql/*.sh
# 設置可以允許掛載的卷,可以用來備份數據庫和配置文件
# VOLUME /usr/local/mysql/data
# 設置可以映射的端口
EXPOSE 3306
#設置容器啟動時執行的命令
CMD ["sh", "/mysql/setup.sh"]
2.2、寫容器啟動腳本setup.sh和配置文件。
setup.sh內容如下:
#!/bin/bash
set -e
#查看mysql服務的狀態,方便調試,這條語句可以刪除
echo `service mysql status`
echo '1.啟動mysql....'
#啟動mysql
service mysql start
sleep 3
echo `service mysql status`
echo '2.開始導入數據....'
#導入數據
mysql < /mysql/schema.sql
echo '3.導入數據完畢....'
sleep 3
echo `service mysql status`
#重新設置mysql密碼
echo '4.開始修改密碼....'
mysql < /mysql/privileges.sql
echo '5.修改密碼完畢....'
#sleep 3
echo `service mysql status`
echo `mysql容器啟動完畢,且數據導入成功`
tail -f /dev/null
設置可執行權限:
chmod u+x setup.sh
這里是先導入數據,然后才是設置用戶和權限,是因為mysql容器一開始為免密登錄,Dockerfile中有如下設置:ENV MYSQL_ALLOW_EMPTY_PASSWORD yes,此時執行導入數據命令不需要登錄驗證操作,如果是先執行權限操作,那么導入數據則需要登錄驗證,整個過程就麻煩了許多。
conf.d目錄下創建配置文件my.cnf
,內容如下:
[client]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=’SET NAMES utf8mb4'
max_allowed_packet=100M
[mysql]
default-character-set=utf8mb4
2.3、需要導入數據的mysql腳本命令schema.sql:
-- 創建數據庫
create database `docker_mysql` default character set utf8 collate utf8_general_ci;
use docker_mysql;
-- 建表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`created_at` bigint(40) DEFAULT NULL,
`last_modified` bigint(40) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`first_name` varchar(255) DEFAULT NULL,
`last_name` varchar(255) DEFAULT NULL,
`username` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- 插入數據
INSERT INTO `user` (`id`, `created_at`, `last_modified`, `email`, `first_name`, `last_name`, `username`)
VALUES
(0,1490257904,1490257904,'john.doe@example.com','John','Doe','user');
因為是測試,所以隨便寫了一個建表語句,如果是真實項目肯定不止這一張表,直接將建表語句覆蓋過來就好。
2.4、mysql權限設置命令privileges.sql:
use mysql;
select host, user from user;
-- 因為mysql版本是5.7,因此新建用戶為如下命令:
create user docker identified by '123456';
-- 將docker_mysql數據庫的權限授權給創建的docker用戶,密碼為123456:
grant all on docker_mysql.* to docker@'%' identified by '123456' with grant option;
-- 創建root用戶,設置密碼
create user root identified by 'root.123';
-- 授權root用戶所有數據庫密碼
grant all privileges on *.* to root@"%" identified by "root.123" with grant option;
-- 這一條命令一定要有:
flush privileges;
2.5、創建鏡像docker build -t marvin/docker-mysql:5.7.19 .
[root@dev mysql]# ll
total 28
drwxr-xr-x 2 root root 4096 Jul 24 19:16 conf.d
drwxr-xr-x 6 polkitd ssh_keys 4096 Jul 26 09:52 data
drwxr-xr-x 2 root root 4096 Jul 26 12:02 datadir
-rw-r--r-- 1 root root 504 Jul 26 12:41 dockerfile
-rw-r--r-- 1 root root 578 Jul 24 18:38 privileges.sql
-rw-r--r-- 1 root root 713 Jul 24 17:59 schema.sql
-rwxr--r-- 1 root root 592 Jul 24 18:02 setup.sh
[root@dev mysql]# rm -rf datadir/
[root@dev mysql]# ll
total 24
drwxr-xr-x 2 root root 4096 Jul 24 19:16 conf.d
drwxr-xr-x 6 polkitd ssh_keys 4096 Jul 26 09:52 data
-rw-r--r-- 1 root root 504 Jul 26 12:41 dockerfile
-rw-r--r-- 1 root root 578 Jul 24 18:38 privileges.sql
-rw-r--r-- 1 root root 713 Jul 24 17:59 schema.sql
-rwxr--r-- 1 root root 592 Jul 24 18:02 setup.sh
[root@dev mysql]# docker build -t marvin/docker-mysql:5.7.19 .
Sending build context to Docker daemon 219.8 MB
Step 1/9 : FROM docker.io/mysql:5.7.19
---> 3e3878acd190
Step 2/9 : ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
---> Running in 12565f8c0c75
---> c3603b8b0ce0
Removing intermediate container 12565f8c0c75
Step 3/9 : COPY setup.sh /mysql/setup.sh
---> 25f810745d6e
Removing intermediate container c87437761955
Step 4/9 : COPY schema.sql /mysql/schema.sql
---> 6336d1ec2e5c
Removing intermediate container d18c0faf05e2
Step 5/9 : COPY privileges.sql /mysql/privileges.sql
---> 909fd9a0147e
Removing intermediate container 597ba357c5dd
Step 6/9 : COPY conf.d /etc/mysql/conf.d
---> 0df0b1a8419a
Removing intermediate container 5495b6697f5a
Step 7/9 : RUN chmod 755 /mysql/*.sh
---> Running in 648c99da183d
---> 9637b6b5e125
Removing intermediate container 648c99da183d
Step 8/9 : EXPOSE 3306
---> Running in 0b4514d7ffcc
---> 0acd4a3a39a6
Removing intermediate container 0b4514d7ffcc
Step 9/9 : CMD sh /mysql/setup.sh
---> Running in 9cc069e6e6aa
---> effcf5bab4c1
Removing intermediate container 9cc069e6e6aa
Successfully built effcf5bab4c1
[root@dev mysql]#
[root@dev mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
marvin/docker-mysql 5.7.19 effcf5bab4c1 27 seconds ago 412 MB
marvin/tomcat latest 098f61ab6f8b 2 days ago 489 MB
nginx_image1 latest c4d5f5accc06 2 days ago 109 MB
docker.io/tomcat latest 2d43521f2b1a 8 days ago 463 MB
docker.io/nginx latest 8b89e48b5f15 9 days ago 109 MB
docker.io/mysql 5.7.19 3e3878acd190 9 months ago 412 MB
[root@dev mysql]#
2.6、啟動容器docker run -d -p 13306:3306 -v /usr/local/mysql/datadir:/var/lib/mysql marvin/docker-mysql:5.7.19
[root@dev mysql]# docker run -d -p 13306:3306 -v /usr/local/mysql/datadir:/var/lib/mysql marvin/docker-mysql:5.7.19
e55a41a9ace4fb09db5af3e77fab257764f938ffe2f7221ec312bf624f41543e
[root@dev mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e55a41a9ace4 marvin/docker-mysql:5.7.19 "docker-entrypoint..." 4 seconds ago Up 3 seconds 0.0.0.0:13306->3306/tcp inspiring_bassi
831da6f83e21 mysql:5.7.19 "docker-entrypoint..." 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp mysql5.7
6f189daf5880 marvin/tomcat "catalina.sh run" 2 days ago Up 2 days 0.0.0.0:8080->8080/tcp tomcat8
[root@dev mysql]#
2.7、檢查結果docker exec -it e55a41a9ace4 mysql -udocker -p123456
[root@dev mysql]# docker exec -it e55a41a9ace4 mysql -udocker -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.19 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, 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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| docker_mysql |
+--------------------+
2 rows in set (0.01 sec)
mysql> use docker_mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+------------------------+
| Tables_in_docker_mysql |
+------------------------+
| user |
+------------------------+
1 row in set (0.01 sec)
mysql>
2.8、遠程登錄
用客戶端鏈接后創建了數據庫,然后重新啟動docker,數據仍然在。完美~~~
美中不足
1、找不到mysql.sock
在實踐過程中也碰到了比較惡心的問題,就是啟動時老是找不到mysql.sock,最開始在my.cnf里沒有配置socket的路徑,這樣沒問題。
但是不知道默認的mysql.sock的容器里是在什么路徑上;
于是在my.cnf配置文件里加上這個配置socket=/var/lib/mysql/mysql.sock
;
啟動的時候就怎么都會報錯了
錯誤信息大概是這樣:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
然后將配置改為socket=/tmp/mysql.sock
啟動的時候又變成這樣了:
[root@dev mysql]# docker run -p 13306:3306 -v /usr/local/mysql/datadir:/var/lib/mysql marvin/docker-mysql
MySQL Community Server 5.7.19 is not running.
1.啟動mysql....
..
MySQL Community Server 5.7.19 is started.
MySQL Community Server 5.7.19 is running.
2.開始導入數據....
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
docker stop
docker rm
docker rmi
docker build
又重新docker run
反復了一上午。
最后還是沒辦法,把配置文件中的sock的配置給刪除了。
正常啟動后查知sock的路徑默認的原來是/var/run/mysqld
root@63d3f0b5ea07:/var/run/mysqld# pwd
/var/run/mysqld
root@63d3f0b5ea07:/var/run/mysqld# ls
mysqld.pid mysqld.sock mysqld.sock.lock
root@63d3f0b5ea07:/var/run/mysqld#
應該能修改,不過不想折騰了。
2、如果掛載了數據持久化的數據卷,再次build容器,啟動時會報創建用戶失敗等,因為已有用戶了。
因此如果是二次運行,要么刪除掉持久化的數據,要么修改setup.sh腳本,不要再執行privileges.sql和schema.sql。
擴展
生產環境中可能數據庫要做主從、讀寫分離等等,但是因為數據是要共享的,所以有可能用到下知識.
數據共享
如果要授權一個容器訪問另一個容器的Volume,我們可以使用-volumes-from
參數來執行docker run
。
$ docker run -it -h NEWCONTAINER --volumes-from container-test debian /bin/bash
root@NEWCONTAINER:/# ls /data
test-file
root@NEWCONTAINER:/#
值得注意的是不管container-test是否運行,它都會起作用。只要有容器連接Volume,它就不會被刪除。
數據容器
常見的使用場景是使用純數據容器來持久化數據庫、配置文件或者數據文件等。官方的文檔上有詳細的解釋。例如:
docker run -it -v /dbdata:/dbdata --name dbdata centos
該命令將會創建一個已經包含在Dockerfile里定義過Volume的postgres鏡像,運行echo
命令然后退出。當我們運行docker ps
命令時,echo
可以幫助我們識別某鏡像的用途。我們可以用-volumes-from
命令來識別其它容器的Volume:
創建db1和db2兩個容器,并使用--volumes-from掛載dbdata容器中的數據卷
[root@wls12c /]$ docker run -it --volumes-from dbdata --name db1 centos
[root@wls12c /]$ docker run -it --volumes-from dbdata --name db2 centos
這樣三個容器任何一個容器在該目錄下寫入,其它容器都能看見。
使用數據容器的兩個注意點:
- 不要運行數據容器,這純粹是在浪費資源。
- 不要為了數據容器而使用“最小的鏡像”,如
busybox
或scratch
,只使用數據庫鏡像本身就可以了。你已經擁有該鏡像,所以并不需要占用額外的空間。
備份
備份dbdata數據卷容器中的數據到主機的當前目錄。
[root@wls12c /]$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar zcf /backup/backup.tar.gz /dbdata
tar: Removing leading `/' from member names
[root@wls12c /]$ ls
b2b boot dev lib media net root srv tmp
backup.tar.gz cgroup etc lib64 misc opt sbin sys usr
bin dbdata home lost+found mnt proc selinux test var
[root@wls12c /]$ tar -tvf backup.tar.gz
drwxr-xr-x root/root 0 2016-08-26 10:51 dbdata/
-rw-r--r-- root/root 0 2016-08-26 10:40 dbdata/demo
-rw-r--r-- root/root 6 2016-08-26 10:48 dbdata/test.txt
-rw-r--r-- root/root 0 2016-08-26 10:51 dbdata/hello
恢復
創建一個帶有數據卷的容器
[root@wls12c /]$ docker run -v /dbdata/dbdata --name db centos /bin/bash
恢復
[root@wls12c /]$ docker run --volumes-from db -v $(pwd):/backup centos tar xf /backup/backup.tar.gz
權限與許可
通常你需要設置Volume的權限或者為Volume初始化一些默認數據或者配置文件。要注意的關鍵點是,在Dockerfile的VOLUME
指令后的任何東西都不能改變該Volume,比如:
FROM debian:wheezy
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data
該Docker file不能按預期那樣運行,我們本來希望touch
命令在鏡像的文件系統上運行,但是實際上它是在一個臨時容器的Volume上運行。如下所示:
FROM debian:wheezy
RUN useradd foo
RUN mkdir /data && touch /data/x
RUN chown -R foo:foo /data
VOLUME /data
Docker可以將鏡像中Volume下的文件掛載到Volume下,并設置正確的權限。如果你指定Volume的主機目錄將不會出現這種情況。
如果你沒有通過RUN
指令設置權限,那么你就需要在容器啟動時使用CMD
或ENTRYPOINT
指令來執行(譯者注:CMD指令用于指定一個容器啟動時要運行的命令,與RUN類似,只是RUN是鏡像在構建時要運行的命令)。
刪除Volumes
這個功能可能會更加重要,如果你已經使用docker rm
來刪除你的容器,那可能有很多的孤立的Volume仍在占用著空間。
Volume只有在下列情況下才能被刪除:
- 該容器是用
docker rm -v
命令來刪除的(-v
是必不可少的)。 -
docker run
中使用了--rm
參數
即使用以上兩種命令,也只能刪除沒有容器連接的Volume。連接到用戶指定主機目錄的Volume永遠不會被docker刪除。
除非你已經很小心的,總是像這樣來運行容器,否則你將會在/var/lib/docker/vfs/dir
目錄下得到一些僵尸文件和目錄,并且還不容易說出它們到底代表什么。
參考
詳解利用Dockerfile構建mysql鏡像并實現數據的初始化及權限設置
基于Dockerfile構建mysqld服務鏡像
dockerfile 實例
找不到mysql.sock的錯誤詳解