1. 程式人生 > 實用技巧 >Docker——網路

Docker——網路

docker0

  1. 檢視主機的ip

    [root@iZwz908j8pbqd86doyrez5Z test]# ip addr
    #本機迴環地址
    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
    #阿里雲內網地址
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000  
        link/ether 00:16:3e:10:37:ba brd ff:ff:ff:ff:ff:ff
        inet 172.18.199.233/20 brd 172.18.207.255 scope global dynamic eth0
           valid_lft 309999819sec preferred_lft 309999819sec
    #docker生成的地址
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default  
        link/ether 02:42:6f:43:1c:ae 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
    
  2. 檢視容器的ip

    [root@iZwz908j8pbqd86doyrez5Z test]# docker exec -it 5046feaea51f ip addr
    #容器內網地址
    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
    #docker生成的地址
    282: eth0@if283: <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
    
  3. 嘗試從主機直接ping通容器的eth0ip

    #嘗試ping通主機和容器
    [root@iZwz908j8pbqd86doyrez5Z test]# ping 172.17.0.2
    #連線成功
    
  4. 容器間的通訊:docker網路

    原理:使用了evth-pair技術,本質上都是通過主機相連.每個主機有一個埠對應一個容器(如上面的容器-282和主機-283),如此構成了一個區域網.實際上各個容器無法直接相連,只能通過enth0進行橋接

    #嘗試ping通容器和容器
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat1 ip addr
    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
    284: eth0@if285: <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
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat2 ping 172.17.0.3
    #測試:可以ping通
    

docker網路解決的問題:容器之間的ping通

原理

  1. 我們沒啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝了docker,就會有一個網絡卡橋接模式,使用的技術是evth-pair技術

    #再次檢視主機ip:多了一個263(猜測“283: veth30fdc0b@if282”表示:這裡的263與容器內的262相對應,即每執行一個容器,都會建立一對網絡卡)
    [root@iZwz908j8pbqd86doyrez5Z test]# ip addr
    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
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:10:37:ba brd ff:ff:ff:ff:ff:ff
        inet 172.18.199.233/20 brd 172.18.207.255 scope global dynamic eth0
           valid_lft 309996899sec preferred_lft 309996899sec
    3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:6f:43:1c:ae 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
    283: veth30fdc0b@if282: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
        link/ether 4e:d2:72:ba:14:a0 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    
  2. linux橋接:我們每啟動一個容器,linux主機就會多一個虛擬網絡卡,這個網絡卡連線著各個容器,我們可以嘗試使用兩個容器進行通訊

    #evth-pair技術:一對虛擬裝置介面,他們都是成對出現的,一端連著協議,一端彼此相連
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat1 ip addr
    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
    284: eth0@if285: <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
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat2 ping 172.17.0.3
    
  3. 網路模型圖

    結論:tomcat1和tomcat2公用一個路由器docker0

  4. 小結

    注:

    • Docker中的所有網路介面都是虛擬的.虛擬的轉發效率高!
    • 只要容器刪除,對應網橋一對就沒了
  5. –link(官方不推薦)

    當通過datasource連線mysql時,通常總是對應一個指定的埠,而容器的埠卻是在啟動難時生成(主機埠-容器埠),是否有辦法通過主機埠-服務找到對應的埠?

    #嘗試直接ping通
    docker exec -it tomcat2 ping tomcat1  #無法直接ping通
    
    #嘗試使用link啟動一個容器
    docker run -d -P --name tomcat3 --link tomcat2 tomcat
    docker exec -it tomcat3 ping tomcat2  #可以ping通
    
    #嘗試tomcat1向tomcat2反向Ping通
    docker exec -it tomcat1 ping tomcat3  #失敗
    
    #檢視/etc/hosts檔案探究--link原理
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 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.4	tomcat2 e55b43eede71  #其實本質上是更改了hosts檔案,將訪問轉到本地對應的埠
    172.17.0.5	c13e595e3183
    

    原理:直接在/etc/hosts中寫死了

  6. 自定義網路

    #檢視當前的網路
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e33b6b9e8a86        bridge              bridge              local
    e4a72501819c        host                host                local
    ee755fa64360        none                null                local
    

    網路模式
    bridge:橋接模式,橋接docker(預設)
    none:不配置網路
    host:和宿主機共享網路
    container:容器內網路連通(不建議)

    測試

    # 我們直接啟動的命令 --net bridge,也就是我們docker0的橋接
    docker run -d -P --name tomcat01 tomcat
    docker run -d -P --name tomcat01 --net bridge tomcat  #與上面等同
    
    # docker0特點:預設,域名不能訪問,可以--link打通,但是不推薦
    
    #嘗試建立一個自定義網路
    #--driver bridge:橋接模式
    #--subnet 192.168.0.0/16:子網地址(/16,說明只限制了前面16位,可以有255*255個不同的地址;如果是/24,則只有255個地址)
    #--getaway 192.168.0.1:閘道器
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e33b6b9e8a86        bridge              bridge              local
    e4a72501819c        host                host                local
    27ebc9223f19        mynet               bridge              local  #*
    ee755fa64360        none                null                local
    
    #docker network inspect mynet
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
            "Created": "2020-09-15T15:13:49.178777935+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "192.168.0.0/16",  #子網
                        "Gateway": "192.168.0.1"  #閘道器
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    
    #ping測試
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker run -d -P --net mynet --name tomcat4 tomcat
    b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker run -d -P --net mynet --name tomcat5 tomcat
    f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat4 ping tomcat5
    
    #再次檢視資訊
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
            "Created": "2020-09-15T15:13:49.178777935+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "192.168.0.0/16",
                        "Gateway": "192.168.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {  #兩個容器
                "b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd": {
                    "Name": "tomcat4",
                    "EndpointID": "5f7cd9c91fdf08ff27ed82d0419aa428c365c1a2d1b5eed476bb1bdb45a86d06",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                },
                "f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993": {
                    "Name": "tomcat5",
                    "EndpointID": "92660007315adb53a812b564b06090b3039a7771e7c5d9a4fad2b1c9df9753d8",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    
    

    注:

    • 不同的叢集建立不同的網路
    • 我們自定義的網路docker都已經幫我們維護好了對應的關係,推薦我們平時這樣使用網路!
  7. 網路連通

    #嘗試ping通不同網段(bridge和mynet)的容器
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 ping tomcat4
    ping: tomcat4: Name or service not known
    
    #在mynet網路中加入tomcat3容器
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network connect mynet tomcat3
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "27ebc9223f194268120a12710971c9093c53b9fc3f65e19697ca63e05ee464f9",
            "Created": "2020-09-15T15:13:49.178777935+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "192.168.0.0/16",
                        "Gateway": "192.168.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {
                "b763cb6ecf5d4befefcacac1c4fafff8bc3ef28de3ba51d11dfa36e64e0c7cbd": {
                    "Name": "tomcat4",
                    "EndpointID": "5f7cd9c91fdf08ff27ed82d0419aa428c365c1a2d1b5eed476bb1bdb45a86d06",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                },
                "c13e595e31833afb032661b077f310bebce5d68bc19012caabc67dbaced129b9": {
                    "Name": "tomcat3",
                    "EndpointID": "ad22702408b9cad4cd67d58758506e60b6a48a0274f26a1134403c4153468a1f",
                    "MacAddress": "02:42:c0:a8:00:04",
                    "IPv4Address": "192.168.0.4/16",
                    "IPv6Address": ""
                },
                "f292f97cf1d6a0b7d6fc77f207730cf3774a65cf72bf99c3bb392e1acf6b4993": {
                    "Name": "tomcat5",
                    "EndpointID": "92660007315adb53a812b564b06090b3039a7771e7c5d9a4fad2b1c9df9753d8",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    
    #嘗試用tomcat3來ping通tomcat4
    [root@iZwz908j8pbqd86doyrez5Z ~]# docker exec -it tomcat3 ping tomcat4  #成功
    

    注:

    • 網段不同,無法ping通
    • 為了實現不同網段的容器互通,應該將要連通的容器連通整個網絡卡(圖)
    • 連通之後,就是將容器加入到對應的網路中(一個容器,兩個ip地址
  8. springboot打包docker映象

    • 在IDEA中下載docker外掛
    • 在IDEA中設定連線遠端倉庫
    • 編寫dockerfile檔案
    • 將jar和dockerfile檔案釋出上去