Docker 支持四种网络模式
-
bridge
-net=bridge
默认网络,Docker启动后创建一个Linux的 docker0网桥,默认创建的容器也是添加到这个网桥中 -
host
-net=host
容器不会获得一个独立的 network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离。 -
none
-net=none
获取独立的 network namespace,但不为容器进行任何网络配置,需要我们手动配置。 -
container
-net=container:Name/ID
与指定的容器使用同一个 network namespace,具有同样的网络配置信息,两个容器除了网络,其他还是隔离的。 -
自定义网络
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名 或者 主机名容器之间网络通信。
bridge
ifconfig 查看一下
[root@izbp1izjo7pl5ccghnbdiuz ~]# ifconfig
---------------------------------------------------------------------------------
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 |
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 |
ether 02:42:c4:5e:de:d7 txqueuelen 0 (Ethernet) |
RX packets 24772 bytes 1477246 (1.4 MiB) |
RX errors 0 dropped 0 overruns 0 frame 0 |
TX packets 25231 bytes 59046133 (56.3 MiB) |
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
---------------------------------------------------------------------------------
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.57.19 netmask 255.255.240.0 broadcast 172.16.63.255
ether 00:16:3e:0b:5c:f3 txqueuelen 1000 (Ethernet)
RX packets 23061639 bytes 4276931592 (3.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23616033 bytes 4702130747 (4.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 2262 bytes 287264 (280.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2262 bytes 287264 (280.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
框中内的 就是 docker启动之后的网桥了。这个 inet 172.17.0.1 就是docker容器的网关,默认的方法 bridge创建的方法都会添加到这个网桥内。
我们进入到容器内进行查看
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -it busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
inet addr:172.17.0.3 就是来自 bridge分配的内网IP
–net=host
这个时候我们将 启动命令改成
docker run -it --net=host bushbox
这个就是直接的使用宿主机的网络命名空间,比如启动的是 nginx,那么我的80端口就会被占用
netstat -antp |grep 80
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 1 47.96.158.77:50582 121.29.54.199:80 LAST_ACK -
–net=none
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -it --net=none busybox
/ #
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
我们可以看到,网络的确是 有的,但就是没配置。
自己设置需要
ip ns 这个命令
–net=container
我们现在要做 的是创建,busybox容器。将他 和nginx容器共享网络空间,访问 busybox映射的地址 而 展示nginx
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -itd --name bs -p 99:80 busybox
b2b0e28f01965cdbbb076df69f21f50de1453c73998356c8e43a42e615231154
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -d --name nginx01 --net container:bs nginx
248c51c68628b6da03b197d017dad0166a17d7ebecde9e94392c2dd965afd8d1
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
248c51c68628 nginx "nginx -g 'daemon of…" 37 seconds ago Up 37 seconds nginx01
b2b0e28f0196 busybox "sh" 9 minutes ago Up 9 minutes 0.0.0.0:99->80/tcp bs
都在启动了 ok
此时的 99,就已经代表了 nginx的 80了。
进入 busybox 查看网络情况
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker exec -it bs sh
/ #
/ # netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 172.17.0.2:80 111.25.21.16:12958 TIME_WAIT -
/ #
自定义网络
docker run -it --name bs1 busybox
docker run -it --name bs2 busybox
# bs1
/ # hostname
71ae5b49348b
/ #
/ # ping bs2
ping: bad address 'bs2'
# bs2
/ # hostname
07e42ab41b5d
/ #
/ # ping bs1
ping: bad address 'bs1'
可以看到两个独立的容器之间是不会进行网络共享的。默认的 bridge
# 创建一个自己的网络
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker network create bs-test
642af1c223ad2a6a21b6c9bf80ce5f8da238b822bbd4b6144389bad2684cc748
# bs3
[root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -it --name bs3 --net bs-test busybox
/ #
/ # ping bs2
ping: bad address 'bs2'
/ #
/ # ping bs4
PING bs4 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.090 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.116 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.110 ms
# bs4
ping: bad address 'bs1'
/ # [root@izbp1izjo7pl5ccghnbdiuz ~]# docker run -it --name bs4 --net bs-test busybox
/ #
/ # ping bs3
PING bs3 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.091 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.099 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.147 ms