Docker篇之四数据卷volume和四种网络模式
一、数据卷volume
1.单个容器添加数据卷volume
1.1 数据卷使用格式和举例
格式:docker run -v /datavolume:/data -it centos /bin/bash #-v参数: 宿主机目录/datavolum 容器内目录/data
如下例子:
[root@docker ~]# mkdir -p /tmp/test01/volume01/ #在宿主机上创建/tmp/test01/volume01/ 目录
[root@docker ~]# docker run -v /tmp/test01/volume01:/data -it centos /bin/bash #以centos为基础镜像,运行一个容器并直接进入容器;把宿主机的/tmp/test01/volume01 目录添加成改容器的/data 目录的数据卷
[root@76154c6898e0 /]# cd /data/ && touch aaa.txt #容器内,进入/data/目录,创建文件
[root@docker ~]# cd /tmp/test01/volume01/ && ll #容器外,另开终端,进入/tmp/test01/volume01/目录,可以看到创建的文件



[root@docker ~]# docker ps -a #找到刚刚的容器
[root@docker ~]# docker rm -f 76154c6898e0 #删除容器
1.2 为数据卷添加访问权限--ro(容器内只读权限)
[root@docker ~]# docker run --name="volume01" -v /tmp/test01/volume01:/data:ro -itd centos /bin/bash #运行一个名为“volume01”的容器,-v,宿主机/tmp/test01/volume01目录,容器的/data目录,且容器的/data/目录是ro只读。
[root@docker ~]# docker exec -ti volume01 /bin/bash #进入容器
[root@b8bd93fbf599 /]# cd /data/ && ls #查看容器中/data目录的文件
[root@b8bd93fbf599 data]# touch bbb.txt #手动创建文件失败,只读模式生效

在宿主机/tmp/test01/volume01目录下,创建ccc.txt文件,此时会同步到容器中
[root@docker ~]# cd /tmp/test01/volume01/ && touch ccc.txt


继续删除刚刚创建的容器
[root@docker ~]# docker rm -f b8bd93fbf599
2.用dockerfile构建容器,添加2个或多个数据卷volume
2.1 以centos为基础镜像,创建dockerfile文件
[root@docker ~]# mkdir -p /opt/volume/dockerfiles/ #宿主机上,创建/opt/volume/dockerfiles/目录
[root@docker ~]# cd /opt/volume/dockerfiles/ && vim dockerfile #进入目录,创建dockerfile文件
点击查看dockerfile文件的代码
FROM centos #以centos为基础镜像
VOLUME ["/tmp/test01/volume02","/tmp/test01/volume03"] #把2个目录挂到容器中,容器没有对应目录,则创建
CMD /bin/bash
2.2 在宿主机上创建dockerfile文件中定义的数据卷
[root@docker test01]# mkdir -p /tmp/test01/volume02 #创建对应目录
[root@docker test01]# mkdir -p /tmp/test01/volume03
2.3 进入dockerfile所在目录,构建新的镜像“volumebase”
[root@docker dockerfiles]# cd /opt/volume/dockerfiles/ #进入目录
[root@docker dockerfiles]# docker build -t="volumebase" . #构建新的镜像volumebase
[root@docker dockerfiles]# docker images | grep volume #查看构建的镜像成功
2.4 以“volumebase”为镜像,启动一个名为“double-volume”的容器
[root@docker dockerfiles]# docker run --name="double-volume" -itd volumebase
[root@docker dockerfiles]# docker exec -ti double-volume /bin/bash #进入容器
[root@d1adfa88f892 /]# cd /tmp/test01/ && ls #容器内进入和宿主机相同的目录,则数据卷添加成功

2.5 数据卷容器,以上面2.4中的volumebase镜像(这里面有2个数据卷),第一个容器通过这个镜像run起来,其他容器通过挂载第一个容器就可以实现数据共享
[root@docker test01]# docker images | grep volumebase #确定有这个镜像存在
[root@docker test01]# docker run --name="share-volume01" -itd volumebase #根据这个镜像,创建share-volume01容器
[root@docker test01]# docker run --name="share-volume02" --volumes-from share-volume01 -itd centos /bin/bash
2.5.1 另开一个终端,进入share-volume02容器内,进行验证
[root@docker dockerfiles]# docker exec -ti share-volume02 /bin/bash
[root@977bb6446454 /]# cd /tmp/test01/ && ls
[root@977bb6446454 test01]# cd volume02/ && touch 02aaa.txt

2.5.2 进入share-volume01容器内,进行验证
[root@docker test01]# docker exec -ti share-volume01 /bin/bash
[root@ecd7dd717859 /]# cd /tmp/test01/volume02/ && ls #可以看到刚才在容器2中创建的文件

3.数据卷的备份和还原(有点难,后续再写)
[========]
二、docker容器的互联
1、docker0的虚拟网桥
①docker0的虚拟网桥,是在宿主机上安装docker时生成的。
②虚拟网桥可以设置ip地址,相当于拥有一个虚拟的网卡。
③每运行一个docker容器,都会生成一个veth设备对,即这个veth设备对一个接口在容器里,一个接口在宿主机上。
2、安装网桥管理工具
[root@docker ~]# yum install -y bridge-utils
[root@docker /]# docker ps
[root@docker /]# brctl show #查看当前运行容器中,网桥和veth设备对的信息

3、docker容器之间的互联(容器之间的互相访问)的两种方式
方式一:多个容器基于同一个镜像run起来,进行容器之间的互联;
方式二:基于同一个镜像,在容器run时设置别名,以docker link设置别名,以别名进行容器之间的访问实现互联;(优点:ip改变也能访问)
3.1 方式一:基于同一个镜像,实现多容器之间的互联
步骤:
①dockerfile构建一个镜像“inter-con”;
②多个容器,基于“inter-con”镜像,运行起来;
3.1.1 使用dockerfile构建一个名为“inter-con” 镜像
[root@docker ~]# mkdir -p /opt/inter-con/dockerfiles/ #创建一个dockerfile文件所在目录
[root@docker ~]# cd /opt/inter-con/dockerfiles/ #进入该目录
[root@docker dockerfiles]# vim dockerfile #新建dockerfile文件
点击查看dockerfile文件中代码
FROM centos
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum install -y wget
RUN yum install -y nginx
#RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD /bin/bash
[root@docker dockerfiles]# docker build -t="inter-con" . #基于当前dockerfile文件,构建名为inter-con镜像
[root@docker dockerfiles]# docker images | grep inter

3.1.2 依次运行test01容器、test02容器
[root@docker dockerfiles]# docker run --name="test01" -itd inter-con #以守护式运行容器
[root@docker dockerfiles]# docker exec -ti test01 /bin/bash #进入容器
[root@01cb74434c12 /]# /usr/sbin/nginx -t #查看nginx的配置语法有没有问题
[root@01cb74434c12 /]# /usr/sbin/nginx #启动nginx服务
[root@01cb74434c12 /]# ps -ef | grep nginx #查看nginx是否启动成功

[root@docker dockerfiles]# docker run --name="test02" -itd inter-con
[root@docker dockerfiles]# docker exec -it test02 /bin/bash
[root@4a63badafa96 /]# /usr/sbin/nginx
[root@01cb74434c12 /]# ip -4 addr #容器test01的ip地址
[root@4a63badafa96 /]# ip -4 addr #容器test02的ip地址


[root@4a63badafa96 /]# curl http://172.17.0.3:80 #curl另一个http页面,成功

3.2 方式二:基于同一个镜像,在容器run时设置别名,实现多容器之间的互联
3.2.1 构建dockerfile镜像,和3.1.1 步骤一样
3.2.2 依次运行test03、test04容器,同时设置别名
[root@docker ~]# docker run --name="test03" -itd inter-con #正常run一个test03容器
[root@docker ~]# docker exec -it test03 /bin/bash #进入容器
[root@db5731f28e7d /]# /usr/sbin/nginx #启动nginx服务
[root@docker ~]# docker run --name="test04" --link=test03:webtest -itd inter-con #运行test04容器,设置别名
[root@docker ~]# docker exec -it test04 /bin/bash #进入test04容器
[root@84100375ff3b /]# ping webtest #ping别名,可以通
[root@84100375ff3b /]# curl http://webtest:80 #curl也可以通

(选做)
把之前启动的容器,删除。
扩展:自己可以尝试,在容器中设置多个域名,写入dockerfile中
三、容器的四种网络模式
3.1 容器的网络模式:bridge、host、none、container
1、none模式:容器没有网络地址,只有lo网卡。
2、container模式:创建新容器时,和之前的容器共享一个network name。不会有自己的IP,共享其他容器的。两个容器进程通过lo网卡设备通信。
3、bridge模式:容器启动后,dhcp获得地址。
4、host模式:共享宿主机的网络
3.2 四种网络模式的设置案例
3.2.1 none模式设置步骤
[root@docker dockerfiles]# docker run --name="test01-none" --net=none --privileged=true -itd centos #以centos为基础镜像,-itd参数,守护式运行,--net参数设置为none模式,--priviledged 开启特权模式
[root@docker dockerfiles]# docker exec -it test01-none /bin/bash #进入容器
[root@1a991f4cc097 /]# ip -4 addr #查看本地网卡信息

只有本地lo网卡信息
3.2.2 container模式设置步骤,共享刚刚test01-none容器的ip地址
[root@docker ~]# docker ps -a #查看当前的容器
[root@docker ~]# docker run --name="test02-container" --net=container:test01-none --privileged=true -itd centos #共享之前运行的容器test01-none
[root@docker ~]# docker exec -it test02-container /bin/bash
[root@1a991f4cc097 /]# ip -4 addr

这个是容器test02-container,共享test01-none容器的ip地址,因为test01-none容器中只有lo网卡,所以此时看到test02-container容器,也只有lo网卡。
3.2.3 默认不写--net参数,默认选择bridge参数。dhcp自动分配ip地址。
之前的操作都是如此,不记录了。
3.2.4 host模式:共享宿主机的网络
[root@docker ~]# docker run --name="test05-host" --net=host --privileged=true -itd centos
[root@docker ~]# docker exec -it test05-host /bin/bash
[root@docker /]# ip -4 addr

此时,容器test05-host中,没有自己的ip地址,显示的都是宿主机的IP信息。

浙公网安备 33010602011771号