乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Docker深入淺出系列 | 單節(jié)點多容器網(wǎng)絡(luò)通信

       小仙女本仙人 2022-01-29

      Docker已經(jīng)上市很多年,不是什么新鮮事物了,很多企業(yè)或者開發(fā)同學(xué)以前也不多不少有所接觸,但是有實操經(jīng)驗的人不多,本系列教程主要偏重實戰(zhàn),盡量講干貨,會根據(jù)本人理解去做闡述,具體官方概念可以查閱官方教程,本章目標如下

      本系列教程導(dǎo)航:
      Docker深入淺出系列 | 容器初體驗
      Docker深入淺出系列 | Image實戰(zhàn)演練

      教程目標

      • 了解Docker容器網(wǎng)絡(luò)通信原理
      • 了解Linux網(wǎng)絡(luò)虛擬化技術(shù)的原理
      • 了解容器在Linux上怎么進行網(wǎng)絡(luò)隔離
      • 了解Docker端口映射配置
      • 了解Docker的網(wǎng)絡(luò)模式
      • 了解如何在Docker使用自定義網(wǎng)絡(luò)
      • 了解Docker網(wǎng)絡(luò)操作的一些常用指令

      準備工作

      本教程是基于第一章創(chuàng)建的虛擬機、操作系統(tǒng)和Docker演示

      • 虛擬機 - VirtualBox-6.0.14-133895-OSX.dmg
      • 虛擬機管理工具 - Vagrant_2.2.6_x86_64.dmg
      • 操作系統(tǒng) - Centos7
      • 容器技術(shù) - Docker

      帶著問題開車

      同一主機兩個容器如何相互通信?

      在同一臺主機內(nèi)的兩個容器是怎么通信的呢?
      兩個容器是怎么做到網(wǎng)絡(luò)隔離的呢?

      怎么從服務(wù)器外訪問容器

      我怎樣才能在服務(wù)器外通過瀏覽器訪問到服務(wù)器里的端口為8080的容器的資源?

      Docker的三種網(wǎng)絡(luò)模式是什么

      Docker的三種網(wǎng)絡(luò)模式是什么,都有什么特點呢?


      Docker網(wǎng)絡(luò)通信原理

      計算機網(wǎng)絡(luò)模型回顧

      在互聯(lián)網(wǎng)世界,兩臺主機要進行通信,是通過兩個網(wǎng)卡/網(wǎng)絡(luò)接口連接起來,接收和發(fā)送數(shù)據(jù)包都經(jīng)過網(wǎng)卡,兩個網(wǎng)卡之間相當(dāng)于建立了一條通信管道。

      Linux中的網(wǎng)卡

      查看網(wǎng)卡接口信息

      1.查看鏈路層網(wǎng)卡信息
      ip link show

      [root@10 /]# ip link show
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
          link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
          link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
      4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
          link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
      

      2.顯示應(yīng)用層網(wǎng)卡信息,可以看到更多詳細信息,例如ip地址
      ip a

      [root@10 /]# ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
          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 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
          inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
             valid_lft 57001sec preferred_lft 57001sec
          inet6 fe80::5054:ff:fe8a:fee6/64 scope link 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
          inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
             valid_lft 143401sec preferred_lft 143401sec
          inet6 fe80::a00:27ff:feba:a28/64 scope link 
             valid_lft forever preferred_lft forever
      4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
          link/ether 02:42:12:9a:b1:a7 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
      

      3.顯示系統(tǒng)所有的網(wǎng)卡
      ls /sys/class/net

      [root@10 /]# ls /sys/class/net
      docker0  eth0  eth1  lo
      

      網(wǎng)卡的操作

      ip a核心信息詳解

      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
          inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
             valid_lft 143401sec preferred_lft 143401sec
          inet6 fe80::a00:27ff:feba:a28/64 scope link 
             valid_lft forever preferred_lft forever
      

      <BROADCAST,MULTICAST,UP,LOWER_UP>這個配置串告訴我們:

      BROADCAST 該接口支持廣播
      MULTICAST 該接口支持多播
      UP 網(wǎng)絡(luò)接口已啟用
      LOWER_UP 網(wǎng)絡(luò)電纜已插入,設(shè)備已連接至網(wǎng)絡(luò)

      其他配置信息:

      mtu 1500 最大傳輸單位(數(shù)據(jù)包大?。?,500字節(jié)
      qdisc pfifo_fast 用于數(shù)據(jù)包排隊
      state UP 網(wǎng)絡(luò)接口已啟用
      group default 接口組
      qlen 1000 傳輸隊列長度
      link/ether 08:00:27:ba:0a:28 接口的 MAC(硬件)地址
      brd ff:ff:ff:ff:ff:ff 廣播地址
      inet 192.168.100.12/24 綁定的IPv4 地址
      brd 192.168.0.255 廣播地址
      scope global 全局有效
      dynamic eth1 地址是動態(tài)分配的
      valid_lft 143401sec IPv4 地址的有效使用期限
      preferred_lft 143401sec IPv4 地址的首選生存期
      inet6 fe80::a00:27ff:feba:a28/64 IPv6 地址
      scope link 僅在此設(shè)備上有效
      valid_lft forever IPv6 地址的有效使用期限
      preferred_lft forever IPv6 地址的首選生存期

      網(wǎng)卡的配置文件

      通過以下命令,可以查看對應(yīng)網(wǎng)卡的配置信息,ifcfg-*文件
      cat /etc/sysconfig/network-scripts/ifcfg-eth0

      修改網(wǎng)卡配置,綁定一個新ip地址

      這里可以修改配置文件ifcfg-*直接復(fù)制一份新的ip配置添加,但是我默認網(wǎng)絡(luò)用的是動態(tài)ip,通過命令會更方便

      [root@10 /]# ip addr add 192.168.0.100/24 dev eth0
      

      從下面可以看到,通過ip a查看,新的ip已經(jīng)成功綁定

      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
          inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
             valid_lft 54131sec preferred_lft 54131sec
          inet 192.168.0.100/24 scope global eth0
             valid_lft forever preferred_lft forever
          inet6 fe80::5054:ff:fe8a:fee6/64 scope link 
             valid_lft forever preferred_lft forever
      

      可以通過以下指定,把新增的ip清理掉
      ip addr delete 192.168.0.100/24 dev eth0

      網(wǎng)卡的重啟與啟動

      重啟網(wǎng)卡
      service network restart / systemctl restart network

      啟動或者關(guān)閉網(wǎng)卡
      ifup/ifdown eth0 or ip link set eth0 up/down

      Linux網(wǎng)絡(luò)虛擬化技術(shù)

      從上文我們可以知道,兩個主機通信是通過兩個網(wǎng)卡連接起來,那在同一個Linux系統(tǒng),怎么模擬多個網(wǎng)絡(luò)環(huán)境,兩個容器是怎么做到網(wǎng)絡(luò)隔離呢?

      在Linux系統(tǒng)中,是通過network namespace來進行網(wǎng)絡(luò)隔離,Docker也是利用該技術(shù),創(chuàng)建一個完全隔離的新網(wǎng)絡(luò)環(huán)境,這個環(huán)境包括一個獨立的網(wǎng)卡空間,路由表,ARP表,ip地址表,iptables,ebtables,等等??傊?,與網(wǎng)絡(luò)有關(guān)的組件都是獨立的。

      ip命令提供了ip netns exec子命令可以在對應(yīng)的network namesapce進行操作,要執(zhí)行的可以是任何命令,不只是和網(wǎng)絡(luò)相關(guān)的,創(chuàng)建network namesapce后可以通過ip ntns exec+namespace名+shell指令進行操作。例如在對應(yīng)namespace查看網(wǎng)卡信息ip ntns exec nsn1 ip a

      創(chuàng)建虛擬網(wǎng)絡(luò)環(huán)境

      常用的一些network namespace指令如下:

      ip netns list #查看network namespace 
      ip netns add ns1 #添加network namespace 
      ip netns delete ns1 #刪除network namespace
      

      創(chuàng)建namespace - ns1

      1.創(chuàng)建network namespace - ns1

      [root@10 /]# ip netns add ns1
      

      2.查看ns1網(wǎng)卡信息

      [root@10 /]# ip netns exec ns1 ip a
      1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      

      可以看到這時候網(wǎng)卡狀態(tài)是Down,此時只有一個lo網(wǎng)卡

      3.啟動ns1上的lo網(wǎng)卡

      [root@10 /]# ip netns exec ns1 ifup lo
      

      4.查看網(wǎng)卡狀態(tài)

      [root@10 /]# ip netns exec ns1 ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state unk group default 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
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      

      此時網(wǎng)卡狀態(tài)已經(jīng)變成UNKOWN,lo網(wǎng)卡上也綁定了一個本地回環(huán)地址127.0.0.1/8

      創(chuàng)建namespace - ns2

      重復(fù)上面步驟,按照上面的指令把ns1改為ns2執(zhí)行一邊,最后可以看到網(wǎng)卡狀態(tài)也為UNKOWN

      [root@10 /]# ip netns exec ns2 ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
          inet6 ::1/128 scope host 
             valid_lft forever preferred_lft forever
      

      經(jīng)過上面的一系列步驟,兩個network namespace的網(wǎng)絡(luò)結(jié)構(gòu)如下:

      此時兩個Network Namespace只有l(wèi)o設(shè)備,互相之間是沒有關(guān)聯(lián),無法通信,只能同一Network Namesapce內(nèi)的應(yīng)用訪問。

      連通兩個Network Namespace

      Linux提供Virtual Ethernet Pair技術(shù),分別在兩個namespace建立一對網(wǎng)絡(luò)接口,類似在兩個name space之間建立一條pipe,好像拉一條網(wǎng)線一樣,讓彼此之間可以通信,簡稱veth pair。

      veth pair是成對出現(xiàn),刪除其中一個,另一個也會自動消失。

      1.創(chuàng)建連一對veth虛擬網(wǎng)卡,類似pipe,發(fā)給veth-ns1的數(shù)據(jù)包veth-ns2那邊會收到,發(fā)給veth2的數(shù)據(jù)包veth0會收到。就相當(dāng)于給機器安裝了兩個網(wǎng)卡,并且之間用網(wǎng)線連接起來了,兩個虛擬網(wǎng)卡分別為veth-ns1、veth-ns2

      [root@10 /]# ip link add veth-ns1 type veth peer name veth-ns2
      

      2.查看link,可以看到連接已經(jīng)建立

      [root@10 /]# ip link
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
          link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
          link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
          link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
      4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
          link/ether 02:42:12:9a:b1:a7 brd ff:ff:ff:ff:ff:ff
      5: veth-ns2@veth-ns1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff
      6: veth-ns1@veth-ns2: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff
      

      3.把兩個虛擬網(wǎng)卡分別加到兩個network name space ns1、ns2中

      [root@10 /]# ip link set veth-ns1 netns ns1
      [root@10 /]# ip link set veth-ns2 netns ns2
      

      4.分別查看宿主機器和兩個network namesapce的情況

      ip link ip netns exec ns1 ip link ip netns exec ns2 ip link
      

      ns1上的虛擬網(wǎng)卡信息

      6: veth-ns1@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff link-netnsid 1
      

      ns2上的虛擬網(wǎng)卡信息

      5: veth-ns2@if6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      

      通過上面指令執(zhí)行結(jié)果可以看到原來宿主機的一對虛擬網(wǎng)卡已經(jīng)移到兩個network namespace那,當(dāng)前的網(wǎng)卡狀態(tài)還是DOWN,兩個網(wǎng)卡的序列號是按順序成對的@if5、@if6

      5.分別啟動這兩個虛擬網(wǎng)卡

      [root@10 /]# ip netns exec ns1 ip link set veth-ns1 up
      [root@10 /]# ip netns exec ns2 ip link set veth-ns2 up
      

      執(zhí)行結(jié)果分別如下:

      • ns1
      6: veth-ns1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
          link/ether da:89:0e:56:03:3f brd ff:ff:ff:ff:ff:ff link-netnsid 1
      
      • ns2
      5: veth-ns2@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
          link/ether 2a:96:f4:e3:00:d2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      

      可以看到此時兩個虛擬網(wǎng)卡狀態(tài)為UP,都已經(jīng)啟動,但還沒有IP地址,因此還不能通信

      6.給虛擬網(wǎng)卡配置IP地址

      [root@10 /]# ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
      [root@10 /]# ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
      

      7.通過ip a查看ip地址是否配置成功

      root@10 /]# ip netns exec ns1 ip a
      
      root@10 /]# ip netns exec ns2 ip a
      

      8.測試ns1和ns2是否可以互相連通

      [root@10 /]# ip netns exec ns1 ping 192.168.0.12
      PING 192.168.0.12 (192.168.0.12) 56(84) bytes of data.
      64 bytes from 192.168.0.12: icmp_seq=1 ttl=64 time=0.048 ms 
      
      [root@10 /]# ip netns exec ns2 ping 192.168.0.11
      PING 192.168.0.11 (192.168.0.11) 56(84) bytes of data.
      64 bytes from 192.168.0.11: icmp_seq=1 ttl=64 time=0.041 ms
      64 bytes from 192.168.0.11: icmp_seq=2 ttl=64 time=0.039 ms
      64 bytes from 192.168.0.11: icmp_seq=3 ttl=64 time=0.041 ms
      

      這時候,兩個network namespace已經(jīng)成功連通了

      通過Bridege建立多個namesapce通信

      以上的veth pair只能解決兩個namesapce之間的通信問題,但是多個namesapce是不能直接互相通信,因為處于不同的網(wǎng)絡(luò),在日常生活中,我們會用到交換機去連接不同的網(wǎng)絡(luò),而在Linux,我們可以通過bridege去實現(xiàn)。

      在上圖可以看到,這時候連個namespace ns3、ns4并不是直接通過veth pair連接,而是通過bridge間接連接,接下來我會一步步教大家怎么按照上圖設(shè)置

      1.創(chuàng)建Network Space
      為了避免跟上面混淆,我們重新創(chuàng)建新的namespace

      [root@10 /]# ip netns add ns3
      [root@10 /]# ip netns add ns4
      [root@10 /]# ip netns add bridge
      

      2.創(chuàng)建一對veth pair網(wǎng)卡

      [root@10 /]# ip link add type veth
      

      3.查看宿主機上生成的一對虛擬網(wǎng)卡

      [root@10 /]# ip link
      ...
      7: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether 36:8e:bc:43:f0:4a brd ff:ff:ff:ff:ff:ff
      8: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
          link/ether 92:c0:44:18:64:93 brd ff:ff:ff:ff:ff:ff
      

      可以看到,宿主機已經(jīng)存在一對網(wǎng)卡veth1、veth0

      4.讓veth0加入到ns3中,讓veth1加入到bridge中,并分別把虛擬網(wǎng)卡重命名為ns3-bridge、bridge-ns3

      [root@10 /]# ip link set dev veth0 name ns3-bridge netns ns3
      [root@10 /]# ip link set dev veth1 name bridge-ns3 netns bridge
      

      5.在創(chuàng)建一對veth pair,讓veth0加入到ns4中,讓veth1加入到bridge中,并分別把虛擬網(wǎng)卡重命名為ns4-bridge、bridge-ns4

      [root@10 /]# ip link add type veth
      [root@10 /]# ip link set dev veth0 name ns4-bridge netns ns4
      [root@10 /]# ip link set dev veth1 name bridge-ns4 netns bridge
      

      6.分別進入各個namespace查看網(wǎng)卡信息

      • ns4
      [root@10 /]# ip netns exec ns4 ip a
      ...
      9: ns4-bridge@if10: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
          link/ether ea:53:ea:e6:2e:2e brd ff:ff:ff:ff:ff:ff link-netnsid 1
      
      • ns3
      [root@10 /]# ip netns exec ns3 ip a
      ...
      7: ns3-bridge@if8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
          link/ether 36:8e:bc:43:f0:4a brd ff:ff:ff:ff:ff:ff link-netnsid 1
      
      • bridge
      [root@10 /]# ip netns exec bridge ip a
      ...
      8: bridge-ns3@if7: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
          link/ether 92:c0:44:18:64:93 brd ff:ff:ff:ff:ff:ff link-netnsid 0
      10: bridge-ns4@if9: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
          link/ether 9e:f4:57:43:2e:2b brd ff:ff:ff:ff:ff:ff link-netnsid 1
      

      可以看到ns3與bridge、ns4與bridge的網(wǎng)卡序號是連續(xù)的,證明是同一對veth pair

      7.在bridge namespace中創(chuàng)建br設(shè)備(網(wǎng)橋)

      在對bridge進行操作,需要用到bridge-utils,可以通過以下命令安裝

      yum install bridge-utils
      

      接下來創(chuàng)建br設(shè)備

      [root@10 /]# ip netns exec bridge brctl addbr br
      

      8.啟動br設(shè)備

      [root@10 /]# ip netns exec bridge ip link set dev br up
      

      9.啟動bridge中的兩個虛擬網(wǎng)卡

      [root@10 /]# ip netns exec bridge ip link set dev bridge-ns3 up
      [root@10 /]# ip netns exec bridge ip link set dev bridge-ns4 up
      

      10.把bridge中兩個虛擬網(wǎng)卡加入到br設(shè)備中

      [root@10 /]# ip netns exec bridge brctl addif br bridge-ns3
      [root@10 /]# ip netns exec bridge brctl addif br bridge-ns4
      

      11.啟動ns3、ns4中的虛擬網(wǎng)卡,并加入ip

      [root@10 /]# ip netns exec ns3 ip link set dev ns3-bridge up
      [root@10 /]# ip netns exec ns3 ip address add 192.168.0.13/24 dev ns3-bridge
      
      [root@10 /]# ip netns exec ns4 ip link set dev ns4-bridge up
      [root@10 /]# ip netns exec ns4 ip address add 192.168.0.14/24 dev ns4-bridge
      

      12.測試兩個namespace的連通性

      [root@10 /]# ip netns exec ns3 ping 192.168.0.14
      PING 192.168.0.14 (192.168.0.14) 56(84) bytes of data.
      64 bytes from 192.168.0.14: icmp_seq=1 ttl=64 time=0.061 ms
      64 bytes from 192.168.0.14: icmp_seq=2 ttl=64 time=0.047 ms
      64 bytes from 192.168.0.14: icmp_seq=3 ttl=64 time=0.042 ms
      
      [root@10 /]# ip netns exec ns4 ping 192.168.0.13
      PING 192.168.0.13 (192.168.0.13) 56(84) bytes of data.
      64 bytes from 192.168.0.13: icmp_seq=1 ttl=64 time=0.046 ms
      64 bytes from 192.168.0.13: icmp_seq=2 ttl=64 time=0.076 ms
      64 bytes from 192.168.0.13: icmp_seq=3 ttl=64 time=0.081 ms
      

      Docker容器的網(wǎng)絡(luò)


      Docker常見的網(wǎng)絡(luò)模式有三種bridge、none和host

      • bridge - Docker的默認網(wǎng)絡(luò)模式,有獨立的命名空間,能夠支持各種自定義網(wǎng)絡(luò), 以及實現(xiàn)網(wǎng)絡(luò)隔離,能夠滿足容器網(wǎng)絡(luò)隔離的要求
      • host - 容器與主機在相同的網(wǎng)絡(luò)命名空間下面,使用相同的網(wǎng)絡(luò)協(xié)議棧,容器可以直接使用主機的所有網(wǎng)絡(luò)接口,最簡單和最低延遲的模式
      • none - 使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡(luò)配置,即Docker容器沒有網(wǎng)卡、IP、路由等信息,讓開發(fā)者可以自由按需定制

      Docker網(wǎng)絡(luò)相關(guān)指令

      • docker network ls - 查詢可用網(wǎng)絡(luò)

      • docker network create - 新建一個網(wǎng)絡(luò)

      • docker network rm - 移除一個網(wǎng)絡(luò)

      • docker network inspect - 查看一個網(wǎng)絡(luò)

      • docker network connect - 連接容器到一個網(wǎng)絡(luò)

      • docker network disconnect - 把容器從一個網(wǎng)絡(luò)斷開

      bridge網(wǎng)絡(luò)模式實現(xiàn)

      bridge是docker容器默認的網(wǎng)絡(luò)模式,它的實現(xiàn)原理跟我們網(wǎng)絡(luò)虛擬化的多namespace例子一樣,通過veth pair和bridge進行間接連接,當(dāng) Docker 啟動時,會自動在主機上創(chuàng)建一個 docker0 虛擬網(wǎng)橋,實際上是 Linux 的一個 bridge,可以理解為一個軟件交換機。它會在掛載到它的網(wǎng)口之間進行轉(zhuǎn)發(fā),創(chuàng)建了在主機和所有容器之間一個虛擬共享網(wǎng)絡(luò)

      接下來,我們以上圖tomcat容器為例,來展示下bridge模式的操作

      1.啟動兩個tomcat容器(使用我們在第一章創(chuàng)建的tomcat鏡像)

      [root@10 vagrant]# docker run -d --name tomcat01 -p 8081:8080 tomcat
      [root@10 /]# docker run -d --name tomcat03 -p 8082:8080 tomcat
      

      2.查看兩個tomcat容器的網(wǎng)絡(luò)接口信息

      [root@10 /]# docker exec -it tomcat01 ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
      11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
          link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
          inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
             valid_lft forever preferred_lft forever
      
      [root@10 /]# docker exec -it tomcat03 ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
      15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
          link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
          inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
             valid_lft forever preferred_lft forever
      

      可以看到tomcat01和tomcat03的ip分別為172.17.0.2/16172.17.0.3/16,并且有一對不連續(xù)的基于veth pair創(chuàng)建的虛擬網(wǎng)卡eth0@if12、eth0@if16,很明顯,根據(jù)我們上面學(xué)過的內(nèi)容,這兩個不是成對出現(xiàn)的虛擬網(wǎng)卡不能直接通信,應(yīng)該是通過bridge來進行連接

      3.查看宿主機centos系統(tǒng)的網(wǎng)卡信息,驗證是否存在與tomcat容器對應(yīng)的虛擬網(wǎng)卡

      [root@10 /]#  ip a
      ...
      4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
          link/ether 02:42:12:9a:b1:a7 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:12ff:fe9a:b1a7/64 scope link 
             valid_lft forever preferred_lft forever
      12: veth068cc5c@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
          link/ether 66:1c:13:cd:b4:78 brd ff:ff:ff:ff:ff:ff link-netnsid 5
          inet6 fe80::641c:13ff:fecd:b478/64 scope link 
             valid_lft forever preferred_lft forever
      16: veth92816fa@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
          link/ether 0a:cf:a0:8e:78:7f brd ff:ff:ff:ff:ff:ff link-netnsid 6
          inet6 fe80::8cf:a0ff:fe8e:787f/64 scope link 
             valid_lft forever preferred_lft forever
      

      果然,我們可以看到宿主機上確實存在與兩個tomcat容器相對應(yīng)的虛擬網(wǎng)卡,并且還有一個虛擬網(wǎng)橋docker0的網(wǎng)絡(luò)接口,這種連接方法叫bridge模式

      4.通過docker network inspect bridge命令查看下bridge的配置

      [root@10 /]# docker network inspect 
       ...
              "Containers": {
                  "2f3c3081b8bd409334f21da3441f3b457e243293f3180d54cfc12d5902ad4dbc": {
                      "Name": "tomcat03",
                      "EndpointID": "2375535cefdbccd3434d563ef567a1032694bdfb4356876bd9d8c4e07b1f222b",
                      "MacAddress": "02:42:ac:11:00:03",
                      "IPv4Address": "172.17.0.3/16",
                      "IPv6Address": ""
                  },
                  "c13db4614a49c302121e467d8aa8ea4f008ab55f83461430d3dd46e59085937f": {
                      "Name": "tomcat01",
                      "EndpointID": "99a04efa9c7bdb0232f98d25f490682b065de1ce076b31487778fa257552a2ba",
                      "MacAddress": "02:42:ac:11:00:02",
                      "IPv4Address": "172.17.0.2/16",
                      "IPv6Address": ""
                  }
              },
      
      

      可以看到兩個container已經(jīng)綁定到bridge中

      5.分別測試兩個tomcat容器相互連通

      [root@10 /]# docker exec -it tomcat01 ping 172.17.0.3
      PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
      64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.054 ms
      64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.040 ms
      64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.039 ms
      
      [root@10 /]# docker exec -it tomcat03 ping 172.17.0.2
      PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
      64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.046 ms
      64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.042 ms
      64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.039 ms
      

      可以看到這兩個容器可以互相訪問

      6.在容器訪問互聯(lián)網(wǎng)網(wǎng)站

      docker容器是可以通過brige與host主機網(wǎng)絡(luò)連通,因此可以間接通過iptables實現(xiàn)NAT轉(zhuǎn)發(fā)進行互聯(lián)網(wǎng)訪問,能夠讓多個內(nèi)網(wǎng)用戶通過一個外網(wǎng)地址上網(wǎng),解決了IP資源匱乏的問題

      接下來選擇其中剛才其中一個tomcat容器進行測試,如果發(fā)現(xiàn)不能訪問互聯(lián)網(wǎng),可能需要重啟下docker服務(wù)systemctl restart docker

      [root@10 /]# docker exec -it tomcat01 curl -I https://www.baidu.com
      HTTP/1.1 200 OK
      Accept-Ranges: bytes
      Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
      Connection: keep-alive
      Content-Length: 277
      Content-Type: text/html
      Date: Thu, 06 Feb 2020 06:03:48 GMT
      Etag: "575e1f72-115"
      Last-Modified: Mon, 13 Jun 2016 02:50:26 GMT
      Pragma: no-cache
      Server: bfe/1.0.8.18
      

      從上面返回信息可以看到,容器成功訪問百度網(wǎng)站

      host網(wǎng)絡(luò)模式實現(xiàn)

      host模式是共享宿主機器網(wǎng)絡(luò),因此使用的是同一個network namespace

      1.創(chuàng)建一個容器,命名為tomcat-host,網(wǎng)絡(luò)模式選擇host

      [root@10 /]# docker run -d --name tomcat-host --network host tomcat
      ee3c6d2a5f61caa371088f40bc0c5d11101d12845cdee24466322a323b11ee11
      

      2.查看容器的網(wǎng)絡(luò)接口信息會發(fā)現(xiàn)跟宿主centos的一樣

      [root@10 /]# docker exec -it tomcat-host ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
          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 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
          inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
             valid_lft 50028sec preferred_lft 50028sec
          inet6 fe80::5054:ff:fe8a:fee6/64 scope link 
             valid_lft forever preferred_lft forever
      3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
          link/ether 08:00:27:ba:0a:28 brd ff:ff:ff:ff:ff:ff
          inet 192.168.100.12/24 brd 192.168.100.255 scope global noprefixroute dynamic eth1
             valid_lft 156886sec preferred_lft 156886sec
          inet6 fe80::a00:27ff:feba:a28/64 scope link 
             valid_lft forever preferred_lft forever
      4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
          link/ether 02:42:12:9a:b1:a7 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:12ff:fe9a:b1a7/64 scope link 
             valid_lft forever preferred_lft forever
      

      3.查看容器的網(wǎng)絡(luò)信息,會發(fā)現(xiàn)容器沒有被單獨分配ip地址

              "Containers": {
                  "ee3c6d2a5f61caa371088f40bc0c5d11101d12845cdee24466322a323b11ee11": {
                      "Name": "tomcat-host",
                      "EndpointID": "53565ff879878bfd10fc5843582577d54eb68b14b29f4b1ff2e213d38e2af7ce",
                      "MacAddress": "",
                      "IPv4Address": "",
                      "IPv6Address": ""
                  }
              }
      

      none網(wǎng)絡(luò)模式實現(xiàn)

      上面提到,none網(wǎng)絡(luò)模式是有一個獨立的namesapce,默認情況下沒有任何初始化網(wǎng)絡(luò)配置,與外界網(wǎng)絡(luò)隔離,需要自己去定制

      1.創(chuàng)建容器tomcat-none,并設(shè)置網(wǎng)絡(luò)為none

      [root@10 /]# docker run -d --name tomcat-none --network none tomcat
      d90808e0b7455c2f375c3d88fa18a1872b4a03e2112bff3db0b3996d16523b1a
      

      2.查看網(wǎng)絡(luò)接口信息

      [root@10 /]# docker exec -it tomcat-none ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
      

      這里只有l(wèi)o設(shè)備,沒有其他網(wǎng)卡,只有本地回環(huán)ip地址

      3.查看docker網(wǎng)絡(luò)信息

              "Containers": {
                  "d90808e0b7455c2f375c3d88fa18a1872b4a03e2112bff3db0b3996d16523b1a": {
                      "Name": "tomcat-none",
                      "EndpointID": "4ea757bbd108ac783bd1257d33499b7b77cd7ea529d4e6c761923eb596dc446c",
                      "MacAddress": "",
                      "IPv4Address": "",
                      "IPv6Address": ""
                  }
              }
      

      容器沒有被分配任何地址

      自定義網(wǎng)絡(luò)模式custom實現(xiàn)

      我們可以創(chuàng)建自己的網(wǎng)絡(luò)模式,這里默認是bridge模式,接下來我們演示如何讓不同網(wǎng)絡(luò)的容器連通起來

      1.創(chuàng)建一個新網(wǎng)絡(luò),名字為custom,默認模式是bridge

      [root@10 /]# docker network create custom
      af392e4739d810b2e12219c21f505135537e95ea0afcb5075b3b1a5622a66112
      

      2.查看下當(dāng)前docker網(wǎng)絡(luò)列表

      [root@10 /]# docker network ls
      NETWORK ID          NAME                DRIVER              SCOPE
      ce20377e3f10        bridge              bridge              local
      af392e4739d8        custom              bridge              local
      afc6ca3cf515        host                host                local
      94cfa528d194        none                null                local
      

      3.查看下自定義網(wǎng)絡(luò)的一些信息

      94cfa528d194        none                null                local
      [root@10 /]# docker network inspect custom
      [
          {
              "Name": "custom",
              "Id": "af392e4739d810b2e12219c21f505135537e95ea0afcb5075b3b1a5622a66112",
              "Created": "2020-02-05T23:49:08.321895241Z",
              "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": {}
          }
      ]
      

      4.創(chuàng)建一個容器tomcat-custom,容器網(wǎng)絡(luò)模式為custom

      [root@10 /]# docker run -d --name tomcat-custom --network custom tomcat
      2e77115f42e36827646fd6e3abacc0594ff71cd1847f6fbffda28e22fb55e9ea
      

      5.查看tomcat-custom的網(wǎng)絡(luò)接口信息

      [root@10 /]# docker exec -it tomcat-custom ip a
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
      22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
          link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
          inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
             valid_lft forever preferred_lft forever
      

      6.測試tomcat-custom去連接上面我們創(chuàng)建的tomcat01容器

      [root@10 /]# docker exec -it tomcat-custom ping 192.17.0.2
      PING 192.17.0.2 (192.17.0.2) 56(84) bytes of data.
      --- 192.17.0.2 ping statistics ---
      4 packets transmitted, 0 received, 100% packet loss, time 3001ms
      

      從上面執(zhí)行結(jié)果可以看出,默認情況下,tomcat-custom跟tomcat01是不能連通,因為處于不同的網(wǎng)絡(luò)custom、bridge。

      7.把tomcat01加到自定義網(wǎng)絡(luò)custom

      [root@10 /]# docker network connect custom tomcat01
      

      8.查看當(dāng)前custom網(wǎng)絡(luò)信息

       "Containers": {
                  "2e77115f42e36827646fd6e3abacc0594ff71cd1847f6fbffda28e22fb55e9ea": {
                      "Name": "tomcat-custom",
                      "EndpointID": "bf2b94f3b580b9df0ca9f6ce2383198961711d1b3d19d33bbcf578d81157e47f",
                      "MacAddress": "02:42:ac:12:00:02",
                      "IPv4Address": "172.18.0.2/16",
                      "IPv6Address": ""
                  },
                  "c13db4614a49c302121e467d8aa8ea4f008ab55f83461430d3dd46e59085937f": {
                      "Name": "tomcat01",
                      "EndpointID": "f97305672ae617f207dfef1b3dc250d2b8d6a9ec9b36b1b0115e2456f18c44c6",
                      "MacAddress": "02:42:ac:12:00:03",
                      "IPv4Address": "172.18.0.3/16",
                      "IPv6Address": ""
                  }
              }
      

      可以看到兩個容器都已經(jīng)配置到custom網(wǎng)絡(luò)中,tomcat-custom 172.18.0.2/16,tomcat01 172.18.0.3/16

      9.配置完網(wǎng)絡(luò)后,在用tomcat01嘗試連接tomcat-custom

      [root@10 /]# docker exec -it tomcat01 ping 172.18.0.3
      PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
      64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.032 ms
      64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.080 ms
      64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.055 ms
      

      從執(zhí)行結(jié)果可以看到,現(xiàn)在tomcat01已經(jīng)可以跟tomcat-custom通信了,因為處于同一個網(wǎng)絡(luò)中

      10.此時查看centos中的網(wǎng)絡(luò)接口信息,可以看到存在對應(yīng)的虛擬網(wǎng)卡

      [root@10 /]# ip a
      ...
      23: vethc30bd52@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-af392e4739d8 state UP group default 
          link/ether 2e:a1:c8:a2:e5:83 brd ff:ff:ff:ff:ff:ff link-netnsid 5
          inet6 fe80::2ca1:c8ff:fea2:e583/64 scope link 
             valid_lft forever preferred_lft forever
      25: veth69ea87b@if24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
          link/ether 92:eb:8f:65:fe:7a brd ff:ff:ff:ff:ff:ff link-netnsid 6
          inet6 fe80::90eb:8fff:fe65:fe7a/64 scope link 
             valid_lft forever preferred_lft forever
      27: veth068cc5c@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-af392e4739d8 state UP group default 
          link/ether ea:44:90:6c:0d:49 brd ff:ff:ff:ff:ff:ff link-netnsid 6
          inet6 fe80::e844:90ff:fe6c:d49/64 scope link 
             valid_lft forever preferred_lft forever
      
      

      自定義網(wǎng)絡(luò)中的嵌入式DNS

      當(dāng)用戶創(chuàng)建了自定義網(wǎng)絡(luò),docker引擎默認會對加入該網(wǎng)絡(luò)的容器啟動嵌入式DNS,因此同一網(wǎng)絡(luò)的容器可以互相通過容器名稱進行通信,避免因下游系統(tǒng)有ip需要重新發(fā)布

      對于非自定義網(wǎng)絡(luò),具體配置,可以查閱官網(wǎng)配置容器DNS

      1.通過上面我們創(chuàng)建號的自定義網(wǎng)絡(luò)和容器進行測試

      [root@10 /]# docker exec -it tomcat01 ping tomcat-custom
      PING tomcat-custom (172.18.0.2) 56(84) bytes of data.
      64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=1 ttl=64 time=0.031 ms
      64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=2 ttl=64 time=0.038 ms
      64 bytes from tomcat-custom.custom (172.18.0.2): icmp_seq=3 ttl=64 time=0.040 ms
      
      [root@10 /]# docker exec -it tomcat-custom ping tomcat01
      PING tomcat01 (172.18.0.3) 56(84) bytes of data.
      64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=1 ttl=64 time=0.031 ms
      64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=2 ttl=64 time=0.038 ms
      64 bytes from tomcat01.custom (172.18.0.3): icmp_seq=3 ttl=64 time=0.040 ms
      

      可以看到tomcat01和tomcat-custom可以互相通過容器名進行通信

      Docker端口映射

      端口映射對于我們來說不陌生,平時訪問服務(wù),例如tomcat,都是通過ip+服務(wù)端口進行訪問,如:localhost:8080,但是容器是寄生在宿主機器上,因此,如果我們想被外部訪問,還需要映射到宿主的端口上,通過宿主的ip+port進行訪問,如下如圖所示:

      接下來我們來實踐下docker端口映射相關(guān)操作

      1.創(chuàng)建一個tomcat-port容器,指定宿主端口映射8999

      [root@10 /]# docker run -d --name tomcat-port -p 8999:8080 tomcat
      0b5b014ae2552b85aff55b385ba20518b38509b5670a95ad9eea09475ea26629
      

      2.進入容器,在容器中訪問

      [root@10 /]# docker exec -it tomcat-port curl -i localhost:8080
      HTTP/1.1 404 
      Content-Type: text/html;charset=utf-8
      Content-Language: en
      Content-Length: 713
      Date: Thu, 06 Feb 2020 07:43:59 GMT
      

      從上面結(jié)果可以看到,實際上已經(jīng)訪問成功,但是由于我沒有配置tomcat管理頁面,所以這里是報404

      3.在centos訪問容器
      這時候我們就需要通過容器ip+port的方式進行訪問

      [root@10 /]# curl -I 172.17.0.4:8080
      HTTP/1.1 404 
      Content-Type: text/html;charset=utf-8
      Content-Language: en
      Transfer-Encoding: chunked
      Date: Thu, 06 Feb 2020 07:49:41 GMT
      

      可以看到,這里也訪問成功

      4.在主體機器訪問,也就是我的主機MacOS操作系統(tǒng)上訪問

      這時候需要用虛擬機上centos IP+映射端口 進行訪問

      192:centos7 evan$ curl -I 192.168.100.12:8999
      HTTP/1.1 404 
      Content-Type: text/html;charset=utf-8
      Content-Language: en
      Transfer-Encoding: chunked
      Date: Thu, 06 Feb 2020 07:52:52 GMT
      

      可以看到,這里也能正常訪問


      總結(jié)

      上文講解了Docker的單機網(wǎng)絡(luò)通信原理以及Linux虛擬化技術(shù),最后我們回顧下一開始的那幾個問題,相信大家心中都已經(jīng)有答案了

      1.同一個主機兩個容器如何通信?

      Docker基于Virtual Ethernet Pair技術(shù)實現(xiàn)了容器之間的通信,但并非直接端對端對接,在默認網(wǎng)絡(luò)bridge模式下,Docker引擎會分別在每個容器和宿主網(wǎng)絡(luò)建立一對虛擬網(wǎng)卡veth pair,通過bridge間接實現(xiàn)通信,通過network namespace實現(xiàn)網(wǎng)絡(luò)隔離。

      2.怎么從服務(wù)器外訪問容器?

      從服務(wù)器外訪問容器是通過端口映射方式,訪問的IP地址和端口并非容器的真實IP和端口,而是宿主機器的端口映射,所以要從服務(wù)器外部訪問容器,需要通過宿主機器的IP/域名+宿主端口進行訪問。

      3.Docker的三種網(wǎng)絡(luò)模式是什么?

      Docker常見的網(wǎng)絡(luò)模式有三種bridge、none和host

      bridge - Docker的默認網(wǎng)絡(luò)模式,有獨立的命名空間,能夠支持各種自定義網(wǎng)絡(luò), 以及實現(xiàn)網(wǎng)絡(luò)隔離,能夠滿足容器網(wǎng)絡(luò)隔離的要求
      host - 容器與主機在相同的網(wǎng)絡(luò)命名空間下面,使用相同的網(wǎng)絡(luò)協(xié)議棧,容器可以直接使用主機的所有網(wǎng)絡(luò)接口,最簡單和最低延遲的模式
      none - 使用none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進行任何網(wǎng)絡(luò)配置,即Docker容器沒有網(wǎng)卡、IP、路由等信息,讓開發(fā)者可以自由按需定制

      參考資料

      linux 網(wǎng)絡(luò)虛擬化: network namespace 簡介
      網(wǎng)絡(luò)虛擬化技術(shù)(一): Linux網(wǎng)絡(luò)虛擬化


      有興趣的朋友,歡迎加我公眾號一起交流,有問題可以留言,平時工作比較忙,我也抽時間盡量回復(fù)每位朋友的留言,謝謝!

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多