在Docker中,为了方便查看容器中产生的数据或者将多个容器中的数据共享,就涉及到容器的数据管理操做。管理Docker容器中的数据主要有两种方式:数据卷(Date Volumes)和数据卷容器(Data Volumes Containers)。linux
数据卷是一个供容器使用的特殊目录,位于容器中,可将宿主机的目录挂载到数据卷上,对数据卷的修改操做马上可见,而且更新数据不会影响镜像,从而实现数据在宿主机和容器之间迁移。数据卷的使用相似于Linux下对目录进行的mount操做。web
在docker run命令中使用-v能够在容器内建立数据卷,也能够屡次-v从而建立多个数据卷,使用--name选项能够给容器建立一个自定义名称。下面建立一个叫test的容器,而且建立两个数据卷分别挂载到/data1和/data2目录上。docker
[root@master ~]# docker run -itd -v /data1 -v /data2 --name test 2850c25d855b /bin/bash ab19b153f1f9cb325685f340d30f4c11ecb918fd7e43df49554ba565d9ef681d [root@master ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS ab19b153f1f9 2850c25d855b "/bin/bash" 7 seconds ago Up 5 second
容器运行起来后,能够进入到容器中,能够看到两个数据卷已经分别挂载到/data1和/data2目录中。安全
[root@master ~]# docker exec -it ab19b153f1f9 /bin/bash root@ab19b153f1f9:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
在使用-v选项建立数据卷的同时,能够将宿主机的目录挂载到数据卷上使用,以实现宿主机与容器之间的数据迁移,注意宿主机本地目录的路径必须为绝对路径,若是路径不存在,Docker会自动建立相应的路径。bash
下面从新建立一个为test1的容器,并将宿主机的/abc/test挂载到容器的/data1目录中。注意这时我本地是没有abc这个目录的。网络
[root@master /]# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
下面开始建立tcp
[root@master /]# docker run -itd -v /abc/test:/data1 --name test1 2850c25d855b /bin/bash eb86e9da0e38410bdd5c1e40b3724c6277652eb70769ae336eaaca223fa4a945 [root@master /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb86e9da0e38 2850c25d855b "/bin/bash" 6 seconds ago Up 5 seconds test1 ab19b153f1f9 2850c25d855b "/bin/bash" 11 minutes ago Up 11 minutes test [root@master /]# ls abc boot etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@master /]# ls /abc/ test
下面测试在/abc/test目录下面建立abc.txt文件,而后到容器内查看/data1目录中,是否也有test.txt文件。ide
[root@master /]# cd /abc/test/ [root@master test]# touch abc.txt [root@master test]# docker exec -it eb86e9da0e38 /bin/bash root@eb86e9da0e38:/# cd /data1/ root@eb86e9da0e38:/data1# ls abc.txt
能够看到两边都会有abc.txt,一样咱们在容器中建立def.txt文件,再到宿主机中查看是否有def.txt文件。测试
root@eb86e9da0e38:/data1# touch def.txt root@eb86e9da0e38:/data1# exit exit [root@master test]# ls abc.txt def.txt
这样就实现了宿主机到容器和容器到宿主机的数据迁移,当咱们将容器中止运行甚至删除的时候,咱们建立的文件依旧不会消失。3d
[root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES eb86e9da0e38 2850c25d855b "/bin/bash" 6 minutes ago Up 6 minutes test1 ab19b153f1f9 2850c25d855b "/bin/bash" 18 minutes ago Up 18 minutes test [root@master test]# docker stop eb86e9da0e38 eb86e9da0e38 [root@master test]# docker rm eb86e9da0e38 eb86e9da0e38 [root@master test]# ls abc.txt def.txt
当须要在容器之间共享一些数据,最简单的方法使用数据卷容器。数据卷容器就是一个普通的容器,专门提供数据卷给其余容器挂载使用。首先须要建立一个容器做为数据卷容器,以后在其余容器建立时用--volumes-from挂载数据卷容器中的数据卷使用。
[root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ab19b153f1f9 2850c25d855b "/bin/bash" 27 minutes ago Up 27 minutes test #咱们在以前的操做中在这个容器中已经挂载了/data1和/data2数据卷
下面咱们再来建立一个web容器,使用--volumes-from将test容器的数据卷挂载到web容器中。
[root@master test]# docker run -itd --volumes-from test --name web 2850c25d855b /bin/bash 0da89589b4dae025a51bbe290f79ef6e9d7672bba2d8512d92cd69beeb762d24 [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0da89589b4da 2850c25d855b "/bin/bash" 4 seconds ago Up 3 seconds web ab19b153f1f9 2850c25d855b "/bin/bash" 30 minutes ago Up 30 minutes test
咱们咱们分别进入到web和test容器中,查看两边的数据卷容器。
[root@master test]# docker exec -it 0da89589b4da /bin/bash root@0da89589b4da:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
[root@master test]# docker exec -it ab19b153f1f9 /bin/bash root@ab19b153f1f9:/# ls bin data1 dev fastboot lib media opt root sbin srv tmp var boot data2 etc home lost+found mnt proc run selinux sys usr
咱们在web容器的/data1中建立abc.txt,而后到test容器/data1中查看是否生成这个文件。
root@0da89589b4da:/# cd /data1 root@0da89589b4da:/data1# touch abc.txt root@0da89589b4da:/data1# ls abc.txt root@ab19b153f1f9:/# cd /data1 root@ab19b153f1f9:/data1# ls abc.txt
能够看到两边都有abc.txt文件,经过这种方式实现了容器间的数据共享,这样的话用户就没必要担忧数据发生丢失。
Docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。
在启动容器的时候,若是不指定端口,在容器外将没法经过网络来访问容器内的服务。Docker提供端口映射及时来将容器内的服务提供给外网访问,实质上就是将宿主机的端口映射到容器中,使得外部网络访问宿主机的端口即可以访问容器内的服务。
为实现端口映射,须要在运行docker run命令时使用-P(大写)选项实现随机映射,Docker会随机映射一个端口范围在49000~49900的端口到容器内部开放的网络端口。这个根据容器须要才会打开宿主机端口。
[root@master test]# docker run -d -P 5182e96772bf35b134b4dbcd743bd229605197fcbf067063b8889808bb74d1b09d1e19863b2a
还能够运行-p(小写)指定映射端口。
[root@master test]# docker run -itd -p 80:80 2850c25d855b /bin/bash [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dcb873983873 2850c25d855b "/bin/bash" 3 seconds ago Up 1 second 0.0.0.0:80->80/tcp nervous_ptolemy
容器互联是经过容器名称在容器之间创建一条专门的网络通行隧道从而实现的互联。简单来讲就是在源容器和接受容器之间创建一条隧道,接受容器能够看到源容器指定的信息。在运行docker run命令时使用--link从而实现容器互联,格式为--link name:alias,其中name为要链接的容器名称,alias是这个链接的别名。首先建立源容器:
[root@master test]# docker run -itd -P --name web1 5182e96772bf /bin/bash b6d1f618f71083085f0646edee76fa7aa771bc8526c69424206c1c3f492c074c [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b6d1f618f710 5182e96772bf "/bin/bash" 2 seconds ago Up 1 second web1
建立接受容器
[root@master test]# docker run -itd -P --name web2 --link web1:web1 5182e96772bf /bin/bash d5b7ff409fa0f40931582fad8eb754771e811318132d5069dcf2231ff093f40c [root@master test]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d5b7ff409fa0 5182e96772bf "/bin/bash" 3 seconds ago Up 2 seconds web2 b6d1f618f710 5182e96772bf "/bin/bash" 29 seconds ago Up 28 seconds web1
测试容器互联
[root@master test]# docker exec -it web2 /bin/bash [root@d5b7ff409fa0 /]# ping web1 PING web1 (172.17.0.2) 56(84) bytes of data. 64 bytes from web1 (172.17.0.2): icmp_seq=1 ttl=64 time=0.107 ms 64 bytes from web1 (172.17.0.2): icmp_seq=2 ttl=64 time=0.085 ms ^C --- web1 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1000ms rtt min/avg/max/mdev = 0.085/0.096/0.107/0.011 ms
能够看到web2和web1创建了互联,至关于建立了一条安全隧道,并且不用映射端口,避免了暴露端口给外部网络。