1. 程式人生 > >Docker技術入門與實戰 第二版-學習筆記-8-網路功能network-1-單個host上的容器網路

Docker技術入門與實戰 第二版-學習筆記-8-網路功能network-1-單個host上的容器網路

Docker 中的網路功能介紹

Docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務

 

1) 外部訪問容器

容器中可以執行一些網路應用,要讓外部也可以訪問這些應用,可以通過 -p或 -P引數來指定埠對映

執行容器時如果使用-P,Docker 會隨機對映一個在49000-49900區間內的埠到內部容器開放的網路埠。

比如下面的容器,就隨機選取了本地的32768埠對映到了容器中正開放的5000埠,此時訪問本機的 32768

埠即可訪問容器內 web 應用提供的介面

userdeMacBook-Pro:~ user$ docker run -d -P --name web -v /webapp training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image 
for training/webapp:latest 1ad71e9d38081c38dcd355fd7a438cd9f94503e8bc28e99a48c0738b51e7efef userdeMacBook-Pro:~ user$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ad71e9d3808 training/webapp "python app.py
" 42 minutes ago Up 42 minutes 0.0.0.0:32768->5000/tcp web

在瀏覽器中訪問http://localhost:32768:

然後可以通過 docker logs 命令來檢視瀏覽器訪問應用的資訊:

userdeMacBook-Pro:~ user$ docker logs web
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [15/Dec/2018 10:20:08] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [15/Dec/2018 10:20:08] "GET /favicon.ico HTTP/1.1" 404 -

 

-p(小寫的)則可以指定要對映的埠,並且,在一個指定埠上只可以繫結一個 容器。

支援的格式有:

  • ip地址:主機埠:容器埠
  • ip地址::容器埠
  • 主機埠:容器埠

1》 對映所有介面地址

使用主機埠:容器埠格式,本地的 5000 埠可以對映到容器的 5000 端 口,如:

sudo docker run -d -p 5000:5000 training/webapp python app.py

此時預設會繫結本地所有介面上的所有ip地址

 

2》對映到指定地址的指定埠

使用 ip地址:主機埠:容器埠格式指定對映使用一個特定地址,比如 localhost 地址 127.0.0.1

 

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

 

3》對映到指定地址的任意埠

使用ip地址::容器埠格式繫結 localhost 的任意埠到容器的 5000 埠,本地主機會自動分配一個埠:

docker run -d -p 127.0.0.1::5000 training/webapp python app.py

還可以使用 udp 標記來指定 udp

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

 

 

檢視對映埠配置——docker port

檢視當前對映的埠配置,也可以檢視到繫結的地址

userdeMacBook-Pro:~ user$ docker port web 5000
0.0.0.0:32768

⚠️:

容器有自己的內部網路和 ip 地址(使用 docker inspect可以獲取所有的變數,Docker 還可以有一個可變的網路配置。)

-p 標記可以多次使用來繫結多個埠,如:

docker run -d -p 5000:5000  -p 3000:80 training/webapp python app.py

 

 

2)容器互聯

容器的連線(linking)系統是除了埠對映外,另一種跟容器中應用互動的方式。

該系統會在源和接收容器之間建立一個隧道,接收容器可以看到源容器指定的信息。

 

1》自定義容器命名——使用 --name引數

連線系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名

當建立容器的時候,系統預設會分配一個名字。

但是自定義命名容器有2個好處:

  • 自定義的命名,比較好記,比如一個web應用容器我們可以給它起名叫web
  • 當要連線其他容器時候,可以作為一個有用的參考點,比如連線web容器到db 容器
docker run -d -P --name web training/webapp python app.py

可以使用docker ps -l檢視,也可以使用 docker inspect來檢視容器的名字

userdeMacBook-Pro:~ user$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1ad71e9d3808        training/webapp     "python app.py"     About an hour ago   Up About an hour    0.0.0.0:32768->5000/tcp   web
userdeMacBook-Pro:~ user$ docker inspect -f "{{ .Name }}" 1ad71e9d3808
/web

注意:容器的名稱是唯一的。如果已經命名了一個叫 web 的容器,當你要再次使用 web 這個名稱的時候,需要先用docker rm來刪除之前建立的同名容器。

 

在執行 docker run的時候如果新增 -rm 標記,則容器在終止後會立刻刪除。

⚠️-rm 和 -d(後臺執行)引數不能同時使用。

 

 

2》 容器互聯——使用 --link引數

格式: --link name:alias

其中 name是要連結的容器的名稱, alias是這個連線的別名

 

先建立一個新的資料庫容器db

userdeMacBook-Pro:~ user$ docker run -d --name db training/postgres
Unable to find image 'training/postgres:latest' locally
latest: Pulling from training/postgres
a3ed95caeb02: Pull complete 
6e71c809542e: Pull complete 
2978d9af87ba: Pull complete 
e1bca35b062f: Pull complete 
500b6decf741: Pull complete 
74b14ef2151f: Pull complete 
7afd5ed3826e: Pull complete 
3c69bb244f5e: Pull complete 
d86f9ec5aedf: Pull complete 
010fabf20157: Pull complete 
Digest: sha256:a945dc6dcfbc8d009c3d972931608344b76c2870ce796da00a827bd50791907e
Status: Downloaded newer image for training/postgres:latest
2fca948912dcfd40849d1f2080db69bed0f51a9b1c1a10ceba7e3bf7d0960e5f

刪除之前建立的 web 容器:

userdeMacBook-Pro:~ user$ docker rm -f web
web

然後建立一個新的 web 容器,並將它連線到 db 容器:

userdeMacBook-Pro:~ user$ docker run -d -P --name web --link db:db training/webapp python app.py
d734bf29ad945f25e65e451d5d207b007a24004002dbaa722b28e02fb46ed51e

此時,db 容器和 web 容器成功建立了互聯關係

使用 docker ps來檢視容器的連線:

userdeMacBook-Pro:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
d734bf29ad94        training/webapp     "python app.py"          7 seconds ago       Up 6 seconds        0.0.0.0:32769->5000/tcp   web
2fca948912dc        training/postgres   "su postgres -c '/us…"   39 seconds ago      Up 38 seconds       5432/tcp                  db

這樣子就不用像上面一樣需要使用-p 或 -P對映埠了。

 

Docker 通過 2 種方式為容器公開連線資訊:

  • 環境變數
  • 更新 /etc/hosts檔案

首先是環境變數方式:

使用 env 命令來檢視 web 容器的環境變數:

userdeMacBook-Pro:~ user$ docker run --rm --name web --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=994146340f40
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web/db
DB_ENV_PG_VERSION=9.3
HOME=/root

其中 DB_ 開頭的環境變數是供 web 容器連線 db 容器使用,字首採用大寫的連線別名。

 

然後更新 /etc/hosts檔案方式,Docker 添加了host資訊到父容器的 /etc 的檔案。下面是父容器 webhosts檔案:

userdeMacBook-Pro:~ user$ docker run -t -i --rm --link db:db training/webapp /bin/bash
[email protected]:/opt/webapp# 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    db 2fca948912dc  //db容器的 容器名和ID
172.17.0.2    36078e6ba58f  //web容器的ID

可以在 web 容器中安裝 ping 命令來測試跟db容器的連通:

[email protected]:/opt/webapp# apt-get install -yqq inetutils-ping
(Reading database ... 18233 files and directories currently installed.)
Removing ubuntu-minimal (1.325) ...
Removing iputils-ping (3:20121221-4ubuntu1.1) ...
Selecting previously unselected package inetutils-ping.
(Reading database ... 18221 files and directories currently installed.)
Preparing to unpack .../inetutils-ping_2%3a1.9.2-1_amd64.deb ...
Unpacking inetutils-ping (2:1.9.2-1) ...
Setting up inetutils-ping (2:1.9.2-1) ...
[email protected]:/opt/webapp# ping db
PING db (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.099 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.120 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.202 ms
64 bytes from 172.17.0.3: icmp_seq=4 ttl=64 time=0.101 ms
64 bytes from 172.17.0.3: icmp_seq=5 ttl=64 time=0.133 ms
64 bytes from 172.17.0.3: icmp_seq=6 ttl=64 time=0.129 ms
64 bytes from 172.17.0.3: icmp_seq=7 ttl=64 time=0.104 ms
64 bytes from 172.17.0.3: icmp_seq=8 ttl=64 time=0.129 ms
64 bytes from 172.17.0.3: icmp_seq=9 ttl=64 time=0.130 ms
64 bytes from 172.17.0.3: icmp_seq=10 ttl=64 time=0.128 ms
64 bytes from 172.17.0.3: icmp_seq=11 ttl=64 time=0.128 ms
64 bytes from 172.17.0.3: icmp_seq=12 ttl=64 time=0.063 ms
64 bytes from 172.17.0.3: icmp_seq=13 ttl=64 time=0.130 ms
64 bytes from 172.17.0.3: icmp_seq=14 ttl=64 time=0.130 ms
^C--- db ping statistics ---
15 packets transmitted, 15 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.063/0.119/0.202/0.032 ms

ping 來測試db容器,它會解析成 172.17.0.3*注意:官方的 ubuntu 映象 預設沒有安裝 ping,需要自行安裝

使用者可以連結多個父容器到子容器,比如可以連結多個 web db 容器上

 

 

3) 高階網路配置

1》預設網路

docker network命令使用

1.首先檢視docker network命令怎麼使用

userdeMBP:~ user$ docker network --help

Usage:    docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network 將容器連線到網路上,預設連線的是bridge網路
  create      Create a network 建立一個網路,使用--driver引數指定網路型別
  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.

 

2.然後檢視目前的網路情況,初始時是預設有下面的三類網路的

userdeMBP:~ user$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
5a8633141529        bridge              bridge              local
78c9cc883ccc        host                host                local
454aa19cf801        none                null                local

 Docker 啟動時,會自動在主機上建立一個虛擬網橋,實際上是 Linux 的一個 bridge(即這上面的bridge網路),可以理解為一個軟體交換機。它會在掛載到它的網口之間進行轉發。 

 

none網路——即什麼都沒有的網路

開啟兩個連線了預設bridge網路的ubuntu容器和一個連線了none網路的ubuntu容器,然後檢視它們的ip配置資訊,並ping本地主機看能否連通:

當你想要實現一些對安全要求比較高並且不需要聯網的操作時,就可以使用none網路

上圖可見,如果你使用的是bridge網路,你是可以ping通你現在的主機的網路的;如果你是none網路,你是無法連線網路的

比如你有些容器的作用時生成金鑰檔案等操作時,使用none網路就能保證金鑰檔案的安全行,不會被竊取

 

host網路

打開了一個連線了host網路的ubuntu容器,然後檢視其ip資訊

userdeMBP:~ user$ docker run -it --network=host --name=ubuntu3 ubuntu:14.04 /bin/bash 
[email protected]-025000000001:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:50:00:00:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.168.65.3/24 brd 192.168.65.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::50:ff:fe00:1/64 scope link 
       valid_lft forever preferred_lft forever
3: [email protected]: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/ipip 0.0.0.0 brd 0.0.0.0
4: [email protected]: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1
    link/tunnel6 :: brd ::
5: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:c4:a0:b5:3e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c4ff:fea0:b53e/64 scope link 
       valid_lft forever preferred_lft forever
9: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 96:2b:b2:b1:de:52 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::942b:b2ff:feb1:de52/64 scope link 
       valid_lft forever preferred_lft forever
11: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ba:80:0c:67:c0:9e brd ff:ff:ff:ff:ff:ff
    inet6 fe80::b880:cff:fe67:c09e/64 scope link 
       valid_lft forever preferred_lft forever
13: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 72:51:1e:7b:01:0c brd ff:ff:ff:ff:ff:ff
    inet6 fe80::7051:1eff:fe7b:10c/64 scope link 
       valid_lft forever preferred_lft forever

(參考https://blog.csdn.net/liukuan73/article/details/51603074)

因為docker使用了Linux的Namespace技術來進行資源的隔離,如PID Namespace隔離程序,Mount Namespace隔離檔案系統,Network Namespace隔離網路等

使用bridge網路時,一個容器會分配一個獨立的Network Namespace。但是如果使用的是host網路,容器將不會獲得一個獨立的Network Namespace,而是與宿主機公用一個Network Namespace。在這種情況下,容器將不會虛擬出自己的網絡卡,配置自己的IP等,而是使用宿主機的IP和埠。容器可以和宿主機一樣,使用宿主機的eth0,實現和外界的通訊。換言之,容器的IP地址即為宿主機eth0的IP地址

因此上面開啟的容器使用ip addr命令時,發現得到的資訊都是宿主機上的資訊。因此當外界想要訪問該容器時,直接訪問宿主機的IP和容器開放的埠即可,不需要任何的NAT轉換,就像直接執行在宿主機一樣。

⚠️但是容器的其他方面,如檔案系統、程序列表等還是和宿主機隔離的

host網路其實是bridge網路的一種補充,但是也有不足的地方:

  • 容器網路環境隔離性弱化,即容器不再擁有隔離、獨立的網路棧
  • 由於網路隔離性的弱化,該容器會與宿主機共享競爭網路棧的使用
  • 容器內部將不再擁有所有的埠資源,原因是部分埠資源已經被宿主機本身的服務佔用,還有部分埠已經用以bridge網路模式容器的埠對映

 

 同時檢視host網路此時的詳細資訊:

userdeMacBook-Pro:~ user$ docker network inspect 78c9cc883ccc
[
    {
        "Name": "host",
        "Id": "78c9cc883ccc186865ab14c31f7d3ebafecd725e2524a7ab3bb550fb91a73705",
        "Created": "2018-07-21T02:08:33.191948595Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "084fd2f2927a18f8c6003f7ee70e5fef80e6ffca6246f75d8ada71c5be76a8bf": {
                "Name": "ubuntu3", //即上面連線了host網路的容器
                "EndpointID": "a57a350fb83a4c45d276eefaf29c0ef13278af2cfbfa3a6a7c9f36a1430f07cb",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "3c3f1551282d8f983faf974d96e366262d133da662108c43506e6dcb16902b4c": {
                "Name": "k8s_POD_etcd-docker-for-desktop_kube-system_1f439806cd68459343e83b51b9f719eb_0",
                "EndpointID": "6c2f76ff13c3ebe545a1c3f36d864d9525aadaebced72270abb88fe92aaed69e",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "636bc1e866ed8f215261e30a522feeb91b2a8417be0a4f55324a013e7efadfcf": {
                "Name": "k8s_POD_kube-controller-manager-docker-for-desktop_kube-system_ac5424d04b6928ef15ca302888630c4e_0",
                "EndpointID": "25234b9025957c835fc0669334affd6a74bc03d9b679e50b2fe713cbfe1c9f8c",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "7a58a9d0aa01abb785392264a8c5406593d4fa2b6749f27094b4f80b939e1ab4": {
                "Name": "k8s_POD_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_0",
                "EndpointID": "3a83f9b42be6f8b0a68e440b839aff4326d4d524590f5471ed6882560bb9658d",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            },
            "f9d84fe15fe1591d15d76fad2162285426aef4a700ed78c54b28c4a71b19c28c": {
                "Name": "k8s_POD_kube-apiserver-docker-for-desktop_kube-system_f10287b5cba0247140caeedc2e1fd602_0",
                "EndpointID": "3b43272e8ab15a3fe91d1c04cae74af2ce560b8431aaa3027bfe81b7e41fa531",
                "MacAddress": "",
                "IPv4Address": "",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

 

bridge網路

Docker 會隨機分配一個本地未佔用的私有網段(在 RFC1918 中定義)中的一 個地址給 docker0介面。比如典型的 172.17.42.1,掩碼為255.255.0.0。此後啟動的容器內的網口也會自動分配一個同一網段( 172.17.0.0/16 )的地址。

當建立一個 Docker 容器的時候,同時會建立了一對 veth pair介面(當資料包傳送到一個介面時,另外一個介面也可以收到相同的資料包)。這對介面一端在容器內,即eth0 ——下面開啟的容器檢視IP資訊時的eth0;

userdeMBP:~ user$ docker run -it ubuntu:14.04 /bin/bash
[email protected]:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:03  
          inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:508 (508.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

[email protected]:/# ping 10.240.203.84
PING 10.240.203.84 (10.240.203.84) 56(84) bytes of data.
64 bytes from 10.240.203.84: icmp_seq=1 ttl=37 time=0.647 ms
64 bytes from 10.240.203.84: icmp_seq=2 ttl=37 time=0.513 ms
64 bytes from 10.240.203.84: icmp_seq=3 ttl=37 time=0.674 ms
^C
--- 10.240.203.84 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2043ms
rtt min/avg/max/mdev = 0.513/0.611/0.674/0.073 ms
[email protected]:/# ping ww.baidu.com
PING ps_other.a.shifen.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=37 time=46.3 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=37 time=48.1 ms
64 bytes from 123.125.114.144: icmp_seq=3 ttl=37 time=47.1 ms
^C
--- ps_other.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 46.341/47.210/48.168/0.748 ms

可以ping通本地主機網路可外部網路

另一端在本地並被掛載到docker0網橋,名稱以 veth開頭(例如vethAQI2QT)。通過這種方式,主機可以跟容器通訊,容器之間也可以相互通訊。Docker 就建立了在主機和所有容器之間一個虛擬共享網路。

 因為我使用的是mac系統,為了使用Linux的命令來檢視網橋資訊,可以在剛剛使用--network=host的容器上進行檢視:

[email protected]025000000001:/# brctl show //沒有安裝brctl
bash: brctl: command not found

[email protected]-025000000001:/# apt-get install bridge-utils
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package brctl-utils //沒有找到這個包,可能需要更新下源

[email protected]-025000000001:/# apt-get update  //更新源             
Ign http://archive.ubuntu.com trusty InRelease                                 
Get:1 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]          
...    
Get:21 http://archive.ubuntu.com trusty/multiverse amd64 Packages [169 kB]     
Fetched 13.3 MB in 52s (252 kB/s)                                              
Reading package lists... Done

[email protected]-025000000001:/# apt-get install bridge-utils //然後重新下載即可
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  bridge-utils
0 upgraded, 1 newly installed, 0 to remove and 6 not upgraded.
...

然後就可以檢視網橋資訊了

[email protected]025000000001:/# brctl show
bridge name bridge id           STP enabled    interfaces
docker0     8000.0242c4a0b53e   no             veth3406c1a
                                               veth4a027b0
                                               vethcee69e2

可以看見掛載到docker0網橋這邊的介面為veth3406c1aveth4a027b0vethcee69e2

檢視預設使用的bridge網路,如果在開啟容器時沒有制定,一般就會預設使用的是bridge網路。因為docker的橋接網路使用虛擬網橋,bridge網路用於同一主機上的docker容器相互通訊,連線到同一個網橋的docker容器可以相互通訊

userdeMacBook-Pro:~ user$ docker network inspect a782ffdae16f
[
    {
        "Name": "bridge",
        "Id": "a782ffdae16f9c3dbfec0a992a9a6d605429c657263dc83f33c71ad499f5e2b8",
        "Created": "2018-12-19T01:34:27.308734153Z",
        "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": {
            "481d94d59f9f363fd3b00f09b793c9d7e1d90169626a7170f4d1012949c9ace4": {
                "Name": "wonderful_matsumoto",
                "EndpointID": "9dd9be72550d24135202f430dfeea0fb0132d52089045c933a5bfb6fd5ddb779",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "876cdcff687d83e5ea85d3c2eb16d01aac62bfd3e5051e5e65f0fd49230d7333": {
                "Name": "ubuntu2",
                "EndpointID": "9c16f983ff075f1499dcc1de4ead5ac77097829a68ff868a328e90e336660e29",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "b4a512f0230fa598e7e40171e0597ea6db0740105449314a1a3767dcaa4a0edb": {
                "Name": "registry",
                "EndpointID": "b164dd37f23eac13364f1378642c5e8b88b783ea48fbbce26017ab02b33b542e",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",//說明這個是預設的bridge網路
            "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",//預設網橋的名字為docker0
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
//上面可見為開啟的三個容器分別分配了172.17.0.0/16網段下的地址
userdeMacBook-Pro:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
084fd2f2927a        ubuntu:14.04        "/bin/bash"              About an hour ago   Up About an hour                             ubuntu3
876cdcff687d        ubuntu:14.04        "/bin/bash"              About an hour ago   Up About an hour                             ubuntu2
e6ba811ecb6a        ubuntu:14.04        "/bin/bash"              About an hour ago   Up About an hour                             thirsty_germain
481d94d59f9f        ubuntu:14.04        "/bin/bash"              About an hour ago   Up About an hour                             wonderful_matsumoto
b4a512f0230f        registry            "/entrypoint.sh /etc…"   3 days ago          Up 2 hours          0.0.0.0:5000->5000/tcp   registry
參考:https://blog.csdn.net/dhaiuda/article/details/82820318 連線到同一個bridge網路的容器(即它們地址都在同一個網段下)可以互相訪問彼此使用-p或--publish釋出的埠 我們也可以自定義自己的bridge網路,而且docker文件也建議構建自己的網路,因為預設bridge網路是有缺陷的   自定義和預設bridge網路的區別:
  • 預設橋接網路中的容器只能通過IP地址訪問其他容器(除非使用遺留的-link指令連線兩個容器),而自定義橋接網路提供DNS解析,可以通過容器的名字或是別名訪問其他容器
  • 容器可以自由的進入或是退出自定義橋接(bridge)網路,如果想要退出預設橋接(bridge)網路,需要先停止容器的執行,然後重新建立該容器,並指定需要連線的其他網路
  • 如果更改了預設橋接網路的網路配置,需要重新啟動docker,並且由於預設橋接網路只有一個,因此所有容器的網路配置都是一樣的,而使用者自定義網路可以在建立時指定網路配置(例如預設閘道器、MTU等),不需要重啟docker,靈活性更高
  • 在預設橋接網路中,可以通過--link引數連線兩個容器來共享環境變數,使用者自定義網路中無法使用這種方式,但是docker提供了更好的方式:                 

    1.多個容器可以使用docker volume(這是docker儲存資料的一種方式,以後會介紹)掛載到同一個檔案,在檔案中指明環境變數,從而實現所容器的環境變數共享                                                     

    2.多個容器可以使用同一個docker-compose.yml(與docker service有關)檔案啟動 ,可以在該檔案中定義共享環境變數                                                   

    3.可以使用swarm services,並且通過  secrets 和 configs  (這兩個還沒看)實現環境變數共享     <