第四章:管理应用程序数据
1.Volume和Bind Mount

[root@linux-node1 ~]# ls /var/lib/docker/volumes/ -lh
total 24K
-rw------- 1 root root 32K Apr 23 20:47 metadata.db

[root@linux-node1 ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Options:
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
创建一个volume的数据卷nginx-vol:
[root@linux-node1 ~]# docker volume create nginx-vol
nginx-vol
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
查看该数据卷详情:
[root@linux-node1 ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2018-04-24T22:04:47+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
创建容器并挂载:
[root@linux-node1 ~]# docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
539117dd17f9a64b0f61b966106a5145a70dbc8b26c9271de4d4606906270a88
[root@linux-node1 ~]# docker exec -it nginx-test /bin/bash
root@539117dd17f9:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@539117dd17f9:/# ls /usr/share/nginx/html
50x.html index.html
[root@linux-node1 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html
删除容器后 容器中的数据还在:
[root@linux-node1 ~]# docker rm -f $(docker ps -a -q)
539117dd17f9
4dea3165dc92
aa6eca60fec7
3f09c0c224c4
0afaa0391d28
ec769b13e462
52a7ae4c6506
[root@linux-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@linux-node1 ~]# ls /var/lib/docker/volumes/
metadata.db nginx-vol
[root@linux-node1 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html index.html
创建容器指定端口并测试数据的持久化:
[root@linux-node1 ~]# docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html -p 88:80 nginx
19fcbb7a88e293eb64160a68e4b6e7534ec8aeafd5903dcb6bc61ceccb5531f2
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19fcbb7a88e2 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp nginx-test
[root@linux-node1 _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@linux-node1 _data]# ls
50x.html index.html test.html
[root@linux-node1 _data]# cat test.html
<h1>hello docker!</h1>
测试:
http://10.0.0.80:88/test.html
hello docker!
创建容器指定端口并挂载已有的数据卷:
[root@linux-node1 ~]# docker run -d -it --name=nginx-test2 --mount src=nginx-vol,dst=/usr/share/nginx/html -p 89:80 nginx
b2163f6bc72a95f660a2882062bc780f94f165dc75bab6ff7d454f63084a15ba
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2163f6bc72a nginx "nginx -g 'daemon of…" 2 seconds ago Up 1 second 0.0.0.0:89->80/tcp nginx-test2
19fcbb7a88e2 nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:88->80/tcp nginx-test
测试:
http://10.0.0.80:89/test.html
hello docker!
创建很多容器而同用一个数据卷,实现数据共享,显示很强的扩展能力。
不指定数据卷名则会创建匿名数据卷:
[root@linux-node1 ~]# docker run -d -it --name=nginx-test3 --mount src=,dst=/usr/share/nginx/html -p 90:80 nginx
4fed85b0e5bf08e2ec767a42cca9529e080f81182faaba69db526a418152ef53
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fed85b0e5bf nginx "nginx -g 'daemon of…" 2 seconds ago Up 1 second 0.0.0.0:90->80/tcp nginx-test3
b2163f6bc72a nginx "nginx -g 'daemon of…" 7 minutes ago Up 7 minutes 0.0.0.0:89->80/tcp nginx-test2
19fcbb7a88e2 nginx "nginx -g 'daemon of…" 14 minutes ago Up 14 minutes 0.0.0.0:88->80/tcp nginx-test
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local ef852068aee3f245da147b070e483e4b3bdb32478118fb1e38b310442ab2c6e8
local nginx-vol

用数据卷创建一个容器并挂载宿主机指定目录:
[root@linux-node1 ~]# docker rm -f $(docker ps -a -q)
4fed85b0e5bf
b2163f6bc72a
19fcbb7a88e2
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local ef852068aee3f245da147b070e483e4b3bdb32478118fb1e38b310442ab2c6e8
local nginx-vol
[root@linux-node1 ~]# mkdir -p /opt/wwwroot
[root@linux-node1 ~]# docker run -d -it --name=nginx-test --mount type=bind,src=/opt/wwwroot,dst=/usr/share/nginx/html nginx
40d9dd961489ada44d2bc11edc397ef5b692728806589635a9c6d2957507ba06
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40d9dd961489 nginx "nginx -g 'daemon of…" 6 seconds ago Up 6 seconds 80/tcp nginx-test
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local ef852068aee3f245da147b070e483e4b3bdb32478118fb1e38b310442ab2c6e8
local nginx-vol
查看:
[root@linux-node1 ~]# docker exec -it nginx-test bash
root@40d9dd961489:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@40d9dd961489:/# mount
/dev/sda3 on /usr/share/nginx/html type xfs (rw,relatime,attr2,inode64,noquota)
。。。
root@40d9dd961489:/# ls /usr/share/nginx/html/
测试:
[root@linux-node1 wwwroot]# pwd
/opt/wwwroot
[root@linux-node1 wwwroot]# touch index.html
[root@linux-node1 wwwroot]# ls
index.html
root@40d9dd961489:/# ls /usr/share/nginx/html/
index.html
2.容器部署LNMP网站平台实践

[root@linux-node1 ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@linux-node1 opt]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
[root@linux-node1 opt]# ls -lh wordpress-4.7.4-zh_CN.tar.gz
-rw-r--r-- 1 root root 8.2M Apr 23 2017 wordpress-4.7.4-zh_CN.tar.gz
https://hub.docker.com/_/mysql/
(1)自定义网络:
[root@linux-node1 ~]# docker network create lnmp
a9181a8c22a0413bfdc236e827d141a54ca4b943e625aa11a1981ed33d337230
说明:可删除和查看。
[root@linux-node1 ~]# docker rm -f lnmp_mysql
lnmp_mysql
[root@linux-node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
061550bde5c9 bridge bridge local
c6290c433e26 host host local
a9181a8c22a0 lnmp bridge local
9004adeec394 none null local
(2)创建mysql数据库容器:
[root@linux-node1 ~]# docker run -itd --name lnmp_mysql --net lnmp -p 3306:3306 --mount src=mysql-vol,dst=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql --character-set-server=utf8
说明:查看创建的数据卷mysql-vol。
[root@linux-node1 ~]# docker volume ls
DRIVER VOLUME NAME
local ef852068aee3f245da147b070e483e4b3bdb32478118fb1e38b310442ab2c6e8
local mysql-vol
local nginx-vol
说明:查看mysql进行初始化时生成的系统的数据库:
[root@linux-node1 ~]# ls /var/lib/docker/volumes/mysql-vol/_data/
auto.cnf binlog.index client-cert.pem ibdata1 ibtmp1 performance_schema server-cert.pem undo_001
binlog.000001 ca-key.pem client-key.pem ib_logfile0 mysql private_key.pem server-key.pem undo_002
binlog.000002 ca.pem ib_buffer_pool ib_logfile1 mysql.ibd public_key.pem sys
[root@linux-node1 ~]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87ece7c0f243 mysql "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp lnmp_mysql
[root@linux-node1 ~]# docker logs lnmp_mysql
。。。
[root@linux-node1 ~]# docker top lnmp_mysql
UID PID PPID C STIME TTY TIME CMD
polkitd 6945 6933 0 23:31 pts/0 00:00:04 mysqld --character-set-server=utf8
(3)创建所需数据库:
[root@linux-node1 ~]# docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e"create database wp"'
mysql: [Warning] Using a password on the command line interface can be insecure.
说明:从当前的命令解释器向容器中发送命令,执行mysql创建数据库。
安装一个客户端:
[root@linux-node1 ~]# yum install -y mysql
[root@linux-node1 ~]# mysql -h10.0.0.80 -uroot -p
Enter password:
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory
docker run -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -d mysql --default-authentication-plugin=mysql_native_password
mysql -uroot --protocol tcp
(4)创建php环境容器:
[root@linux-node1 ~]# mkdir -p /app/wwwroot
[root@linux-node1 ~]# docker run -itd --name lnmp_web --net lnmp -p 88:80 --mount type=bind,src=/app/wwwroot,dst=/var/www/html richarvey/nginx-php-fpm
[root@linux-node1 ~]# echo $?
0
[root@linux-node1 opt]# tar -xf wordpress-4.7.4-zh_CN.tar.gz -C /app/wwwroot/
[root@linux-node1 opt]# ls /app/wwwroot/ //原来本应有index.html?
wordpress
(5)
http://10.0.0.80:88/
http://10.0.0.80:88/wordpress
浙公网安备 33010602011771号