1.介紹

Docker container網絡模式是指指定新創建的Docker容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。

使用Docker container網絡模式新建的容器不會創建的自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口等。然而兩個容器除了網絡方面,其它的如文件系統、進程信息等還是彼此獨立的。

2.原理

8-Docker模式之container_docker

3.樣例

-->新建一個Docker容器

命令:

docker run -itd --name alpine1 alpine:latest /bin/sh

[root@centos79 ~]# docker run -itd --name alpine1 alpine:latest /bin/sh
5ff376a66567842eec668724e38c7866c520e3bfad8b00cded061bfbade14969
[root@centos79 ~]# docker ps 
CONTAINER ID   IMAGE           COMMAND     CREATED          STATUS          PORTS     NAMES
5ff376a66567   alpine:latest   "/bin/sh"   37 seconds ago   Up 36 seconds             alpine1
[root@centos79 ~]#

-->基於Docker apline1容器,使用Docker container網絡模式,再創建一個Docker容器

命令:

docker run -itd --network container:alpine1 --name alpine2 alpine:latest /bin/sh

[root@centos79 ~]# docker run -itd --network container:alpine1 --name alpine2 alpine:latest /bin/sh
b0590126bc3cd8d4f49e05cd2f07c0efb1846a5478c986994fd796feab3ccc95
[root@centos79 ~]# docker ps 
CONTAINER ID   IMAGE           COMMAND     CREATED         STATUS         PORTS     NAMES
b0590126bc3c   alpine:latest   "/bin/sh"   8 seconds ago   Up 7 seconds             alpine2
5ff376a66567   alpine:latest   "/bin/sh"   3 minutes ago   Up 3 minutes             alpine1
[root@centos79 ~]#

-->查看alpine1/2容器的IP地址

alpine1:

[root@centos79 ~]# docker exec -it alpine1 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ #

alpine2:

[root@centos79 ~]# docker exec -it alpine2 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ #

可以看出兩個容器共用一個網絡和IP地址

-->停止alpine1容器網絡,查看alpine2容器網絡

[root@centos79 ~]# docker stop alpine1
alpine1
[root@centos79 ~]# docker exec -it alpine1 /bin/sh
Error response from daemon: Container 5ff376a66567842eec668724e38c7866c520e3bfad8b00cded061bfbade14969 is not running
[root@centos79 ~]# docker exec -it alpine2 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
/ #

由於Docker alpine1容器停止,網絡關係也就隨即彼此解除,alpine2容器的網絡也就斷開。

-->啓動alpine1容器網絡,查看alpine2容器網絡

[root@centos79 ~]# docker start alpine1
alpine1
[root@centos79 ~]# docker exec -it alpine1 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ # exit
[root@centos79 ~]# docker exec -it alpine2 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
/ # exit
[root@centos79 ~]# docker stop alpine2
alpine2
[root@centos79 ~]# docker start alpine2
alpine2
[root@centos79 ~]# docker exec -it alpine2 /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
/ #

當Docker alpine1容器啓動,alpine2容器需要重啓,alpine2容器和alpine2容器的網絡關係才能建立。