天天看點

docker(六)容器間通信docker(六)容器間通信

文章目錄

  • docker(六)容器間通信
    • ip通信
    • Docker DNS Server
    • joined容器

docker(六)容器間通信

容器之間可以通過IP Docker DNS Server 或joined容器三種方式通信

ip通信

從前面的例子可以得出一個結論:兩個容器要能通信,必須有屬于同一個網絡的網卡 具體做法就是在容器建立的時候通過 --network 指定相應的網絡 或者通過docker network connect 将現有的容器加入到指定的網絡

#參考之前的rhel7-up和busybox的例子

##連接配接到網絡
docekr network connect my-net my-nginx
将一個容器的容器 my-nginx連接配接到一個正在運作的網絡 my-net上

#容器脫離網絡
docker network disconnect my-net my-nginx
将容器my-nginx從網絡my-net上斷開連接配接。
           

Docker DNS Server

通過IP通路容器雖然滿足了通信的需求,但是還是不夠靈活,因為在部署應用之前可能無法确定IP 部署之後再指定要通路的IP會比較麻煩

對于這個問題,可以通過docker 自帶的DNS服務解決

從docker1.10版本開始,docker daemon實作了一個内嵌的DNS server,使容器可以直接通過“容器名”通信,方法很簡單,隻要在啟動時用 --name為容器命名就可以了

bridge模式

[[email protected] ~]# docker run -it --network=my_net2 --name=bbox1 busybox
/ # ping bbox2
PING bbox2 (172.22.16.3): 56 data bytes
64 bytes from 172.22.16.3: seq=0 ttl=64 time=0.041 ms
64 bytes from 172.22.16.3: seq=1 ttl=64 time=0.047 ms
^C
--- bbox2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.041/0.044/0.047 ms

[[email protected] ~]# docker run -it --network=my_net2 --name=bbox2 busybox
/ # ping bbox1
PING bbox1 (172.22.16.2): 56 data bytes
64 bytes from 172.22.16.2: seq=0 ttl=64 time=0.057 ms
64 bytes from 172.22.16.2: seq=1 ttl=64 time=0.049 ms
^C
--- bbox1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.049/0.053/0.057 ms

# 使用docker DNS有個限制:隻能在user-defined網絡中使用 也就是說預設的bridge網絡是無法使用DNS的

[[email protected] ~]# docker run -it --name=bbox3 busybox/ # 
[[email protected] ~]# docker run -it --name=bbox4 busybox
/ # ping bbox3
^C
/ # ping bbox3
ping: bad address 'bbox3'


           

joined容器

另一種實作容器間通信的方式

joined容器非常特别,它可以使兩個或多個容器共享一個網絡棧 共享網卡和配置資訊,joined容器之間可以通過127.0.0.1 直接通信

先建立一個rhel7-up容器 名字為server1
[[email protected] ~]# docker run -it --name=server1 rhel7-up /bin/bash
bash-4.2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
48: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

然後建立busybox容器并通過 --network=container:server1 指定joined容器為server1 
[[email protected] ~]# docker run -it --network=container:server1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
48: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:2/64 scope link 
       valid_lft forever preferred_lft forever

#busybox和web1的網卡mac位址與IP完全一樣,它們共享了相同的網絡棧 busybox可以直接用127.0.0.1通路server1

"""
joined容器非常适合以下場景
1.不同容器中的程式希望通過loopback高效地通信 比如web server 與 App Server
2.希望監控其他容器的網絡流量 比如運作在獨立容器中的網絡監控
"""