docker网络
docker 容器互联
docker run 创建 Docker 容器时,可以用--net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:
docker 容器的网络基础
docker0:
安装 docker 的时候,会生成一个 docker0 的虚拟网桥
Linux 虚拟网桥的特点: 可以设置 ip 地址 相当于拥有一个隐藏的虚拟网卡
docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:28:ae:c0:42
brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever
每运行一个 docker 容器都会生成一个 veth 设备对,这个 veth 一个接口在容器里,一个接口在物理机上。
安装网桥管理工具:
yum install bridge-utils -y
brctl show可以查看到有一个 docker0 的网桥设备,下面有很多接口,每个接口都表示一个启动的
docker 容器,因为我在 docker 上启动了很多容器,所以 interfaces 较多,如下所示:
docker 容器的互联
下面用到的镜像的 dockerfile 文件如下:
cd dockerfile/inter-image vim dockerfile
FROM centos
RUN yum install wget -y RUN yum install nginx -y
RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf EXPOSE 80
CMD /bin/bash
[root@xianchaomaster1]# docker build -t="inter-image" .
允许所有容器间互联(也就是访问)第一种方法:
例:
(1)基于上面的 inter-image 镜像启动第一个容器 test1 docker run --name test1 -itd inter-image
进入到容器里面启动 nginx:
/usr/sbin/ngnx
(2)基于上面的 inter-image 镜像启动第二个容器 test2 docker run --name test2 -itd inter-image
(3)进入到 test1 容器和 test2 容器,可以看两个容器的 ip,分别是 172.17.0.20 和 172.17.0.21
docker exec -it test2 /bin/bash
ping 172.17.0.20 可以看见能 ping 同 test1 容器的 ip
curl http://172.17.0.20
可以访问到 test1 容器的内容
上述方法假如 test1 容器重启,那么在启动就会重新分配 ip 地址,所以为了使 ip 地址变了也可以访问可以采用下面的方法
docker link 设置网络别名第二种方法:
可以给容器起一个代号,这样可以直接以代号访问,避免了容器重启 ip 变化带来的问题 --link
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]
例:
1.启动一个 test3 容器
docker run --name test3 -itd inter-image /bin/bash
2.启动一个 test5 容器,--link 做链接,那么当我们重新启动 test3 容器时,就算 ip 变了,也没关系,我们可以在 test5 上 ping 别名
webtest
docker run --name test5 -itd --link=test3:webtest inter-image /bin/bash
3.test3 和 test5 的 ip 分别是 172.17.0.22 和 172.17.0.24
4.重启 test3 容器
docker restart test3
发现 ip 变成了 172.17.0.25
5.进入到 test5 容器
docker exec -it test5 /bin/bash
ping test3 容器的 ip 别名 webtest 可以 ping 通,尽管 test3 容器的 ip 变了也可以通
docker 容器的网络模式
docker run 创建 docker 容器时,可以用--net 选项指定容器的网络模式,Docker 有以下 4 种网络模式:
none 模式
Docker 网络none 模式是指创建的容器没有网络地址,只有 lo 网卡
[root@xianchaomaster1 ~]# docker run -itd --name none --net=none --privileged=true centos [root@xianchaomaster1 ~]#
docker exec -it none /bin/bash
[root@05dbf3f2daaf /]# ip addr #只有本地 lo 地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:
00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
container 模式
Docker 网络container 模式是指,创建新容器的时候,通过--net container 参数,指定其和已经存在的某个容器共享一个 Network Namespace。如下图所示,右方黄色新创建的 container,其网卡共享左边容器。因此就不会拥有自己独立的 IP,而是共享左边容器的 IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。
和已经存在的 none 容器共享网络
[root@xianchaomaster1 ~]# docker run --name container2 --net=container:none -it -- privileged=true centos
[root@05dbf3f2daaf /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:
00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
bridge 模式
默认选择 bridge 的情况下,容器启动后会通过 DHCP 获取一个地址
#创建桥接网络
[root@xianchaomaster1~]# docker run --name bridge -it --privileged=true centos bash
[root@a131580fb605 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
64: eth0@if65: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 172.17.0.13/16 brd 172.17.255.255 scope global
eth0
valid_lft forever preferred_lft forever
host 模式
Docker 网络host 模式是指共享宿主机的网络
#共享宿主机网络
[root@xianchaomaster1~]# docker run --name host -it --net=host --privileged=true centos bash
13 February 2026