日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

Docker網(wǎng)絡模型以及容器通信詳解續(xù)篇_docker

作者:甜點cc ? 更新時間: 2022-12-24 編程語言

本篇接著上篇:【Docker0網(wǎng)絡及原理探究】,繼續(xù)深入探究容器網(wǎng)絡通信原理,通過學習Docker網(wǎng)路驅(qū)動模型,更好地解決容器間的通信問題????

1、Docker的網(wǎng)絡驅(qū)動模型

1.1、Docker的網(wǎng)絡驅(qū)動模型分類:

  1. bridge:Docker中默認的網(wǎng)絡驅(qū)動模型,在啟動容器時如果不指定則默認為此驅(qū)動類型;
  2. host:打破Docker容器與宿主機之間的網(wǎng)絡隔離,直接使用宿主機的網(wǎng)絡環(huán)境,該模型僅適用于Docker17.6及以上版本;
  3. overlay:可以連接多個docker守護進程或者滿足集群服務之間的通信;適用于不同宿主機上的docker容器之間的通信;
  4. macvlan:可以為docker容器分配MAC地址,使其像真實的物理機一樣運行;
  5. none:即禁用了網(wǎng)絡驅(qū)動,需要自己手動自定義網(wǎng)絡驅(qū)動配置;
  6. plugins:使用第三方網(wǎng)絡驅(qū)動插件;

1.2、Docker網(wǎng)絡模式

查看docker網(wǎng)絡?docker network ls

[root@--- ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
feafa30d4051   bridge    bridge    local
e8bf4fced9e2   host      host      local
6263db0933b9   none      null      local
[root@--- ~]# 

Docker內(nèi)置這三個網(wǎng)絡,運行容器時,你可以使用該--network標志來指定容器應連接到哪些網(wǎng)絡。

bridge網(wǎng)絡代表docker0所有Docker安裝中存在的網(wǎng)絡。除非你使用docker run --network=<NETWORK>選項指定,否則Docker守護程序默認將容器連接到此網(wǎng)絡。

我們在使用docker run創(chuàng)建Docker容器時,可以用?--net?選項指定容器的網(wǎng)絡模式,Docker可以有以下4種網(wǎng)絡模式

  • host模式:使用?--net=host?指定。
  • none模式:使用?--net=none?指定。
  • bridge模式:使用?--net=bridge?指定,默認設置。
  • container模式:使用?--net=container:NAME_or_ID?指定。
docker run -it -P --name tomcat01 --net=bridge tomcat  # 默認設置
docker run -it -P --name tomcat02 --net=none tomcat
# ...

2、容器通信問題

  • 由于不同容器通過veth pair連接在虛擬網(wǎng)橋docker0上,所以容器之間可以通過IP互相通信,但是無法通過容器名進行通信。docker0不支持容器名連接訪問
  • 默認網(wǎng)橋bridge上的容器只能通過IP互連,無法通過DNS解析名稱或別名。假如我們在container1中部署了Web服務,在container2中部署了mysql,container1中的Web服務往往需要連接container2的mysql,這是只能靠IP進行連接,但是docker也無法保證容器重啟后的IP地址不變,所以更好的方式是通過別名進行互聯(lián),在網(wǎng)絡中加入DNS服務器,將容器名與IP地址進行匹配,省去了手動修改Web服務中連接mysql的IP的過程。

為了實現(xiàn)不同容器通過容器名或別名的互連,docker提供了以下幾種:??

  • 在啟動docker容器時加入--link參數(shù),但是目前已經(jīng)被廢棄,廢棄的主要原因是需要在連接的兩個容器上都創(chuàng)建--link選項,當互連的容器數(shù)量較多時,操作的復雜度會顯著增加;
  • 啟動docker容器后進入容器并修改?/etc/hosts?配置文件(本地DNS解析),缺點是手動配置較為繁雜;
  • 用戶自定義bridge網(wǎng)橋,這是目前解決此類問題的主要方法,提供更好的隔離效果和更好的互通性(更好的隔離效果是針對外界網(wǎng)絡,而更好的互通性則是指同一bridge下的不同容器之間),用戶自定義bridge在容器之間提供了自動DNS解析。

容器在默認情況下以隔離方式運行,它們完全不知道同一計算機上有其他進程或容器。 那么,如何使容器能夠彼此通信? 答案就是網(wǎng)絡連接。 如果兩個容器在同一網(wǎng)絡上,那么它們可彼此通信。 如果沒在同一網(wǎng)絡上,則沒法通信。

3、容器之間通信的主要方式總結(jié)

3.1、通過容器ip訪問

容器重啟后,ip會發(fā)生變化。通過容器ip訪問不是一個好的方案。

3.2、通過宿主機的ip:port訪問

通過宿主機的ip:port訪問,只能依靠監(jiān)聽在暴露出的端口的進程來進行有限的通信。

3.3、通過--link建立連接(官方不推薦使用)

原理分析:

  • 運行容器時,指定參數(shù)link,使得源容器與被鏈接的容器可以進行相互通信,并且接受的容器可以獲得源容器的一些數(shù)據(jù),比如:環(huán)境變量。
  • /etc/hosts中的主機條目不同,如果重新啟動源容器,則不會自動更新存儲在環(huán)境變量中的IP地址。我們建議使用主機條目?/etc/hosts來解析鏈接容器的IP地址。
  • 除了環(huán)境變量之外,Docker還將源容器的主機條目添加到/etc/hosts文件中。(本質(zhì)上就是通過?--link?參數(shù),自動的給容器添加?hosts?配置)

--link建立連接步驟:?

啟動tomcat01,tomcat02

docker run -it -P --name tomcat01 tomcat
docker run -it -P --name tomcat02 tomcat

--link?通過配置?/etc/hosts?實現(xiàn)連接

通過link建立連接的容器,被鏈接的容器能 ping 通源容器,反過來不行。

被鏈接容器會繼承源容器的環(huán)境變量信息

建立link連接

tomcat02?容器 link 到?tomcat03?上

docker run -it -P --name tomcat03 --link tomcat02 tomcat

查看tomcat03 hosts配置

[root@--- ~]# docker exec -it tomcat03 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.17.0.3	tomcat02 099602f3ff7f #?--link命令配置生成的條目?
172.17.0.4	a20a10b7e728
[root@--- ~]# 

3.4、??通過 User-defined networks(推薦)

用戶自定義網(wǎng)橋步驟:?

創(chuàng)建用戶自定義bridge網(wǎng)橋

[root@--- ~]# docker network create test-network
799426d70aa28b73b4a777c85b338186eafadd1558b13c43e07a9fd9a8b545e7
[root@iZm5e23n3ueobwkjtfartxZ ~]# docker network ls
NETWORK ID     NAME           DRIVER    SCOPE
feafa30d4051   bridge         bridge    local
e8bf4fced9e2   host           host      local
6263db0933b9   none           null      local
799426d70aa2   test-network   bridge    local   #?創(chuàng)建的橋接網(wǎng)絡?

刪除網(wǎng)橋:?docker network rm test-network

把之前啟動的 mysql01,centos01,centos02 容器加入到自定義bridge網(wǎng)橋中:?connect

docker network connect test-network mysql01
docker network connect test-network centos01
docker network connect test-network centos02

查看自定義bridge網(wǎng)橋信息

docker network inspect 799426d70aa2
[
    {
        "Name": "test-network",
        "Id": "799426d70aa28b73b4a777c85b338186eafadd1558b13c43e07a9fd9a8b545e7",
        "Created": "2021-10-03T20:30:03.325679562+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",  #?test-network的子網(wǎng)?
                    "Gateway": "172.18.0.1"     #?test-network的網(wǎng)關(guān)?
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "29298987c51b777b546bf6626560020ce235e390e1d7fcfe188c6db228ca4edf": {
                "Name": "mysql01",
                "EndpointID": "a69560a1872a25af042c74132df5dcade6e0e93faf9102185c1de19f6c8b3b36",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",    #?mysql01 容器的IP,與之前不同?
                "IPv6Address": ""
            },
            "cb1922b95b9316d129b54f3545fad9729092926e10a1d5517f8928db42706151": {
                "Name": "centos01",
                "EndpointID": "f0cf5feb77ec23526fe5cee217dba9271125b9b4106c81bc7d58253ac48a4caf",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",    #?centos01 容器的IP,與之前不同?
                "IPv6Address": ""
            },
            "cc6f510b9765ba018dbafd416c9774ddf5fd3ff55fa992827f55516e8dc70b6a": {
                "Name": "centos02",
                "EndpointID": "6c88540d719014e441d3119c4388e62d311b07acf009106e16aa66d7ebaf5763",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",    #?centos02 容器的IP,與之前不同?
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

通過容器名或別名互連通信

進入centos01容器,ping centos02,?ping mysql01

可以發(fā)現(xiàn)centos01可以和centos02、mysql01容器之間可以通信

docker exec -it cb1922b95b93 /bin/bash??
[root@cb1922b95b93 /]# ping centos02??
PING centos02 (172.18.0.4) 56(84) bytes of data.
64 bytes from centos02.test-network (172.18.0.4): icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from centos02.test-network (172.18.0.4): icmp_seq=2 ttl=64 time=0.113 ms
...
ping mysql01??
PING mysql01 (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql01.test-network (172.18.0.2): icmp_seq=1 ttl=64 time=0.107 ms
64 bytes from mysql01.test-network (172.18.0.2): icmp_seq=2 ttl=64 time=0.103 ms
...

斷開網(wǎng)絡

由于我們的容器仍然連接著默認bridge網(wǎng)橋docker0,而現(xiàn)在我們已經(jīng)不需要它,所以應該將容器與docker0的連接斷開,執(zhí)行以下操作disconnect:

docker network disconnect bridge mysql01
docker network disconnect bridge centos01
docker network disconnect bridge centos02

查看默認bridge網(wǎng)橋docker0的容器網(wǎng)絡配置

docker network inspect feafa30d4051??
[
    {
        "Name": "bridge",
        "Id": "feafa30d4051f24353508959bd420fd163ad0c98d6b30ec8ff13b59a59552bb1",
        "Created": "2021-09-26T15:10:27.167774553+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},    #?之前的容器服務,已經(jīng)從默認網(wǎng)橋中移除?
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

最后

了解了Docker網(wǎng)絡、容器通信之后,對繼續(xù)學習服務網(wǎng)格(Service Mesh)與Kubernetes的服務發(fā)現(xiàn)有很大幫助。很多的項目架構(gòu)也都是從網(wǎng)絡通信角度進行的層級、模塊劃分(比如:網(wǎng)路拓撲圖、終極系統(tǒng)架構(gòu)異地多活)。關(guān)于網(wǎng)絡,學完之后你會發(fā)現(xiàn)很多東西都串一塊了,超級有意思??

原文鏈接:https://www.cnblogs.com/all-smile/p/16637012.html

欄目分類
最近更新