1. 程式人生 > 其它 >BI系統打包Docker映象及容器化部署的具體實現

BI系統打包Docker映象及容器化部署的具體實現

一、Docker網路概念

1、網路驅動

Docker 網路子系統使用可插拔的驅動,預設情況下有多個驅動程式,並提供核心聯網功能。

  1. bridge:橋接網路,這是預設的網路驅動程式(不指定驅動程式建立的容器預設是bridge驅動)。
  2. host:主機網路。消除容器和主機的網路隔離,直接使用主機的網路。
  3. overlay:覆蓋網路。可以將多個Docker守護程序連線,實現跨主機容器通訊(swarm叢集)。
  4. macvlan:將MAC地址分配給容器,使容器作為網路上的物理裝置。不通過Docker主機網路棧進行路由,直接通過MAC地址路由到容器。
  5. none:表示關閉容器的所有網路連線。常與自定義網路驅動一起使用,不適用於swarm。
  6. 網路外掛:可以通過Docker安裝和使用第三方網路外掛。

2、Docker 網路驅動選用原則

  1. bridge橋接網路:最適合用於同一個Docker主機上執行的多個容器之間需要通訊的場景。(單主機)
  2. host主機網路:最適用於當網路棧不能與Docker主機隔離,而容器的其他方面需要被隔離的場景。(解除容器和主機隔離)
  3. overlay網路:適用於不同Docker主機上執行的容器需要通訊的場景,或者多個應用程式通過Swarm叢集服務一起工作的場景。(多主機、叢集)
  4. macvlan網路:適用於從虛擬機器遷移過來的場景,或者容器需要像網路上的物理機一樣,擁有獨立MAC地址的場景。(容器需要mac)
  5. 第三方網路外掛適用於將Docker與專用網路棧進行整合的場景。(訂製化)

3、容器的網路模式

docker內建了四種網路模式,也可以使用自定義網路。

(1)bridge模式

橋接網路分為預設橋接網路使用者自定義橋接網路兩種型別。

橋接網路用於同(單)主機執行的容器間通訊。

實現原理:橋接網路使用軟體網橋,讓連線到同一橋接網路的容器可以通訊,沒連線該網橋的容器被隔離。

工作流程:Docker守護程序啟動,會在主機上建立一個名為 docker0 的虛擬網橋,啟動容器時如果沒有特別指定,自動連線到這個虛擬網橋。

[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:b2:81:22:9d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.111  netmask 255.255.255.0  broadcast 192.168.100.255
		
# 案例:預設橋接網路和使用者自定義橋接網路
[root@huangqiushi ~]# docker network create --driver bridge hqs-net
c330cf15a47d29057a89a4313e5734348799bde32fba4dd71376382b049f1c86
[root@huangqiushi ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
73ab60681376   bridge    bridge    local
76d9e06a3606   host      host      local
c330cf15a47d   hqs-net   bridge    local
9f44873071f4   none      null      local

Docker 守護程序為每個啟動的容器建立一個 VETH對裝置(總是成對出現,組成資料通道)。

VETH對是直接連線的一對虛擬網路介面,一個介面設定為新建立容器的介面(位於容器的網路名稱空間中);另一個介面連線到虛擬網橋docker0(位於Docker的網路名稱空間中)。

(2)host模式

host模式的容器使用host驅動,直接連線Docker主機網路棧。實質:關閉 Docker 網路,讓容器直接使用主機作業系統的網路。

host模式沒有為容器建立一個隔離的網路環境,容器沒有隔離的網路名稱空間,也不會獲得一個獨立的網路名稱空間,而是和Docker主機共用一個網路名稱空間

容器和主機在同一個網路中,使用主機的物理網路介面,沒有獨立的IP地址,直接使用主機的IP地址和埠

由於主機名、地址都一樣,因此同一主機上的容器要做好協調。各容器通過埠來進行區分。

(3)container模式

Docker中一種較為特別的網路模式,主要用於容器和容器直接頻繁交流的情況。

特點:

  1. 該模式指定新建的容器和現有的一個容器共享網路名稱空間。
  2. 新建立的容器和一個現有的指定容器共享IP地址、埠範圍,不建立自己的網路介面、IP地址。
  3. 兩個容器間網路不隔離,程序可通過迴環網路進行通訊。
  4. 這兩個容器和主機和其他容器存在網路隔離。

(4)none模式

none模式將容器放置在它自己的網路棧中,但是並不進行任何配置,實際上關閉了容器的網路功能

特性:none模式,容器有自己的網路名稱空間,但未進行任何網路配置,未構建任何網路環境,容器內部只能使用迴環網路介面(127.0.0.1)。

可用場景:

  1. 有些容器並不需要網路,例如只需要寫入磁碟卷的批處理任務。
  2. 安全性要求高並且不需要聯網的應用可以使用none模式。
  3. 要建立自定義網路

(5)使用者自定義網路模式

管理員可以使用Docker網路驅動(bridge、overlay、macvlan)或第三方網路驅動外掛建立一個自定義的網路,然後將多個容器連線到同一個自定義網路。

特點:

  1. 連線到使用者自定義網路的容器,可以使用IP地址或名稱相互通訊。
  2. 可以根據需要建立任意數量的自定義網路。
  3. 可以在任何時間將容器連線到這些網路。
  4. 對執行中的容器,可連線、斷開自定義網路,無須重啟容器。

使用者自定義橋接網路(自定義網路使用bridge網路驅動):單機環境常用。生產環境推薦使用。

生產環境不推薦使用預設橋接網路,推薦使用使用者自定義橋接網路,原因在以下區別:

  1. 使用者自定義橋接網路能提供容器化應用程式之間更好的隔離和互操作性。如果在預設橋接網路上執行應用棧,則Docker主機需要通過其他方式來限制對埠的訪問。
  2. 使用者自定義橋接網路提供容器之間自動DNS解析功能,可以通過名稱或別名互相訪問。而預設橋接網路上的容器只能通過IP地址互相訪問。
  3. 容器可以在執行時與使用者自定義網路連線和斷開。要斷開與預設橋接網路的連線,需要停止容器並使用不同的網路選項重新建立該容器。
  4. 每個使用者可通過自定義網路建立一個可配置的網橋。而預設橋接網路會自動穿件一個名為docker0的虛擬網橋。
  5. 使用者自定義網路中所連線容器不能共享環境變數,不過有更好的方式實現共享環境變數(docker卷掛載、compose檔案定義、叢集)。預設橋接網路中所連線的容器共享環境變數。

4、容器間的通訊方案

容器間通訊方案:

  1. bridge模式讓同一個Docker網路上的所有容器在所有埠上都可以相互連線。
    • 預設橋接網路不支援基於名稱的服務發現和使用者指定的IP地址,所連線的容器只能通過IP地址互相訪問,除非建立容器時使用--link選項建立容器連線。
    • 在使用者自定義橋接網路中,容器之間可以通過名稱或別名互相訪問。
  2. host模式讓所有容器都位於同一個主機網路空間中,並共用主機的IP地址棧,在該主機上的所有容器都可通過主機的網路介面相互通訊。
  3. 容器通過埠對映對外部提供連線。
  4. container模式讓容器共用一個IP網路,兩個容器之間可通過迴環網路介面相互通訊。
  5. 容器之間使用--link選項建立傳統的容器互聯。
  6. 容器之間通過掛載主機目錄來實現相互之間的資料通訊。

5、傳統容器連線

建立容器時使用--link選項可以在容器之間建立連線,這是Docker傳統的容器互聯解決方案。

特性:

  1. 這種連線方式用來將多個容器連線在一起,並在容器之間傳送連線資訊。
  2. 當容器被連線時,在源容器接收容器 之間建立一個安全通道,關於源容器的資訊能夠被髮送到接收容器,讓接收容器可以訪問源容器所指定的資料。

為容器設定自定義名稱的好處:

  • 表示特定用途的名稱更易記憶,如將一個Web應用的容器命名為web。
  • 便於Docker通過該名稱引用其他容器,彌補預設橋接網路不支援容器名稱解析的不足
# 語法
[root@localhost ~]# docker create --help
Usage:  docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new container
Options:
  --link list                      Add link to another container       # 新增連線到另一個容器
# 格式
--link <源容器的名稱或ID>
--link <源容器的名稱或ID>:容器別名

# 案例
# 建立容器時,新增到第一個容器的連線,並配置別名alp
[root@localhost ~]# docker run -dti --name alpine2 --link alpine1:alp alpine ash
21c0ddd94cb4d7190701d003868caef7cd9f82aded0ae0c5a2e9e68ebb45a03f

6、容器訪問外部網路

預設情況下,容器可以主動訪問到外部網路的連線,但是外部網路無法訪問到容器。

使用bridge模式(預設橋接網路)的容器通過NAT方式實現外部訪問,具體通過iptables(Linux的包過濾防火牆)的源地址偽裝操作實現。

iptables源地址偽裝:容器所有到外部網路的連線,源地址都會被 NAT 裝換成本地系統的 IP 地址(即docker0地址)。

檢視主機的 NAT 規則:

[root@localhost ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 142 packets, 31842 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    52 DOCKER     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT 140 packets, 31384 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4 packets, 288 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DOCKER     all  --  *      *       0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT 4 packets, 288 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      !docker0  172.17.0.0/16        0.0.0.0/0             《————這一條規則將所有源地址在 172.17.0.0/16 網段,目標地址為其他網段(外部網路)的流量動態偽裝為從系統網絡卡發出。
	                                                                                                MASQUERADE 相比傳統 SNAT 的好處是它能動態從網絡卡獲取地址。

Chain DOCKER (2 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  docker0 *       0.0.0.0/0            0.0.0.0/0  

7、從外部網路訪問容器

預設情況下,建立的容器不會將其任何埠對外發布,從容器外部無法訪問容器內部。

從外部訪問容器內的應用程式必須要有明確的授權,通過內部埠對映來實現。

實現:將容器的一個埠對映到 docker 主機上的一個埠,允許從外部網路通過該埠訪問容器。這種埠對映也是一種NAT實現,即目標地址轉換(Destination NAT DNAT)。

# 案例
[root@localhost dockerfile-test]# docker run --rm -d -p 8000:80 --name my-nginx centos-nginx-hqs:1.0

8、容器的網路配置語法

使用 docker rundocker create 命令來設定容器的網路配置的語法。

(1)設定容器的網路連線

容器啟動時,可以使用 --network 選項設定容器要連線的網路,即網路模式。

none:容器為none模式,容器不使用任何網路連線,能完全禁用網路連線。

bridge:容器為bridge模式,連線到預設橋接網路,也是預設設定。

host:容器為host模式,使用主機網路棧。

container:容器為container模式,容器使用某一個容器(通過id或name來標識)的網路棧。

網路名or網路id:容器連線自定義網路,可使用自定義網路的名稱或id。

# 語法
[root@localhost ~]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      --network network                Connect a container to a network        # 連線容器到網路中

# 案例
[root@hqs ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
9b3f5f5076b9   bridge    bridge    local
76d9e06a3606   host      host      local
9f44873071f4   none      null      local
[root@hqs ~]# docker run --network none -dit --name centos-test centos /bin/bash
24110a1ca4da0f6d7659d7d2e8a1f57a8d980031ab54ac4730a3b89e44679e46
[root@hqs ~]# docker inspect --format='{{json .HostConfig.NetworkMode}}'  24110a1ca4da 
"none"

(2)為容器新增網路作用域的別名

容器在網路作用域中允許有別名,別名在所在網路中可以直接訪問。使用 --network-alias 選項指定容器在網路中的別名。

注意:網路作用域別名只支援使用者自定義的網路。

# 語法
[root@localhost ~]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      --network-alias list             Add network-scoped alias for the container   # 給容器新增網路作用域別名

# 失敗案例
[root@hqs ~]# docker run -d -p 80:80 --name testweb --network host --network-alias websrv centos
docker: network-scoped aliases are only supported for user-defined networks.       # 網路作用域別名只支援使用者自定義的網路

# 案例
[root@hqs ~]# docker network create --driver bridge mynet
a7b402ee062eaf27c50fb303ae6e764f384cd7b2ebd0acf61fdeeba68bddb5f6
[root@hqs ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
9b3f5f5076b9   bridge    bridge    local
76d9e06a3606   host      host      local
a7b402ee062e   mynet     bridge    local
9f44873071f4   none      null      local
# 啟動容器
[root@huangqiushi ~]# docker run -d -p 8082:80 --name test-web --network mynet --network-alias webtesthqs centos
99e3e91c82122b70fb53adebb120dc423f9d91e8a08696645fd2a7f5441e0417
# 檢視網路模式
[root@huangqiushi ~]#  docker inspect --format='{{json .HostConfig.NetworkMode}}'  99e3e91c82
"mynet"
# 檢視自定義網路資訊
[root@huangqiushi ~]#  docker inspect --format='{{json .NetworkSettings.Networks.mynet}}'  99e3e91c82
{"IPAMConfig":null,"Links":null,"Aliases":["webtesthqs","99e3e91c8212"],"NetworkID":"f5d3fe3303c75faccc4ecbdb740d65865e2c05364608dc14602d110daa32bce6","EndpointID":"","Gateway":"","IPAddress":"","IPPrefixLen":0,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"","DriverOpts":null}
# 檢視網路別名
[root@huangqiushi ~]#  docker inspect --format='{{json .NetworkSettings.Networks.mynet.Aliases}}'  99e3e91c82
["webtesthqs","99e3e91c8212"]
# 檢視埠對映
[root@huangqiushi ~]#  docker inspect --format='{{json .HostConfig.PortBindings}}'  99e3e91c82
{"80/tcp":[{"HostIp":"","HostPort":"8082"}]}

(3)設定容器的IP地址

使用--network 選項啟動容器連線自定義網路時,可以使用 --ip--ip6選項明確指定分配給該網路容器的ip地址。

使用前面建立的mynet,建立新容器指定ip時報錯:Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.

注意有兩個前置使用條件:

  1. 只適用使用者自定義網路;
  2. 使用者自定義網路配置了子網。
# 語法
[root@localhost ~]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)

# 案例:使用預設網路--ip配置地址不生效
[root@hqs ~]# docker run -dti --name test-ip --ip 172.17.1.100 centos 
04ffb3d192dd681f07ba53d828f515f6376376ae3dbc29b69c6f8fa5f06b6f17
[root@hqs ~]# docker inspect --format='{{json .NetworkSettings.IPAddress}}'  test-ip
"172.17.0.2"

# 案例
[root@hqs ~]# docker network create --driver bridge --subnet 10.10.0.0/24 --gateway 10.10.0.254 hqsnet2
bb6f77c8b7f0525d0563ae9e85ef4b8a829ac5fee5a4f666c0caff4fcbc1b67b
[root@hqs ~]# docker network inspect hqsnet2
[
    {
        "Name": "hqsnet2",
        "Id": "bb6f77c8b7f0525d0563ae9e85ef4b8a829ac5fee5a4f666c0caff4fcbc1b67b",
        "Created": "2022-04-15T03:26:05.242174757+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "10.10.0.0/24",
                    "Gateway": "10.10.0.254"
                }
            ]
        }
    }
]
[root@hqs ~]# docker run -dti --name test-ip02 --network hqsnet2 --ip 10.10.0.101 centos
1377b1fe89549cf87833f6188c3a6355c39cec86d6237e7141a958befb8a176a
[root@hqs ~]# docker inspect --format='{{json .NetworkSettings.Networks.hqsnet2.IPAddress}}'  test-ip02
"10.10.0.101"

(4)設定容器的網路介面MAC地址

預設情況下,容器mac地址是基於其IP地址生成。
可以通過 --mac-address 選項為容器指定一個MAC地址。

注意:手動指定mac地址,docker不會檢查地址的唯一性。

# 語法
[root@localhost ~]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)

# 案例1:(預設網路)
[root@hqs ~]# docker run -dti --name test-dns01 --mac-address 56:78:ab:bc:8c:1d  centos
f4e0babb3072cc2a1484e68b7fcbd733194a462660f5ee571072c6fb575f7683
[root@hqs ~]# docker inspect --format='{{json .Config.MacAddress}}' test-dns01
"56:78:ab:bc:8c:1d"

# 案例2:
[root@hqs ~]# docker run -d -p 8080:80 --name testweb03 --network mynet --network-alias web03 --mac-address 12:34:56:78:9a:bc  centos
4bc34a65f48f46b95c021194dec216f640d8974f98c6c297dcc37c64f924436b
[root@hqs ~]# docker inspect --format='{{json .Config.MacAddress}}'  4bc34a65
"12:34:56:78:9a:bc"

(5)設定容器的DNS配置和主機名

預設情況下,容器繼承Docker守護程序的DNS配置,包括 /etc/hosts/etc/resolv.conf 配置檔案。

可以使用以下選項配置DNS,覆蓋預設配置。

# 語法
[root@localhost ~]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
      --dns list                       Set custom DNS servers            # 為容器設定DNS伺服器的IP地址
	  可以使用多個--dns為容器指定多個DNS伺服器。
	  容器連不上指定DNS伺服器,會自動使用google的公共dns:8.8.8.8。
      --dns-option list                Set DNS options                   # 為容器設定表示DNS選項及值的鍵值對
	  
      --dns-search list                Set custom DNS search domains     # 為容器指定一個DNS搜尋域
	  搜尋非全稱的主機名。
	  可以使用多個--dns-search的選項
  -h, --hostname string                Container host name               # 為容器指定自定義的主機名
  

# --dns案例
[root@hqs ~]# docker run -d -p 8081:80 --name testdns --network mynet --dns 202.103.24.68  centos
101cf268006a5780c9e69e147d302933aa91bace5922c5527d41f5dcec4a23f9
[root@hqs ~]# docker inspect --format='{{json .HostConfig.Dns}}'  101cf268
["202.103.24.68"]

# --dns-option案例
# 參照resolv.conf檔案來確定選項
# 如果配置錯誤DNS,測試發現一開始會找不到地址,過一段時間後才能轉換域名為ip
[root@hqs ~]# docker run --name test-dns-opt02 -dti --dns-option 202.103.24.68  centos
c51e9e87b4e6e401868ece408a8a5726aaf67ec5ae34e8bbae4e9e1309f5e34e
# 登入測試
[root@hqs ~]# docker exec -ti test-dns-opt02 /bin/bash
[root@c51e9e87b4e6 /]# ping www.baidu.com
PING www.wshifen.com (103.235.46.39) 56(84) bytes of data.
64 bytes from 103.235.46.39 (103.235.46.39): icmp_seq=4 ttl=127 time=293 ms
# 檢視配置
[root@hqs ~]# docker inspect --format='{{json .HostConfig.DnsOptions}}'  test-dns-opt02
["202.103.24.68"]

# --dns-search案例
[root@hecs-hqs-01 ~]# docker run -dti -p 8082:80 --name test_dns_search --network mynet --dns-search openstacklocal centos
b23a978d072acf45a90a093883c3494d0b3383c817ffe76708c9fd132df00358
[root@hecs-hqs-01 ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
b23a978d072a        centos                "/bin/bash"              5 seconds ago       Up 4 seconds        0.0.0.0:8082->80/tcp     test_dns_search
[root@hecs-hqs-01 ~]# docker inspect --format='{{json .HostConfig.DnsSearch}}'  test_dns_search
["openstacklocal"]

# --hostname案例
[root@hecs-hqs-01 ~]# docker run -dti -p 8083:80 --name test_hostname --network mynet --hostname hostname-test centos
5f49da1802ea461de7133beb4c8460a75a8cf687648ef1d135757b79f7e2c30b
[root@hecs-hqs-01 ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS                    NAMES
5f49da1802ea        centos                "/bin/bash"              4 seconds ago        Up 3 seconds        0.0.0.0:8083->80/tcp     test_hostname
[root@hecs-hqs-01 ~]# docker inspect --format='{{json .Config.Hostname}}'  test_hostname 
"hostname-test"

二、Docker網路管理命令

docker network 是Docker 網路本身的管理命令。

# 語法
[root@localhost ~]# docker network --help
Usage:  docker network COMMAND
Manage networks  網路管理
Commands:
  connect     Connect a container to a network                                # 將容器連線到網路
  create      Create a network                                                # 建立網路
  disconnect  Disconnect a container from a network                           # 斷開容器和某網路的連線
  inspect     Display detailed information on one or more networks            # 顯示網路的詳細資訊
  ls          List networks                                                   # 顯示網路列表
  prune       Remove all unused networks                                      # 刪除未被使用網路
  rm          Remove one or more networks                                     # 刪除指定網路

Run 'docker network COMMAND --help' for more information on a command.

1、檢視網路列表

執行 docker network ls 命令,可檢視當前網路列表。

網路作用域為local,則僅在docker主機範圍內提供連線和網路服務。

# 語法
[root@localhost ~]# docker network ls --help
Usage:  docker network ls [OPTIONS]
List networks
Aliases:
  ls, list
Options:
  -f, --filter filter   Provide filter values (e.g. 'driver=bridge')
      --format string   Pretty-print networks using a Go template
      --no-trunc        Do not truncate the output
  -q, --quiet           Only display network IDs
  

# 案例
[root@localhost ~]# docker network ls 
網路ID       網路名稱    網路驅動  作用域
NETWORK ID     NAME      DRIVER    SCOPE
989e0968a6fe   bridge    bridge    local
76d9e06a3606   host      host      local
9f44873071f4   none      null      local

[root@localhost ~]# docker network ls -q
989e0968a6fe
76d9e06a3606
9f44873071f4

[root@localhost ~]# docker network ls --filter driver=bridge
NETWORK ID     NAME      DRIVER    SCOPE
989e0968a6fe   bridge    bridge    local

[root@localhost ~]# docker network ls --format asdasd
asdasd
asdasd
asdasd

[root@localhost ~]# docker network ls --no-trunc
NETWORK ID                                                         NAME      DRIVER    SCOPE
989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf   bridge    bridge    local
76d9e06a360678e6c0b12b13d9cdde88cb63a77807012cb7e4e8b66bfd47e88b   host      host      local
9f44873071f4baa0f97756fd0b904cde51a718455689ccc58252d374b4d47992   none      null      local

2、檢視網路詳細資訊

執行 docker network inspect 命令檢視指定網路的詳細資訊。
引數可以是網路名稱或網路ID。

# 語法
[root@localhost ~]# docker network inspect --help
Usage:  docker network inspect [OPTIONS] NETWORK [NETWORK...]
Display detailed information on one or more networks   
Options:
  -f, --format string   Format the output using the given Go template
  -v, --verbose         Verbose output for diagnostics                     # 診斷的詳細輸出


# 案例
[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf",
        "Created": "2022-04-19T21:56:32.999550849+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": {
            "15d605de252549571b613ec08b397af49060e1d6f1a45548f884a7d2de896c56": {
                "Name": "test-dns02",
                "EndpointID": "a474c3a28141e679b93f7c4d44616452114e310f5bf8f40560f3f73eb90a1f7f",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "24574957d30aab88b2b4ebcb98c0878470a78a05df03dfb86ad4078fabed1fe5": {
                "Name": "test-dns03",
                "EndpointID": "745a7c6b314b5963c6d134c148205fc0a215f1f3afb7948246a423088863ab4e",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "60e63a6f891f2b8a25847c410f35ca0c88f172c15edbb39fd3631a61b7fc5ad0": {
                "Name": "test-dns",
                "EndpointID": "08574b9714bb18374c24cddb340a932a332a9aeda71037548e5ea87966c904f8",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "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": {}
    }
]

# --format篩選輸出
[root@localhost ~]# docker network inspect --format='{{json .Options}}'   bridge
{"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"}
[root@localhost ~]# docker network inspect --format='{{json .Containers}}'   bridge

3、建立容器網路

使用 docker network create 命令建立容器網路。

# 語法
[root@localhost ~]# docker network create --help
Usage:  docker network create [OPTIONS] NETWORK
Create a network
Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which to copy the configuration                           # 網路從哪複製配置
      --config-only          Create a configuration only network                                        # 建立配置唯一網路
  -d, --driver string        Driver to manage the Network (default "bridge")                            # 指定網路驅動
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet                                 # 指定子網閘道器
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range                                     # 指定子網中容器的IP地址範圍
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope                                                 # 控制網路作用域
      --subnet strings       Subnet in CIDR format that represents a network segment                     # 子網

# 案例
[root@localhost ~]# docker network create --driver bridge hqs_net01
00c4ff496a7d44dda7e1913e6119d45064aba010b5210b0afee04c6eedbae6a3
[root@localhost ~]# docker network create --driver bridge --subnet 10.10.1.0/24 --gateway 10.10.1.254 hqs_net02
7fe5768c8e84d3befef561a8632c49bdeb194b440836bf7223d8d37e51ec2c8c
[root@localhost ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
989e0968a6fe   bridge      bridge    local
76d9e06a3606   host        host      local
00c4ff496a7d   hqs_net01   bridge    local
7fe5768c8e84   hqs_net02   bridge    local
9f44873071f4   none        null      local

4、刪除容器網路

使用 docker network rm 刪除容器網路。

# 語法
[root@localhost ~]# docker network rm --help
Usage:  docker network rm NETWORK [NETWORK...]
Remove one or more networks
Aliases:
  rm, remove

# 案例
[root@localhost ~]# docker network rm c3f9bb71d92e
c3f9bb71d92e
[root@localhost ~]# docker network rm hqs_net01 hqs_net02
hqs_net01
hqs_net02

5、連線容器網路

使用 docker network connect 連線容器網路。

# 語法
[root@localhost ~]# docker network connect --help
Usage:  docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
      --alias strings           Add network-scoped               # 新增容器網路域關聯
                                alias for the container
      --driver-opt strings      driver options for               # 網路驅動選項
                                the network
      --ip string               IPv4 address (e.g.,              # IPV4地址
                                172.30.100.104)
      --ip6 string              IPv6 address (e.g.,              # IPV6地址
                                2001:db8::33)
      --link list               Add link to another              # 新增到另一個容器的連結
                                container
      --link-local-ip strings   Add a link-local                 # 新增容器本地連結地址
                                address for the
                                container


# 案例
[root@localhost ~]# docker network connect bridge alpine4

三、實驗案例

1、容器連線預設的橋接網路

建立或啟動容器時不指定網路,則該容器會被連線到預設橋接網路。
本實驗,測試同一Docker主機兩個容器間的通訊。

# 1.檢視當前已有的網路
[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
989e0968a6fe   bridge    bridge    local     《————預設橋接網路
76d9e06a3606   host      host      local
9f44873071f4   none      null      local

# 2.啟動兩個執行ash的alpine容器
# alpine映象下載
[root@localhost ~]# docker pull alpine 
Using default tag: latest
latest: Pulling from library/alpine
df9b9388f04a: Pull complete 
Digest: sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
# 啟動容器
[root@localhost ~]# docker run -dti --name alpine1 alpine ash
f5116b60027b745495ad090de3e47e18b7b4ef27dd9529c0fc658f66febac044
[root@localhost ~]# docker run -dti --name alpine2 alpine ash
aa54330101c2bf5b09909ebbfbad18e316e6649305176e57db07842f3735e03f

# 3.檢查容器是否啟動
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
55f9241be324   alpine    "ash"     4 seconds ago   Up 3 seconds             alpine2
a654ec01f3eb   alpine    "ash"     7 seconds ago   Up 6 seconds             alpine1

# 4.檢視bridge網路的詳細資訊
[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf",
        "Created": "2022-04-19T21:56:32.999550849+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": {
            "55f9241be324d8a2aba1c96c18fd762aa8c5940ff395a01ead8cb9824719b032": {
                "Name": "alpine2",
                "EndpointID": "c1b5d5ea6e1446b8f934e54a3461197f544eb13ef7f1e7350f6afe8836b7b3a7",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",                 《————第二個容器
                "IPv6Address": ""
            },
            "a654ec01f3eb117fbc4f4248b5e08aceb7ad37efbe7a228d998ac86a13b5a17a": {
                "Name": "alpine1",
                "EndpointID": "874a9857659ff2ea7d0004826b34058923806cae592951276c78a4f2bb72a391",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",                  《————第一個容器
                "IPv6Address": ""
            }
        },
        "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": {}
    }
]

...

# 5.docker attach命令連線到alpine1容器 
[root@localhost ~]# docker attach alpine1            《————連線到alpine容器
/ # ip addr show                                      《———— ‘#’說明當前容器使用者以root登入
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
19: eth0@if20: <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              《————地址為172.17.0.2
       valid_lft forever preferred_lft forever
/ # 

# 6.在alpine1容器ping外網
/ # ping -c 2 www.163.com
PING www.163.com (221.233.240.107): 56 data bytes
64 bytes from 221.233.240.107: seq=0 ttl=127 time=4.929 ms
64 bytes from 221.233.240.107: seq=1 ttl=127 time=5.103 ms

--- www.163.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 4.929/5.016/5.103 ms

# 7.在alpine1容器ping第二個容器
# (1)ping地址可以通
/ # ping -c 2 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.057 ms

--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.057/0.061/0.065 ms
# (2)ping名稱不能通
/ # ping -c 2 alpine2
ping: bad address 'alpine2'

# 8.離開但不停止容器————輸入 Ctrl+P 和 Ctrl+Q
/ # read escape sequence
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
55f9241be324   alpine    "ash"     9 minutes ago   Up 9 minutes             alpine2
a654ec01f3eb   alpine    "ash"     9 minutes ago   Up 9 minutes             alpine1

# 9.停止並刪除容器
[root@localhost ~]# docker stop alpine1 alpine2
alpine1
alpine2
[root@localhost ~]# docker rm alpine1 alpine2
alpine1
alpine2

2、使用傳統的容器連線

預設橋接網路的容器之間只能通過IP地址通訊。
如要通過名稱通訊,可使用傳統的 --link 選項新增到容器的連線。
本實驗,在兩個容器間建立連線,然後通過連線名稱或別名訪問源容器。

# 1.建立兩個連線預設橋接網路的容器
[root@localhost ~]# docker run -dti --name alpine1 alpine ash
667caa0d0690c95de34e41bfebaf983e897f3a7e028fda892fca884f1f94dc49
# 建立容器時,新增到第一個容器的連線,並配置別名alp
[root@localhost ~]# docker run -dti --name alpine2 --link alpine1:alp alpine ash
21c0ddd94cb4d7190701d003868caef7cd9f82aded0ae0c5a2e9e68ebb45a03f

# 2.進入alpine2容器測試網路連通性
[root@localhost ~]# docker attach alpine2
/ # ping -c 2 alpine1
PING alpine1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.048 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.056 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.052/0.056 ms
# 測試後,再通過ctrl+P+Q退出容器。

# 3.進入alpine1容器測試網路連通性
[root@localhost ~]# docker attach alpine1
/ # ping -c 2 alpine2
ping: bad address 'alpine2'
# 失敗原因:--link只添加了單向通訊,接受容器可以通過名稱訪問源容器,源容器不能通過名稱訪問接收容器。
# 測試後,再通過ctrl+P+Q退出容器。

# 4.刪除容器恢復環境
[root@localhost ~]# docker rm -f $(docker ps -aq)
21c0ddd94cb4
667caa0d0690

3、建立使用者自定義橋接網路並連線容器

實驗:示範如何將容器連線到使用者自定義橋接網路,並驗證容器間的連通性。

在自定義橋接網路中,容器不僅能通過IP地址進行通訊,還能將容器名稱解析到IP地址,此功能稱為自動服務發現(Automatic Service Discovery)。

# 1.建立使用者自定義橋接網路
[root@localhost ~]# docker network create --driver bridge alpine-net
9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c

# 2.檢視當前docker主機的網路
[root@localhost ~]# docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
9e8a13047a17   alpine-net   bridge    local
# 檢視新網路的詳細資訊
[root@localhost ~]# docker network inspect alpine-net
[
    {
        "Name": "alpine-net",
        "Id": "9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c",
        "Created": "2022-04-20T16:59:22.055790409+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",                 《————子網
                    "Gateway": "172.18.0.1"                    《————閘道器
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

# 3.建立四個容器
# (1)2個只連線使用者自定義橋接網路
[root@localhost ~]# docker run -dti --name alpine1 --network alpine-net alpine ash
22af8e376fef34108cf2058810b7edd05c148314354341c067ff45d6e7437f46
[root@localhost ~]# docker run -dti --name alpine2 --network alpine-net alpine ash
26f211048d9d857029ee9e038918c38b9ae19f698e1806adbc78ed0aca6f1aff

# (2)1個只連線預設橋接網路
[root@localhost ~]# docker run -dti --name alpine3 alpine ash
1078e18ff3a2d84b2ea97a612fd577ef142e5a954753169e95c4d9b2bd337c41

# (3)1個同時連線預設橋接網路和使用者自定義網路
# docker run 命令執行只能連線一個網路
[root@localhost ~]# docker run -dti --name alpine4 --network alpine-net alpine ash
4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a
# connet命令連線第二個網路
[root@localhost ~]# docker network connect bridge alpine4

# (4)檢視當前正在執行的容器
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
4b63cd8a7a1e   alpine    "ash"     2 minutes ago   Up 2 minutes             alpine4
1078e18ff3a2   alpine    "ash"     3 minutes ago   Up 3 minutes             alpine3
26f211048d9d   alpine    "ash"     4 minutes ago   Up 4 minutes             alpine2
22af8e376fef   alpine    "ash"     4 minutes ago   Up 4 minutes             alpine1

# 4.檢視bridge網路和alpine-net網路資訊
# 檢視bridge網路
[root@localhost ~]# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "aefaa402b60d4b6f7f2515575ba2720f98eb8fd0c1ead0a8572442c098e52ed5",
        "Created": "2022-04-20T15:52:23.173167512+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": {
            "1078e18ff3a2d84b2ea97a612fd577ef142e5a954753169e95c4d9b2bd337c41": {
                "Name": "alpine3",
                "EndpointID": "1e19495d48d8e83cff4add4d8ad1570b24068fec17824cf4f499c56010831e52",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a": {
                "Name": "alpine4",
                "EndpointID": "d2cb2c81fe71d54c3fc39782755f0b0c86ce415c67205c159bf16fe3ebd76c24",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "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": {}
    }
]
# 檢視alpine-net網路
[root@localhost ~]# docker network inspect alpine-net
[
    {
        "Name": "alpine-net",
        "Id": "9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c",
        "Created": "2022-04-20T16:59:22.055790409+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "22af8e376fef34108cf2058810b7edd05c148314354341c067ff45d6e7437f46": {
                "Name": "alpine1",
                "EndpointID": "b2f1d6d2ebf8cce71dddf0b23fb941d17a4d3e0c757bf33604d6d57f8b801665",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "26f211048d9d857029ee9e038918c38b9ae19f698e1806adbc78ed0aca6f1aff": {
                "Name": "alpine2",
                "EndpointID": "01a8b99524d4db9a820ffede79fbcc0b95ccc1c00ab2d87a9a236c9f67c04dec",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a": {
                "Name": "alpine4",
                "EndpointID": "c79921b791e45fc22dc8b3b3df06ffe45ffe97f8999a724c51bd8c53d358ebb0",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 5、alpine1網路測試
[root@localhost ~]# docker attach alpine1
/ # ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.063 ms               《————使用者自定義網路,支援自動服務發現
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.054 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.054/0.058/0.063 ms

/ # ping -c 2 alpine4
PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.060 ms                《————使用者自定義網路,支援自動服務發現
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.055 ms
--- alpine4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.055/0.057/0.060 ms

/ # ping -c 2 alpine3
ping: bad address 'alpine3'                                          《————alpine3不在使用者自定義網路alpine-net中

/ # ping -c 2 172.17.0.2                                             《————不在一個網路中,名稱和IP都不能ping通
PING 172.17.0.2 (172.17.0.2): 56 data bytes
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

/ # ping www.baidu.com
PING www.baidu.com (103.235.46.39): 56 data bytes
64 bytes from 103.235.46.39: seq=0 ttl=127 time=248.724 ms
64 bytes from 103.235.46.39: seq=2 ttl=127 time=259.902 m
# 測試後,再通過ctrl+P+Q退出容器alpine1。

# 6.alpine4網路測試
# alpine4既連線了預設橋接網路,也連線了alpine-net網路,可以訪問所有的容器。
[root@localhost ~]# docker attach alpine4
/ # ping -c 2 alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.046 ms                《————使用者自定義網路,支援自動服務發現
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.052 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.046/0.049/0.052 ms

/ # ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.058 ms                《————使用者自定義網路,支援自動服務發現
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.053 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.053/0.055/0.058 ms

/ # ping -c 2 alpine3                                               《————alpine3為預設橋接網路,不支援自動服務發現
ping: bad address 'alpine3'

/ # ping -c 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.065 ms                 《————alpine3為預設橋接網路,支援地址ping通
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.060 ms
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.060/0.062/0.065 ms

/ # ping -c 2 www.baidu.com
PING www.baidu.com (14.215.177.38): 56 data bytes
64 bytes from 14.215.177.38: seq=0 ttl=127 time=29.962 ms            《————能訪問外網
64 bytes from 14.215.177.38: seq=1 ttl=127 time=30.115 ms
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 29.962/30.038/30.115 ms

7.清理環境
[root@localhost ~]# docker rm -f $(docker ps -qa)
4b63cd8a7a1e
1078e18ff3a2
26f211048d9d
22af8e376fef
[root@localhost ~]# docker network rm alpine-net
alpine-net