Docker網路

谢友海發表於2024-09-12

Docker網路是Docker容器間以及容器與宿主機之間通訊的基礎,它提供了一套靈活的網路配置方案,允許使用者自定義網路拓撲,從而滿足不同應用場景的需求。

一、Docker網路基礎

Docker提供了多種網路模式,每種模式有不同的網路隔離和連線方式,主要包括:

1、Bridge(橋接模式,預設,常用)

  • 為每個容器分配一個網路橋接介面,容器間通訊透過Docker內建的虛擬網橋(通常是docker0)進行。
  • 容器可以與宿主機直接通訊,外部網路透過埠對映訪問容器內部服務。
  • 使用iptables的NAT地址轉換實現容器與宿主機的通訊。

2、Host

  • 容器共享宿主機的網路名稱空間,直接使用宿主機的網路堆疊,容器的網路配置與宿主機相同。
  • 容器埠直接對映到宿主機的埠,無需額外配置。
  • 降低了網路隔離性,但提高了效能。

3、None

  • 不為容器配置網路,容器沒有網路連線能力。
  • 通常用於不需要網路連線的容器。

4、Container(用得少,侷限大)

  • 容器和容器之間公用一個IP和埠。
  • 通常用於測試場景。

5、User-Defined Networks(使用者自定義網路)

  • 可以配置網路驅動、子網、IP範圍等,為容器提供更靈活的網路配置。
  • 包括overlay(用於跨多個宿主機的容器通訊)和macvlan(為容器提供與宿主機同層的網路介面)等型別。

二、容器訪問外網

容器要想訪問外部網路,需要本地系統的轉發支援。

在 Linux 系統中,檢查轉發是否開啟:

sysctl net.ipv4.ip_forward
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

如果為 0,說明沒有開啟轉發,則需要手動開啟。

sysctl -w net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

如果在啟動 Docker 服務的時候設定 --ip-forward=true,那麼 Docker 就會自動設定系統的 ip_forward 引數值 為 1。

三、Docker網路配置

在Docker中,可以使用以下命令來進行網路配置:

# 檢視網路列表
docker network ls

# 檢視一個Docker網路的詳細資訊
docker network inspect [網路名稱]

# 斷開容器與網路的連線
docker network disconnect [網路名稱] [容器名稱或ID]

# 刪除一個已存在的Docker網路
docker network rm [網路名稱]

# 建立一個名為 my-bridge-network 的Docker橋接網路,並指定子網和閘道器
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network

# 啟動容器時指定網路(--net [網路名稱])
docker run -d -p 8090:80 --mount type=volume,source=nginx_volume,target=/usr/share/nginx/html --name nginx-container --net my-bridge-network nginx:latest

# 啟動容器時指定網路和固定IP地址
docker run -d --net [網路名稱] --ip [新的IP地址] --name [容器名稱] [映象名稱]

# 將容器連線到一個已存在的Docker網路
docker network connect [網路名稱] [容器名稱或ID]

示例:

1)建立自定義橋接網路

[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network
cf8f2d55247f6c854dae9241858455445e1e1cad7c82a8bec47265fac9275122
[root@localhost ~]# docker network ls
NETWORK ID     NAME                DRIVER    SCOPE
592cddf71fad   bridge              bridge    local
c1993b581192   host                host      local
cf8f2d55247f   my-bridge-network   bridge    local
c21728fbfa4d   none                null      local

2)啟動容器時指定網路

[root@localhost ~]# docker run -itd --net my-bridge-network --name busybox-container-1 busybox
ea264b47898086b2209686fef01e07c5981704dcaab28e8eba833da2ddaff74d
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
ea264b478980   busybox   "sh"      4 seconds ago   Up 3 seconds             busybox-container-1

3)啟動容器時指定網路和固定IP地址

[root@localhost ~]# docker run -itd --net my-bridge-network --ip 192.168.4.110 --name busybox-container-2 busybox
cc10a9bb6f9514eb2182cae9973dc6e1a63421f80d42af909b36aa108f03f83d
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
cc10a9bb6f95   busybox   "sh"      8 seconds ago   Up 7 seconds             busybox-container-2
ea264b478980   busybox   "sh"      3 minutes ago   Up 3 minutes             busybox-container-1

4)檢查兩個容器間的網路是否能連通

[root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-2
PING busybox-container-2 (192.168.4.110): 56 data bytes
64 bytes from 192.168.4.110: seq=0 ttl=64 time=0.209 ms
64 bytes from 192.168.4.110: seq=1 ttl=64 time=0.354 ms
64 bytes from 192.168.4.110: seq=2 ttl=64 time=0.218 ms
64 bytes from 192.168.4.110: seq=3 ttl=64 time=0.141 ms
64 bytes from 192.168.4.110: seq=4 ttl=64 time=0.104 ms
^C
--- busybox-container-2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.104/0.205/0.354 ms

可以看出這兩個容器間的網路是連通的。

5)啟動一個容器但不指定網路

[root@localhost ~]# docker run -itd --name busybox-container-3 busybox
55ef9654c71a499dec30b7f0ad30ede6db819cbe5c32c4b2cb27597337ca6833
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
55ef9654c71a   busybox   "sh"      3 seconds ago    Up 3 seconds              busybox-container-3
cc10a9bb6f95   busybox   "sh"      12 minutes ago   Up 12 minutes             busybox-container-2
ea264b478980   busybox   "sh"      15 minutes ago   Up 15 minutes             busybox-container-1
[root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-3
ping: bad address 'busybox-container-3'

可以發現不同網路下的兩個容器間是 ping 不通的。

6)使用 docker network connect 命令可以使得原本不在同一網路下的容器之間也能夠互相通訊

在 Docker 中,docker network connect [網路名稱] [容器名稱或ID] 命令主要用於將一個已存在的容器連線到另一個已存在的網路上。

[root@localhost ~]# docker network connect my-bridge-network busybox-container-3
[root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-3
PING busybox-container-3 (192.168.0.3): 56 data bytes
64 bytes from 192.168.0.3: seq=0 ttl=64 time=0.102 ms
64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.090 ms
64 bytes from 192.168.0.3: seq=2 ttl=64 time=0.098 ms
^C
--- busybox-container-3 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.090/0.096/0.102 ms

可以發現這時候就可以 ping 的通了。

7)檢視容器的 /etc/hosts 資訊

[root@localhost ~]# docker exec -it busybox-container-3 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.2      55ef9654c71a
192.168.0.3     55ef9654c71a

8)檢視一個Docker網路的詳細資訊

[root@localhost ~]# docker network inspect my-bridge-network
[
    {
        "Name": "my-bridge-network",
        "Id": "cf8f2d55247f6c854dae9241858455445e1e1cad7c82a8bec47265fac9275122",
        "Created": "2024-09-12T22:38:26.886089982+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "55ef9654c71a499dec30b7f0ad30ede6db819cbe5c32c4b2cb27597337ca6833": {
                "Name": "busybox-container-3",
                "EndpointID": "c7f81f20348469749fdd7a23e29d2be939c2c71d75d6149565c4d59ed4f93ab3",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "cc10a9bb6f9514eb2182cae9973dc6e1a63421f80d42af909b36aa108f03f83d": {
                "Name": "busybox-container-2",
                "EndpointID": "1922c8921cbe099cc4104a54810978a953e082de17a465a0376add21810e3749",
                "MacAddress": "02:42:c0:a8:04:6e",
                "IPv4Address": "192.168.4.110/16",
                "IPv6Address": ""
            },
            "ea264b47898086b2209686fef01e07c5981704dcaab28e8eba833da2ddaff74d": {
                "Name": "busybox-container-1",
                "EndpointID": "fd28ba7d898d5b431d58efa9dcfab07fb505bbdba34dc78ad8ac299e20800a74",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

至此本文就全部介紹完了,希望對您有所幫助!

相關文章