前言:
我们知道在bridge模式下容器没有一个共有的ip,只有宿主机可
以进行直接访问,外部主机是不可见的,但是通过宿主机的NAT规则后
可以实现对外网的访问,本篇博客将深入了解到docker中的网络。
正文:
我们以ubuntu镜像作为实验
进行镜像的导入
[root@server2 docker镜像]# docker load -i ubuntu.tar ###进行镜像的导入
[root@server2 docker镜像]# docker images ###进行镜像的查看
进行镜像的查看
进行docker中容器网络的类型的查看(默认情况下使用的是桥接)
[root@server2 docker镜像]# docker network ls
[root@server2 docker镜像]# ip addr show
模式一:桥接模式
进行容器的运行
[root@server2 docker镜像]# docker run -it --name vm1 ubuntu ###进行容器的运行
root@6732c9485d7d:/# ip addr show ###在容器中进行网络的查看
进行桥接状态和网络ip的查看
[root@server2 docker镜像]# yum install bridge-utils -y ###进行工具软件的安装
[root@server2 docker镜像]# brctl show ###进行娇怯的查看
[root@server2 docker镜像]# ip addr show ###进行网络的查看
进行软件的安装
进行桥接的查看
进行网络的查看
通过设定使虚拟机可以上网,在容器中进行测试
[root@server2 docker镜像]# ping www.baidu.com ###进行网络的测试
[root@server2 docker镜像]# docker attach vm1 ###进行容器的进入
root@6732c9485d7d:/# ping www.baidu.com ###在容器中进行网络的测试
进行网络的测试
在容器中进行网络的测试
在桥接模式下,通过宿主机的NAT进行容器外网的连接
模式二:host模式
host模式下可以让容器共享宿主机网络栈,这样的好
处就是外部主机与容器直接通信,但是容器网络缺少
隔离性。
进行容器的建立
[root@server2 docker镜像]# docker run -it --name vm2 --network=host ubuntu ###进行容器的创建
root@server2:/# ping www.baidu.com ###进行网络ping接测试
[root@server2 docker镜像]# brctl show ###进行桥接状态的查看
在真机上进行桥接的查看
发现桥接并没有增加
在容器中进行网络的ping接
模式三:none模式指的是禁用网络功能,只有lo接口,该容器禁止与外网进行通信,
可以存储敏感的数据,例如,密码等。
进行none模式下容器的创建
[root@server2 docker镜像]# docker run -it --name vm3 --network=none ubuntu ###进行容器的创建
root@689cb8e4a3e9:/# ip addr show ###进行网络的查看
模式四:Container,处于该模式下的Docker容器会共享一个网络线,
这样两个容器之间可以使用localhost高效快速的进行通信。
进行容器的建立
[root@server2 docker镜像]# docker run -it --name vm4 --network=container:vm1 ubuntu ###进行容器的建立
root@6732c9485d7d:/# ip addr show ###进行网络的查看
在vm1中进行网络的查看
[root@server2 docker镜像]# docker attach vm1
root@6732c9485d7d:/# ip addr show
两个容器公用一个网络线实现通信。
link 实现两个容器之间使用容器名称可以进行通信
进行容器的建立
[root@server2 docker镜像]# docker run -it --name vm5 --link vm1:db1 ubuntu ###进行容器的建立
root@f2fd2e3efb5b:/# cat /etc/hosts ###进行解析的查看
进行容器之间互通的测试
root@f2fd2e3efb5b:/# ping vm1
root@f2fd2e3efb5b:/# ping db1
我们还可以定义自己的网段
进行自定义网段的创建
[root@server2 docker镜像]# docker network create my_net1 ###进行网段的创建
[root@server2 docker镜像]# docker network ls ###进行网络的查看
删除之前所有的容器,便于实验测试:
使用自定义网段进行容器的创建
[root@server2 docker镜像]# docker run -it --name vm1 --network=my_net1 ubuntu
root@0cca8d9e8e48:/# ping vm1 ###进行镜像ping接测试
使用该网段进行vm2容器的建立
[root@server2 docker镜像]# docker run -it --name vm2 --network=my_net1 ubuntu ###进行容器的建立
root@a81740e37c18:/# ping vm1 ###进行网络的ping接测试
我们发现,使用同一网段建立的容器可以实现直接通信
我们也可以自定义特定的网段
进行网段的设定
[root@server2 docker镜像]# docker network create --subnet=172.21.0.0/24 --gateway=172.21.0.1 my_net2 ###进行网段的设定
[root@server2 docker镜像]# docker network ls ###进行网络的查看
使用该网段进行容器的创建
[root@server2 docker镜像]# docker run -it --name vm3 --network=my_net2 --ip=172.21.0.10 ubuntu ###进行指定ip容器的建立
那么我们如何进行两个不同网桥之间的通信呢,使用docker network connect
命令为vm1添加一块my_net2的网卡,实现不同网桥之间的通信。
对vm3进行网卡的添加
[root@server2 docker镜像]# docker network connect my_net1 vm3 ###进行网卡的添加
[root@server2 docker镜像]# docker attach vm3
root@32c3803f754e:/# ping vm1 ###进行网络与vm1的ping接
两个不同网桥之间的容器实现了连通
跨主机网络解决方案macvlan网络方案的实现
我们选用server1和server2上创建的容器,使它们完成通信
在server1上进行网卡的添加
进行网络配置文件的编辑
[root@server1 docker镜像]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
进行网卡混杂模式的开启
[root@server1 network-scripts]# ip link set eth1 promisc on
在server2上进行网卡的添加
进行网络配置文件的编辑
[root@server2 network-scripts]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
进行网络混杂模式的开启
[root@server2 network-scripts]# ip link set eth1 promisc on
在server2上进行网络的创建
[root@server2 network-scripts]# docker network create -d macvlan --subnet=172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1 macvlan1 ###进行自定义网络的设定
[root@server2 network-scripts]# docker network ls
使用该设定的网段进行容器的创建
[root@server2 network-scripts]# docker run -it --name vm1 --network=macvlan1 --ip=172.22.0.10 ubuntu
在server1上进行镜像的导入
[root@server1 docker镜像]# docker load -i ubuntu.tar ###进行镜像的导入
进行网段的设定
[root@server1 network-scripts]# docker network create -d macvlan --subnet=172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1 macvlan1
使用该网段进行容器的建立并进行与server容器的ping接测试
[root@server1 docker镜像]# docker run -it --name vm3 --network=macvlan1 --ip=172.22.0.12 ubuntu
root@e902e2ccc97e:/# ping 172.22.0.11
Docker数据卷
docker数据卷
数据卷是目录或文件,不是块设备。
容器可以读写volume中的数据
volume数据可以持久化保存
docker提供了两种卷
bind mount
docker mananged volume
bind mount
是将主机上的目录或文件mount到容器中
便于理解
使用 -v 选项指定路径,
使用bind mount模式进行容器的建立
[root@server2 ~]# cd /opt/data/
[root@server2 data]# pwd
/opt/data
[root@server2 data]# echo www.redhat.com > index.html
[root@server2 data]# docker run -d --name vm1 -p 80:80 -v /opt/data/:/usr/share/nginx/html nginx ###进行容器的运行,并进行挂载源的指定和端口的设定
[root@server2 data]# curl localhost
[root@server2 data]# echo www.linux.com >> index.html
[root@server2 data]# curl localhost
[root@server2 data]# docker inspect vm1 ###进行该容器信息的查看
进行该容器信息的查看
bind mount 默认权限是读写rw,可以在挂载时候指定只读ro.
-v 选项指定的路径,如果不存在,挂载时会自动创建。
[root@server2 data]# docker run -it --name vm2 -v /opt/data/index.html:/data/index.html:ro ubuntu ###进行容器的运行,并且指定挂载目录
root@cb0a8f9a7342:/data# echo hellworld >> index.html ###进行文件内容的添加
docker managed volume模式:
在bind mount模式下,必须指定host文件系统路径,限制了移植性。
docker managed volume 不需要指定mount源.
在不指定源挂载目录的情况下进行容器的生成
[root@server2 data]# docker run -d --name vm1 -p 80:80 -v /usr/share/nginx/html nginx
[root@server2 data]# docker inspect vm1
在没有设定挂载的源目录时,系统会自动挂载在指定位置,如果挂载时指向已有
的目录,原有的数据会被复制到volume中
在系统默认挂载目录下进行测定
[root@server2 data]# cd /var/lib/docker/volumes/3797778a33d1f7d77625c911978ac0485f849083b79966b0a6fca6f32c6f9d7b/_data
[root@server2 _data]# ls
[root@server2 _data]# curl localhost
[root@server2 _data]# echo westos.com > index.html
[root@server2 _data]# curl localhost
进行数据卷的创建,使用指定的数据卷进行挂载
[root@server2 ~]# docker volume create vol1 ###进行数据卷进行创建
[root@server2 volumes]# docker run -it --name vm2 -v vol1:/data ubuntu
root@94f11599408c:/# cd /data/
root@94f11599408c:/data# touch files
使用该数据卷进行容器的创建,我们设定为只读
[root@server2 volumes]# docker run -it --name vm2 -v vol1:/data:ro ubuntu
root@9b4d554e4956:/# cd /data/
root@9b4d554e4956:/data# ls
root@9b4d554e4956:/data# rm -f files
bind mount 与docker managed volume的对比
相同点: 两者都是host文件系统中的某个路径
不同点:
bind mount | docker managed volume | |
volume位置 | 可以任意指定 | /var/lib/docker/volumes/.. |
对已有mount point影响 | 隐藏并替换为volume | 原有数据复制到volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写权限 | 可以设置为只读 |
移植性 | 移植性。与host path绑定 | 移植性强,无需指定host目录 |