docker容器間通信 (共用宿主機)


      容器之間可以通過 IP、Docker DNS Server 或者 joined 容器這三種方式進行通信

     本文討論同一宿主機下不同docker容器間IP和DNS Server通信的解決方案,比如宿主機下PHP的web服務容器需要連接mysql容器就會用到接下來說的方法。

     正常情況下,我們安裝完docker會創建一個默認網橋docker0    

#手動安裝brctl命令 [root@new2 dockerfile]# brctl show bridge name bridge id STP enabled interfaces br-72a0e7df683d        8000.0242ea904416 no br-8c32615c1dea        8000.0242723a4063 no vethe3eb576 vethfa75006 docker0 8000.0242e12e8e06    no    

  同是docker安裝后會默認創建三個網絡:bridge/host/name,其中bridge模式是docker默認使用的網絡

[root@new2 dockerfile]# docker network ls NETWORK ID NAME DRIVER SCOPE 350b170c0117 bridge bridge local 8610e4eb9359 host host local f8d2652c4dec none null local

Docker四種網絡工作模式: #host:容器將不會虛擬出自己的網卡,配置自己的IP等,而是使用宿主機的IP和端口,使用--net=host指定; #Container:創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、端口范圍,使用 --net=container:NAME_or_ID指定; #None:關閉了容器的網絡功能,使用--net=none指定; #Bridge:為每一個容器分配、設置IP等,並將容器連接到一個docker0虛擬網橋,通過docker0網橋以及Iptables nat表配置與宿主機通信,使用--net=bridge指定,默認設置;

 

docker容器間通信可以使用link和bridge網橋,不過link后期可能要被移除,官方也不推薦使用。

https://docs.docker.com/network/links/

這里主要說自定義bridge網絡來實現容器間通信

docker1.10版本開始內嵌一個DNS server,方便容器間通過“”容器名“通信。使用默認的bridge網絡,不能通過DNS server實現容器名通信,不過我們可以使用自定義bridge網絡來實現。

  首先看下使用默認bridge網橋配置的容器通信情況:

  

#這里指定80端口,因為鏡像創建時,已指定需要通過80端口訪問容器
[root@new2 ~]# docker run -d -p 80 --name="centos_default_bridge" mycentos_from_dockerfile:v2 /bin/bash
703d2d4cb2cec56f4c539fa2dbe687c0b91be8cd2c50de76086bdc665a185366
[root@new2 ~]# docker run -d -p 80 --name="centos_default_bridge2" mycentos_from_dockerfile:v2 /bin/bash
8103a5b3ab458de4cb2c94faae407f1db3cea20050611e0847492b2605c1ee33

#看下centos_default_bridge2配置,IP地址為:172.17.0.2
[root@new2 ~]# docker inspect centos_default_bridge2
#進入centos_default_bridge容器
[root@new2 ~]# docker exec -it centos_default_bridge /bin/bash
#在centos_default_bridge容器通過IP來ping容器centos_default_bridge2網絡暢通
root@703d2d4cb2ce:/# ping 172.17.0.2            
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.056 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.054 ms
^C
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.048/0.052/0.056/0.007 ms
#切換成centos_default_bridge2來ping,網絡不通
root@703d2d4cb2ce:/# ping centos_default_bridge2 
ping: unknown host centos_default_bridge2

 

下面新建一個自定義網絡centos_expose_bridge,新增兩個容器指定使用自定義網絡配置

[root@new2 dockerfile]# docker network create -d bridge centos_expose_bridge
[root@new2 dockerfile]# docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
350b170c0117        bridge                 bridge              local
8c32615c1dea        centos_expose_bridge   bridge              local
72a0e7df683d        dnmp_default           bridge              local
8610e4eb9359        host                   host                local
f8d2652c4dec        none                   null                local

#基於同一鏡像創建指定網絡的容器,--network-alias是設置網絡別名,ping命令可以使用name參數或network-alias參數
[root@new2 dockerfile]# docker run -d --name centos_bridge --network centos_expose_bridge --network-alias alias_1 mycentos:v2 /bin/bash
[root@new2 dockerfile]# docker run -d --name centos_bridge2 --network centos_expose_bridge --network-alias alias_2 mycentos:v2 /bin/bash
[root@new2 dockerfile]# docker network inspect centos_expose_bridge
[
    {
        "Name": "centos_expose_bridge",
        "Id": "8c32615c1dea401220d12dfd7720171f32f1bacc057977c560cac27c91725738",
        "Created": "2020-07-11T17:18:21.824462131+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "37d696620875695a73936b39c62fd3eac191683f89f5da701a11f4ea9e37b45e": {
                "Name": "docker_expose",
                "EndpointID": "d5525bf34381dc4d6b77649e1e28d61c90af86f08855c5830f4907e53bf74fc1",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "94c0b5178358def497bdad5d74ca609c2456309feeb111979217d3944d1c6ba2": {
                "Name": "docker_expose2",
                "EndpointID": "3ef1e63cbc1bbacc97b2375d81d83564a4a85c38fc72d12767181ba71031a652",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

 

#進入其中centos_expose容器ping一下centos_expose2容器,可見是可以直ping容器名的
[root@new2 ~]# docker exec -it docker_expose /bin/bash
root@37d696620875:/# ping docker_expose2
PING docker_expose2 (172.19.0.3) 56(84) bytes of data.
64 bytes from docker_expose2.centos_expose_bridge (172.19.0.3): icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from docker_expose2.centos_expose_bridge (172.19.0.3): icmp_seq=2 ttl=64 time=0.054 ms

#容器的hosts文件並沒有centos_expose2映射配置
root@37d696620875:/# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.19.0.2    37d696620875

#再看下DNS服務解析配置,可見指向127.0.0.11地址,使用默認bridge網絡的容器在resolv.conf不會出現該地址
root@37d696620875:/# cat /etc/resolv.conf 
nameserver 127.0.0.11
options timeout:1 rotate ndots:0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM