1、默认模式:桥接模式

部署好docker服务启动之后,就会创建一个虚拟网桥,docker0.这是虚拟的网络设备,类似于交换机。

每一次运行容器之后,docker0就会从网段当中分配一个ip地址给这个容器。

容器与主机之间通信:通过桥接模式进行。

容器与容器之间通信:多个容器都在同一网段,都在同一网桥,可以通过自己的ip地址进行通信。

桥接模式:连接两个不同网络段的设备。共享通信的方式。

172.17 路由器 192.168

基于mac地址转发数据帧

当172.17------192.168 桥接设备查看目标mac地址

路由器做ARRP广播。如果在mac地址表,桥接设备直接把数据帧转发到目标的相应接口

如果不在,ARP广播,所有接口都会收到数据报文,有则响应,无则丢弃

桥接模式在物理层和数据链路层工作,学习和转发mac地址,用于局域网内部的连接和扩展。

vethpair 方式生成一个对应容器的虚拟网卡

docker网桥是宿主机虚拟出来的,并不是真正的网络设备。外部是没有办法通过寻址找到的。

也是客户端是无法直接访问容器的ip地址。

如果希望外部网络能够访问,要通过映射容器的端口到宿主机

容器要保持一直运行必须要指定有一个运行的程序。nginx镜像当中声明好了运行程序nginx -g “daemon off”保持nginx一直在后台运行。-itd不加d就是前台运行展示运行结果。

桥接模式的宿主机和容器之间的端口映射实际上是做了nat一个地址转换,容器的私有ip映射到主机的ip上,从而实现容器与外部网络的通信。隐藏了容器内部的真实ip地址。

2、docker基于桥接模式的网络类型:

①、host模式:

容器不会虚拟出自己的网卡,也不会配置自己的ip,容器全部使用宿主机的ip和端口。

用于端口不重复的类型应用。docker本身是单节点模式,适用于部署单个服务的应用程序。

#用host模式创建两个nginx
[root@docker1 ~]# docker run -itd --name nginx1 --network host nginx:1.22
33b94e066c37e6a3b5a44494073a5a4a958ffe09b0284f19254b3c0753d75fd5
[root@docker1 ~]# docker run -itd --name nginx2 --network host nginx:1.22
78784c530d8afae20278494d01894ace8918c878deb7fd755741de077b46a94b
#后创建的会因端口被占用无法启动,因为host模式使用的是宿主机的ip和端口。
[root@docker1 ~]# docker ps -a
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS                              PORTS     NAMES
78784c530d8a   nginx:1.22   "/docker-entrypoint.…"   4 seconds ago   Exited (1) Less than a second ago             nginx2
33b94e066c37   nginx:1.22   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes                                  nginx1
​
#查虚拟ip
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
​
#没有虚拟的IP地址
两个同时用host模式时,端口被占用会有一个起不来
②、container模式

容器和容器之间共用一个network namespace 不是和宿主机共享。

新创建的容器也不会有自己的网卡,也不会配置自己的ip,而是和一个指定的容器共享ip和端口。除了网络之外,其他的比如文件系统等等都是隔离的。

[root@docker1 ~]# docker run -itd --name test1 centos:7 /bin/bash
a00ac73bfe74aef957f3fb3967935877b70269c60c8ee1533a8e7735f06e0a0f
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test1
172.17.0.2
[root@docker1 ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
7073fcb03fac3710c8e970390de7fd03519688905443ddb6662873bbbd1c0b9b
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test2
​
#没有虚拟地址
​
[root@docker1 ~]# docker inspect -f '{{.State.Pid}}' test1
23454
[root@docker1 ~]# docker inspect -f '{{.State.Pid}}' test2
23536
[root@docker1 ~]# ls -l /proc/23454/ns
总用量 0
lrwxrwxrwx. 1 root root 0 8月  13 11:18 ipc -> ipc:[4026532517]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 mnt -> mnt:[4026532515]
lrwxrwxrwx. 1 root root 0 8月  13 11:15 net -> net:[4026532520]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 pid -> pid:[4026532518]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 uts -> uts:[4026532516]
[root@docker1 ~]# ls -l /proc/23536/ns
总用量 0
lrwxrwxrwx. 1 root root 0 8月  13 11:18 ipc -> ipc:[4026532650]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 mnt -> mnt:[4026532648]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 net -> net:[4026532520]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 pid -> pid:[4026532651]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 8月  13 11:18 uts -> uts:[4026532649]
​
③、none模式

创建容器之后,容器会有自己的网络命名空间,但是不会进行任何网络的配置。

没有网卡、也没有ip、也没有端口。只有本地的LO的回环网络。没有办法进行联网。网络是封闭的,一般用于内部调试。

[root@docker1 ~]# docker run -itd --name nginx1 --net=none nginx:1.22
85077ccd867efc756a1167434ed2fcaee4ffd73e1ee5483a8a082de1058d79c2
[root@docker1 ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS         PORTS     NAMES
85077ccd867e   nginx:1.22   "/docker-entrypoint.…"   5 seconds ago   Up 3 seconds             nginx1
#查ip地址
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
​
#也没有ip地址
​
④、自定义网络

和桥接模式一样,只不过我们可以自定义容器的网段和给新创建的容器指定ip地址。

只有自定义网络才可以在创建容器时指定ip地址。

#分配ip地址只能是自定义模式,其他模式都不能指定ip
[root@docker1 ~]# docker run -itd --name test1 --network bridge --ip 172.17.0.10 nginx:1.22
01a36faf126a8c4e99d2bff9e42ddcc13bb87169f3e52c522d42d7fc2c1f6b03
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
#查看网络类型
[root@docker1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e577b87d73d8   bridge    bridge    local
ff5245bdb65f   host      host      local
4fac89f9eae7   none      null      local
​
#创建自定义网络
[root@docker1 ~]# docker network create --subnet=172.111.0.0/16 wblnetwork
7075d2fc42bb6627848352a239e29f6ee949f0fc5ca36d8de370bba99edbd0e6
#创建自定义网络时指定网卡的名称    
[root@docker1 ~]# docker network create --subnet=172.112.0.0/16 --opt "com.docker.network.bridge.name"="docker1" wblnetwork2
40b6b4d4f482fde0d23b8dd4d293c7ad94d8b1f16a390721ed53a2c95b0e7a16
#查看自定义网络(创建时没指定网卡名称)
[root@docker1 ~]# ifconfig 
#没指定网卡名称
br-7075d2fc42bb: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.111.0.1  netmask 255.255.0.0  broadcast 172.111.255.255
        ether 02:42:d3:22:37:ba  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#指定了网卡名称
docker1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.112.0.1  netmask 255.255.0.0  broadcast 172.112.255.255
        ether 02:42:3e:43:17:61  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
#查看网络类型
[root@docker1 ~]# docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
e577b87d73d8   bridge        bridge    local
ff5245bdb65f   host          host      local
4fac89f9eae7   none          null      local
7075d2fc42bb   wblnetwork    bridge    local
40b6b4d4f482   wblnetwork2   bridge    local
#创建容器时指定ip地址
[root@docker1 ~]# docker run -itd --name nginx1 --net wblnetwork --ip 172.111.0.10 -p 88:80 nginx:1.22
8fca013db3bec879c03851fbbbf69dd02db3cc6bc4112c7ef67a69da9ac3cdaa
​

3、总结:

1、docker的网络模式就是桥接模式

host :宿主机共享网络 常用

container:模式 容器之间共享

none模式: 无网络模式,单机模式

自定义网路 :只有自定义网络可以在创建容器的时候指定ip地址。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐