前言
使用容器时会产生一些日志或其他文件,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这样就会涉及容器的数据管理操作。
容器中管理数据主要有两种方式: **1. 数据卷 ** 2. 数据卷容器
数据卷:挂载宿主系统的存储空间
数据卷容器:挂载容器的存储空间
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器,数据卷容器其实是一个普通的容器,专门用来提供数据卷供其它容器挂载
一:数据卷与容器操作
1.1:挂载宿主系统
-
docker run -it -v /宿主机绝对路径:/容器内目录:权限 镜像名
权限: ro (容器只能查看)
-
宿主机目录/opt/test 挂载容器中的/data
[root@docker ~]# docker run -v /opt/test:/data1 --name web1 -it centos /bin/bash '//挂载时候,-v 指定的宿主机目录是会自动创建的'
-
测试:
容器/data目录创建文件test.txt
[root@019f72a54143 /]# cd data1/ [root@019f72a54143 data]# echo "this is test" > test.txt [root@019f72a54143 data]# exit exit
宿主机查看是否同步了文件
[root@docker ~]# cat /opt/test/test.txt this is test
1.2:数据卷容器操作
-
创建数据卷容器test100
[root@docker ~]# docker run --name test100 -v /data1 -v /data2 -it centos /bin/bash [root@dc17da399a27 /]# exit exit
-
创建新容器test200并挂载数据卷容器目录
[root@docker ~]# docker run -it --volumes-from test100 --name test200 centos:7 /bin/bash [root@bb8ac2d5b929 /]#
-
测试
创建测试文件
[root@bb8ac2d5b929 /]# ls anaconda-post.log data1 dev home lib64 mnt proc run srv tmp var bin data2 etc lib media opt root sbin sys usr [root@bb8ac2d5b929 /]# echo "this is test1" > /data1/test1 [root@bb8ac2d5b929 /]# echo "this is test2" > /data2/test2 [root@bb8ac2d5b929 /]# exit exit
进入数据卷容器test100测试
[root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb8ac2d5b929 centos:7 "/bin/bash" 3 minutes ago Exited (0) 29 seconds ago test200 dc17da399a27 centos "/bin/bash" 7 minutes ago Exited (0) 6 minutes ago test100 019f72a54143 centos "/bin/bash" 21 minutes ago Exited (0) 20 minutes ago web1 [root@docker ~]# docker start dc17da399a27 dc17da399a27 [root@docker ~]# docker exec -it dc17da399a27 /bin/bash [root@dc17da399a27 /]# ls bin data2 etc lib lost+found mnt proc run srv tmp var data1 dev home lib64 media opt root sbin sys usr [root@dc17da399a27 /]# cat /data1/test1 this is test1 [root@dc17da399a27 /]# cat /data2/test2 this is test2 [root@dc17da399a27 /]#
二:端口映射
-
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因此我们需要手动进行设置端口映射
-
-p(小p):手动设置端口号
[root@docker ~]# docker run -d -p 1111:80 httpd:centos 1e07c582c28d5bf4d19d58a22231e27722649dfb80eb4698487bc11db8d85ade [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e07c582c28d httpd:centos "/run.sh" 14 seconds ago Up 14 seconds 0.0.0.0:1111->80/tcp youthful_poitras
-
-P(大p):随机指定端口号
[root@docker ~]# docker run -d -P httpd:centos 6d56706835008e43c7aafdfa5a6c3d9eaab99ad2f565287731979c2ccb91e3a2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6d5670683500 httpd:centos "/run.sh" 5 seconds ago Up 4 seconds 0.0.0.0:32768->80/tcp pensive_chaum
三:容器互联
-
创建并运行test001容器,端口号自动映射
[root@docker ~]# docker run -itd -P --name test001 centos /bin/bash 3a144d2a670cdecd8e1045d8dc051dfb5fb1c841216258a9fc113c7cbcb20032
-
创建并运行test002容器,连接到test001和其通信,端口号自动映射
[root@docker ~]# docker run -itd -P --name test002 --link test001:test001 centos /bin/bash d5a07b81b323edf619e9526f1828c8af560eef626dc550cef1a18d6daaa9b6b0
-
测试,进入test002,ping test001
[root@docker ~]# docker exec -it test002 /bin/bash [root@d5a07b81b323 /]# ping test001 PING test001 (172.17.0.5) 56(84) bytes of data. 64 bytes from test001 (172.17.0.5): icmp_seq=1 ttl=64 time=0.177 ms 64 bytes from test001 (172.17.0.5): icmp_seq=2 ttl=64 time=0.147 ms 64 bytes from test001 (172.17.0.5): icmp_seq=3 ttl=64 time=0.157 ms 64 bytes from test001 (172.17.0.5): icmp_seq=4 ttl=64 time=0.202 ms ^C --- test001 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 8ms rtt min/avg/max/mdev = 0.147/0.170/0.202/0.026 ms