centos7 上 用docker部署mysql服務

docker-mysql.png
>>>我的博客<<<

一、使用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> 
遠程客戶端鏈接

通過客戶端創建數據一個數據庫,創建一張表


image.png

在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、遠程登錄

image.png

用客戶端鏈接后創建了數據庫,然后重新啟動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

這樣三個容器任何一個容器在該目錄下寫入,其它容器都能看見。

使用數據容器的兩個注意點:

  • 不要運行數據容器,這純粹是在浪費資源。
  • 不要為了數據容器而使用“最小的鏡像”,如busyboxscratch,只使用數據庫鏡像本身就可以了。你已經擁有該鏡像,所以并不需要占用額外的空間。
備份

備份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指令設置權限,那么你就需要在容器啟動時使用CMDENTRYPOINT指令來執行(譯者注: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的錯誤詳解

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容