1. 程式人生 > >docker 四種網路模型

docker 四種網路模型

一.docker網路基礎知識

Docker在建立容器時有四種網路模式,bridge為預設不需要用–net去指定,其他三種模式需要在建立容器時使用–net去指定。

bridge模式,使用–net=bridge指定,預設設定。
none模式,使用–net=none指定。
host模式,使用–net=host指定。
container模式,使用–net=container:容器名稱或ID指定

bridge模式:docker網路隔離基於網路名稱空間,在物理機上建立docker容器時會為每一個docker容器分配網路名稱空間,並且把容器IP橋接到物理機的虛擬網橋上。
none模式:此模式下建立容器是不會為容器配置任何網路引數的,如:容器網絡卡、IP、通訊路由等,全部需要自己去配置。

host模式:此模式建立的容器沒有自己獨立的網路名稱空間,是和物理機共享一個Network Namespace,並且共享物理機的所有埠與IP,並且這個模式認為是不安全的。

container模式:此模式和host模式很類似,只是此模式建立容器共享的是其他容器的IP和埠而不是物理機,此模式容器自身是不會配置網路和埠,建立此模式容器進去後,你會發現裡邊的IP是你所指定的那個容器IP並且埠也是共享的,而且其它還是互相隔離的,如程序等。

docker網路初始化的過程如下:

初始化裝置 —> 初始化bridge —> 初始化iptables —> 初始化ip foward(核心路由轉發) — > register network job function —> end

二.docker網路基礎配置
1 .doker網路預設

[root@foundation6 ~]# ip addr show docker0 
9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:1f:31:2f:82 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80
::42:1fff:fe31:2f82/64 scope link valid_lft forever preferred_lft forever ##Docker 在啟動時會建立一個虛擬網橋 docker0,預設地址為 172.17.0.1/16, 容器啟動後都會被橋接到 docker0 上,並自動分配到一個 IP 地址。

2.如何修改 docker 的預設網路配置(如果需要設定的ip地址,不能和宿主機中的所有ip地址在一個網段)
1)用命令修改,重啟後失效

systemctl stop docker.service

ip link set dev docker0 down


ip addr del 172.17.0.1/16 dev docker0

ip addr add 192.168.10.1/24 dev docker0


ip link  set dev docker0 up

systemctl start  docker.service

2)修改配置檔案永久生效

[root@foundation6 ~]# systemctl stop docker        ##在修改配置檔案前停掉服務
[root@foundation6 ~]# cp /lib/systemd/system/docker.service /etc/systemd/system/docker.service
##配置檔案的位置可以通過檢視服務的狀態看到,一般不對與原始檔改動,複製一份到/etc/systemd/system/docker.service

[root@foundation6 ~]# vim /etc/systemd/system/docker.service
[Unit]                  
Description=Docker Application Container Engine ##一段描述這個Unit檔案的文字,通常只是簡單的一句話
Documentation=https://docs.docker.com       ##指定服務的文件,可以使一個或多個文件的URL路徑
After=network.target docker.socket      ##會在後面列出的所有模組全部啟動完成以後,才會啟動當前的服務
Requires=docker.socket              ##依賴的其他 Unit 列表,列在其中的 Unit 模組會在這個服務啟動的同時被啟動,並且如果其中有任意一個服務啟動失敗,這個服務也會被終止。

[Service]                   
##這個段是 .service 檔案獨有的,也是對於服務配置最重要的部分
Type=notify                 ##服務的型別
ExecStart=/usr/bin/docker daemon -H fd:// --bip="192.168.10.1/24" --insecure-registry 172.25.254.66:5000        ##指定服務啟動的主要命令,--bip="192.168.10.1/24"設定網橋地址
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0

[Install]                   
##這部分配置需要通過 systemctl enable 命令來啟用,並且可以通過 systemctl disable 命令禁用
WantedBy=multi-user.target          ##列出依賴當前服務的模組
[root@foundation6 ~]# systemctl daemon-reload  ##重新載入
[root@foundation6 ~]# systemctl start docker   ##啟動服務
[root@foundation6 ~]# ip addr show docker0 
9: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:1f:31:2f:82 brd ff:ff:ff:ff:ff:ff
    inet **192.168.10.1/24** scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:1fff:fe31:2f82/64 scope link 
       valid_lft forever preferred_lft forever
[root@foundation6 ~]# ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.033 ms

3)docker網路模型詳解
◆ 橋接

在bridge模式下,連在同一網橋上的容器可以相互通訊(如果為了安全考慮,也可以設定禁止它們通訊),容器也可以與外部通訊,資料包從容器出來,由於容器是橋接到docker0上,所以資料包會發到docker0上,檢視iptables的策略,會發現有一個策略,將源地址從172.17.0.1的包進行源地址轉換,轉化成宿主機的網絡卡地址,(注意ip foward功能要開啟)因此只要宿主機可以與外部通訊,那麼容器就可以與外部通訊。

Bridge 橋接模式的實現步驟如下:

1 Docker Daemon 利用 veth pair 技術,在宿主機上建立兩個虛擬網路介面裝置,假設為veth0和veth1。而 veth pair 技術的特性可以保證無論哪一個 veth 接收到網路報文,都會將報文傳輸給另一方。

2 Docker Daemon 將 veth0 附加到 Docker Daemon 建立的 docker0 網橋上。保證宿主機的網路報文可以發往 veth0

3 Docker Daemon 將 veth1 新增到 Docker Container 所屬的 namespace 下,並被改名為 eth0。如此一來,保證宿主機的網路報文若發往 veth0,則立即會被 eth0 接收,實現宿主機到Docker Container 網路的聯通性;同時,也保證 Docker Container 單獨使用 eth0,實現容器網路環境的隔離性。

bridge 橋接模式下的 Docker Container 在使用時,並非為開發者包辦了一切。最明顯的是,該模式,Docker Container 不具有一個公有 IP,即和宿主機的 eth0 不處於同一個網段。導致的結果是宿主機以外的世界不能直接和容器進行通訊。雖然 NAT 模式經過中間處理實現了這一點,但是 NAT 模式仍然存在問題與不便,如:容器均需要在宿主機上競爭埠,容器內部服務的訪問者需要使用服務發現獲知服務的外部埠等。另外 NAT 模式由於是在三層網路上的實現手段,故肯定會影響網路的傳輸效率。

[root@foundation6 ~]# docker run -d --name web1 nginx
90bf8ed3e5b93011d17ad3a8fe055858e75b16773de0f72dcf5c1519133a4d7c
 ##使用docker映象nginx:latest 以  後臺模式啟動一個容器,並將容器命名為web1,-d打入後臺,並返回容器ID,--name 指定容器名稱
[root@foundation6 ~]# docker run -d --name web2 -p 8000:80 nginx
6b9a27a9a78b1f4276337776b3401f11f9b52eaa096fea673e67b4c7439bbc08
## 使用映象nginx:latest以後臺模式啟動一個容器,將容器的80埠對映到宿主機的8080埠,即當訪問宿主機的8000埠時會轉到容器的80埠,也就是nginx的介面
-p進行了埠對映,將容器web2的80埠對映到宿主機的8000埠,進行完該操作檢視iptables會發現多了一條策略
[root@foundation6 ~]# iptables -t nat -nL
....

DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:80

[root@foundation6 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
6b9a27a9a78b        nginx               "nginx -g 'daemon off"   7 seconds ago       Up 4 seconds        443/tcp, 0.0.0.0:8000->80/tcp   web2
90bf8ed3e5b9        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 5 minutes        80/tcp, 443/tcp                 web1

測試:在宿主機上分別訪問172.17.0.3和127.25.254.66:8000就會發現可以看到nginx的測試頁面
這裡寫圖片描述

檢視埠:

[root@foundation6 ~]# netstat -antlp |grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1479/httpd          
tcp        0      0 192.168.0.126:56394     203.208.43.122:80       ESTABLISHED 9432/firefox       
[root@foundation6 ~]# netstat -antlp |grep :8000
tcp        0      0 172.25.254.66:36688     172.25.254.66:8000      ESTABLISHED 9432/firefox        
tcp6       0      0 :::8000                 :::*                    LISTEN      21983/docker-proxy 

◆ Host 網路模式:使用與宿主機相同的名稱空間
host 模式是 bridge 橋接模式很好的補充。採用 host 模式的 Docker Container,可以直接使用宿主機的 IP 地址與外界進行通訊,若宿主機的 eth0 是一個公有 IP,那麼容器也擁有這個公有 IP。同時容器內服務的埠也可以使用宿主機的埠,無需額外進行 NAT 轉換。當然,有這樣的方便,肯定會損失部分其他的特性,最明顯的是 Docker Container 網路環境隔離性的弱化,即容器不再擁有隔離、獨立的網路棧。另外,使用 host 模式的 Docker Container 雖然可以讓容器內部的服務和傳統情況無差別、無改造的使用,但是由於網路隔離性的弱化,該容器會與宿主機共享競爭網路棧的使用;另外,容器內部將不再擁有所有的埠資源,原因是部分埠資源已經被宿主機本身的服務佔用,還有部分埠已經用以 bridge 網路模式容器的埠對映。

[root@foundation6 ~]# docker run -it --name web4 --net host ubuntu
##使用映象ubuntu以互動式執行一個容器,-i 指執行互動式,-t 為容器重新分配一個偽終端,--name 為容器指定名稱為web4,--net指定容器的網路連線型別,這裡指定的是host模式
root@foundation6:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
.......

[root@foundation6 ~]# docker exec web3 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
.......

##web3 和web4使用的是橋接模式,會直接使用宿主機的網路

測試:
在網頁訪問宿主機的80埠就會發現訪問到了nginx頁面並不是宿主機真實的apache介面,我們的宿主機並沒有配置nginx服務:
這裡寫圖片描述

◆ Container 網路模式:
(1) 查詢 other container(即需要被共享網路環境的容器)的網路 namespace;
(2) 將新建立的 Docker Container(也是需要共享其他網路的容器)的 namespace,使用other container 的 namespace。
Docker Container 的 other container 網路模式,可以用來更好的服務於容器間的通訊。在這種模式下的 Docker Container 可以通過 localhost 來訪問 namespace 下的其他容器,傳輸效率較高。雖然多個容器共享網路環境,但是多個容器形成的整體依然與宿主機以及其他容器形成網路隔離。另外,這種模式還節約了一定數量的網路資源。但是需要注意的是,它並沒有改善容器與宿主機以外世界通訊的情況。

[root@foundation6 ~]# docker run -it --name web5 --net container:web4 ubuntu
##web5會直接使用web4的網路,因為web4使用的是host模型使用的是宿主機網路,因此web5顯示的也是宿主機的網路

**root@foundation6:/# ip addr**
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp7s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff
3: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c4:8e:8f:0c:a9:71 brd ff:ff:ff:ff:ff:ff
4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff
    inet 172.25.254.66/24 brd 172.25.254.255 scope global br0
       valid_lft forever preferred_lft forever
    inet 172.25.66.250/24 brd 172.25.66.255 scope global br0
       valid_lft forever preferred_lft forever
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500
    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff
7: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff
8: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN group default qlen 500
    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff
9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:75:58:f2:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:75ff:fe58:f2fa/64 scope link 
       valid_lft forever preferred_lft forever
##Docker 在啟動時會建立一個虛擬網橋 docker0,容器啟動後都會被橋接到 docker0 上,並自動分配到一個 IP 地址
11: veth3fc6eda@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 62:fa:23:8b:95:9f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::60fa:23ff:fe8b:959f/64 scope link 
       valid_lft forever preferred_lft forever
13: vethb285c19@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 66:fa:71:07:e2:1a brd ff:ff:ff:ff:ff:ff
    inet6 fe80::64fa:71ff:fe07:e21a/64 scope link 
       valid_lft forever preferred_lft forever

[root@foundation6 ~]#  docker stop `docker ps -aq`     ##停止所有的容器
c6e2fe90a785
3314207a76dd
b81172cd9aef
6b9a27a9a78b
90bf8ed3e5b9
[root@foundation6 ~]# docker rm `docker ps -aq`            ##刪除所有的容器
c6e2fe90a785
3314207a76dd
b81172cd9aef
6b9a27a9a78b
90bf8ed3e5b9

◆ None 網路模式:
網路環境為 none,即不為 Docker Container 任何的網路環境。一旦 Docker Container 採用了none 網路模式,那麼容器內部就只能使用 loopback 網路裝置,不會再有其他的網路資源。可以說 none 模式為 Docker Container 做了極少的網路設定,在沒有網路配置的情況下,作為 Docker 開發者,才能在這基礎做其他無限多可能的網路定製開發。這也恰巧體現了 Docker 設計理念的開放。

在 none 網路模式下分配固定 ip:
netns 是在 linux 中提供網路虛擬化的一個專案,使用 netns 網路空間虛擬化可以在本地虛擬化出多個網路環境,目前 netns 在 lxc 容器中被用來為容器提供網路。使用 netns 建立的網路空間獨立於當前系統的網路空間,其中的網路裝置以及 iptables 規則等都是獨立的,就好像進入了另外一個網路一樣。

[root@foundation6 ~]#  docker run -it --net none --name vm1 ubuntu 
##使用映象ubuntu以互動式執行一個容器,-i 指執行互動式,-t 為容器重新分配一個偽終端,--name 為容器指定名稱為vm1,--net指定容器的網路連線型別,這裡指定的是none模式
root@e0146efca427:/# 
root@e0146efca427:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever           ##沒有ip

容器間互聯:
–link 引數可以在不對映埠的前提下為兩個容器間建立安全連線, –link 引數可以連線一個或多個容器到將要建立的容器,–link表示新增連線到另一個容器。
–link 引數的格式為 –link name:alias,其中 name 是要連結的容器的名稱,alias 是這個連線的別名。

[root@foundation6 ~]# ip link add veth0 type veth peer name veth1   
##將veth裝置一端接入ovs網橋br-int中
[root@foundation6 ~]# brctl addif docker0 veth0        ##將veth0加入網橋
[root@foundation6 ~]#  brctl show
bridge name bridge id       STP enabled interfaces
br0     8000.f0761c81e3b6   no      enp7s0f1
docker0     8000.02427558f2fa   no      veth0      
##可以看到vnet0已經加入網橋
virbr0      8000.525400e20c7d   yes     virbr0-nic
virbr1      8000.525400914b52   yes     virbr1-nic
[root@foundation6 ~]# ip link set up veth1             ##啟動新加埠
[root@foundation6 ~]# ip link set up veth0
[root@foundation6 ~]# docker inspect vm1 | grep Pid    ##配置容器的網路namespace
            "Pid": 6328,
            "PidMode": "",
            "PidsLimit": 0,
[root@foundation6 ~]# cd /proc/6328/ns/
[root@foundation6 ns]# ls
ipc  mnt  net  pid  user  uts
[root@foundation6 ns]# ll
total 0
lrwxrwxrwx 1 root root 0 Aug 13 07:51 ipc -> ipc:[4026532403]
lrwxrwxrwx 1 root root 0 Aug 13 07:51 mnt -> mnt:[4026532401]
lrwxrwxrwx 1 root root 0 Aug 13 07:42 net -> net:[4026532406]
lrwxrwxrwx 1 root root 0 Aug 13 07:51 pid -> pid:[4026532404]
lrwxrwxrwx 1 root root 0 Aug 13 07:51 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Aug 13 07:51 uts -> uts:[4026532402]
[root@foundation6 ns]# ln -s /proc/6328/ns/net /var/run/netns/6328  ##製作軟連線
[root@foundation6 ns]# ip link set veth1 netns 6328         ##將veth1連線容器網路
[root@foundation6 ns]# docker exec vm1 ip addr              ##檢視容器網路
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
14: veth1@if15: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 36:b8:d2:64:35:7c brd ff:ff:ff:ff:ff:ff
[root@foundation6 ns]# ip netns exec 6328 ip link set veth1 name eth0
##veth1改名為eth0
[root@foundation6 ns]# ip netns exec 6328 ip link set eth0 up       ##啟用eth0裝置
[root@foundation6 ns]# ip netns exec 6328 ip addr add 192.168.10.100/24 dev eth0 
##為 namespace 中指定裝置設定 ip
[root@foundation6 ns]# docker exec vm1 ip addr                      ##ip設定成功
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
14: eth0@if15: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state LOWERLAYERDOWN group default qlen 1000
    link/ether 36:b8:d2:64:35:7c brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 scope global eth0
       valid_lft forever preferred_lft forever
[root@foundation6 ns]# ip netns exec 6328 route add default gw 192.168.10.1##設定閘道器

[root@foundation6 ns]#  ip link set dev veth0 up
[root@foundation6 ns]# docker exec vm1 ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.046 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.042 ms
[root@foundation6 ns]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp7s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether f0:76:1c:81:e3:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.126/24 brd 192.168.0.255 scope global dynamic enp7s0f1
       valid_lft 6856sec preferred_lft 6856sec
    inet6 fe80::f276:1cff:fe81:e3b6/64 scope link 
       valid_lft forever preferred_lft forever
3: wlp8s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether c4:8e:8f:0c:a9:71 brd ff:ff:ff:ff:ff:ff
4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.25.254.66/24 brd 172.25.254.255 scope global br0
       valid_lft forever preferred_lft forever
    inet 172.25.66.250/24 brd 172.25.66.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::f276:1cff:fe81:e3b6/64 scope link 
       valid_lft forever preferred_lft forever
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 500
    link/ether 52:54:00:e2:0c:7d brd ff:ff:ff:ff:ff:ff
7: virbr1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff
8: virbr1-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr1 state DOWN qlen 500
    link/ether 52:54:00:91:4b:52 brd ff:ff:ff:ff:ff:ff
9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:75:58:f2:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:75ff:fe58:f2fa/64 scope link 
       valid_lft forever preferred_lft forever
17: veth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master docker0 state UP qlen 1000
    link/ether 1a:b2:39:f5:0f:63 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::18b2:39ff:fef5:f63/64 scope link 
       valid_lft forever preferred_lft forever
[root@foundation6 ns]# docker exec vm1 ping 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.043 ms


[root@foundation6 ns]# docker exec vm1 ping 192.168.10.100
PING 192.168.10.100 (192.168.10.100) 56(84) bytes of data.
64 bytes from 192.168.10.100: icmp_seq=1 ttl=64 time=0.039 ms

[root@foundation6 ns]# docker exec vm1 ping 172.25.254.66
PING 172.25.254.66 (172.25.254.66) 56(84) bytes of data.
64 bytes from 172.25.254.66: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.25.254.66: icmp_seq=2 ttl=64 time=0.036 ms


[root@foundation6 ns]# docker exec vm1 ping baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=51 time=21.5 ms
64 bytes from 123.125.114.144: icmp_seq=2 ttl=51 time=21.4 ms
##此時我們的宿主機和容器的網路是相通的,如果宿主機可以連線外網,我們容器也可以訪問外網
[root@foundation6 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e0146efca427        ubuntu              "/bin/bash"         23 hours ago        Up 54 minutes                           vm1
[root@foundation6 ~]# docker stop vm1          ##停止容器

vm1
[root@foundation6 ~]# docker rm  vm1           ##刪除容器
vm1