docker網絡模式詳解

2021-02-21 運維貓
1、網絡模式網絡模式配置說明bridge模式--net=bridge默認值,在Docker網橋docker0上為容器創建新的網絡棧none模式--net=none不配置網絡,用戶可以稍後進入容器,自行配置container模式--net=container:name/id容器和另外一個容器共享Network namespace。 kubernetes中的pod就是多個容器共享一個Network namespacehost模式--net=host容器和宿主機共享Network namespace用戶自定義--net=自定義網絡用戶自己使用network相關命令定義網絡,創建容器的時候可以指定為自己定義的網絡2、docker每個都有一個ip地址
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --name tomcat1 tomcat:8
 Unable to findimage 'tomcat:8'locally
 8: Pulling from library/tomcat
 90fe46dd8199: Pull complete 
 35a4f1977689: Pull complete 
 bbc37f14aded: Pull complete 
 74e27dc593d4: Pull complete 
 93a01fbfad7f: Pull complete 
 1478df405869: Pull complete 
 64f0dd11682b: Pull complete 
 68ff4e050d11: Pull complete 
 9a696f0d2c22: Pull complete 
 44fdefb02938: Pull complete 
 Digest: sha256:140ebee3a8ad23065abee46539900c69dc4d90a1ff4b41f2396e38968e05e82b
 Status: Downloaded newer image fortomcat:8
 cb2139eeaec4da409626b2192faf7d43bb3d326597d7b1fd6ca5d9385e14bc3a
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat1 ip addr
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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
 112: eth0@if113: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc 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
       
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# ping 172.18.0.2
 PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
 64bytes from 172.18.0.2: icmp_seq=1ttl=64time=0.064 ms
 64bytes from 172.18.0.2: icmp_seq=2ttl=64time=0.066 ms
 64bytes from 172.18.0.2: icmp_seq=3ttl=64time=0.055 ms
 64bytes from 172.18.0.2: icmp_seq=4ttl=64time=0.056 ms

3、docker橋接網絡

Docker使用Linux橋接,在宿主機虛擬一個Docker容器網橋(docker0),Docker啟動一個容器時會根據Docker網橋的網段分配給容器一個IP位址,稱為Container-IP,同時Docker網橋是每個容器的默認網關。因為在同一宿主機內的容器都接入同一個網橋,這樣容器之間就能夠通過容器的Container-IP直接通信。

Linux虛擬網絡技術

Docker容器網絡就很好的利用了Linux虛擬網絡技術,在本地主機和容器內分別創建一個虛擬接口,並讓他們彼此聯通(這樣一對接口叫veth pair);

Docker中的網絡接口默認都是虛擬的接口。虛擬接口的優勢就是轉發效率極高(因為Linux是在內核中進行數據的複製來實現虛擬接口之間的數據轉發,無需通過外部的網絡設備交換),對於本地系統和容器系統來說,虛擬接口跟一個正常的乙太網卡相比並沒有區別,只是他的速度快很多。

4、查看本機網絡(本機有三個網絡)
 # lo:127.0.0.1
 # eth0:172.17.119.96 阿里雲私有ip;內網可以互通,訪問不要流量,省流量。
 # docker0:172.18.0.1
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# ip add
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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 1500qdisc pfifo_fast state UP group default qlen 1000
   link/ether 00:16:3e:0a:07:ba brd ff:ff:ff:ff:ff:ff
   inet 172.17.119.96/20 brd 172.17.127.255 scope global dynamic eth0
       valid_lft 315025394sec preferred_lft 315025394sec
 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500qdisc noqueue state DOWN group default 
   link/ether 02:42:f1:f3:d2:be brd ff:ff:ff:ff:ff:ff
   inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
       valid_lft forever preferred_lft forever

5、網絡的創建過程

Docker創建一個容器的時候,會具體執行以下操作:

創建一對虛擬接口,分別放到本地主機和新容器的命名空間中

本地主機一段的虛擬接口連接到默認的docker0網橋或者指定網橋上,並具有一個以veth開頭的唯一名字

容器一段的虛擬接口將放到新創建的容器中,並修改名字為eth0。這個接口只在容器的命名空間可見

從網橋的可用地址段中獲取一個空閒的地址分配給容器的eth0(如:172.18.0.1/16),並配置默認路由網關為docker0網卡的內部接口docker0的IP位址

完成以上,容器就可以使用它所能看到的eth0虛擬網卡來連接其他容器和訪問外部網絡。

6、默認在docker0網絡下,docker容器之間不能相互訪問
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker ps
 CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS                     NAMES
 efe07891e348       tomcat:8            "catalina.sh run"  12minutes ago     Up 12minutes       0.0.0.0:32770->8080/tcp   tomcat2
 cb2139eeaec4       tomcat:8            "catalina.sh run"  24minutes ago     Up 24minutes       0.0.0.0:32768->8080/tcp   tomcat
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat ping tomcat2
 ping: tomcat2: Name or servicenot known

7、容器之間只能ping通自己
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --hostname tomcat1 --name tomcat1 tomcat:8
 63821ec9194e540d2b162d64c05851b2216ffa0acd2c8de3da4e0427df7b6c9a
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --hostname tomcat2 --name tomcat2 tomcat:8
 74d3a2b65539e0b8e372da81b9c5ddd516ced07c948887ef6fc9f56da95f659d
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat1 ping tomcat2
 ping: tomcat2: Name or servicenot known
 
 # 自己ping自己可以
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat1 ping tomcat1
 PING tomcat1 (172.18.0.2) 56(84) bytes of data.
 64bytes from tomcat1 (172.18.0.2): icmp_seq=1ttl=64time=0.045 ms
 64bytes from tomcat1 (172.18.0.2): icmp_seq=2ttl=64time=0.048 ms

8、使用link
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -P -d --name tomcat3 --link tomcat2 tomcat:8
 bb2f63e66d4ba7545c29c7957e79c5f31dc922ff8138b6a31ec5b663722c4927
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 ping tomcat2
 PING tomcat2 (172.18.0.3) 56(84) bytes of data.
 64bytes from tomcat2 (172.18.0.3): icmp_seq=1ttl=64time=0.087 ms
 64bytes from tomcat2 (172.18.0.3): icmp_seq=2ttl=64time=0.064 ms
 64bytes from tomcat2 (172.18.0.3): icmp_seq=3ttl=64time=0.060 ms
 
 # 只有tomcat3到tomcat2的方向是通的,反向ping不通
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 ping tomcat1
 ping: tomcat1: Name or servicenot known
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat2 ping tomcat3
 ping: tomcat3: Name or servicenot known

9、link原理是創建的時候他把ip綁定到了hosts
 # 原理是創建的時候他把ip綁定到了hosts
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 cat /etc/hosts
 127.0.0.1localhost
 ::1localhost ip6-localhost ip6-loopback
 fe00::0ip6-localnet
 ff00::0ip6-mcastprefix
 ff02::1ip6-allnodes
 ff02::2ip6-allrouters
 172.18.0.3tomcat2 tomcat2 #自動綁定hosts
 172.18.0.4bb2f63e66d4b

10、link的缺點(重新建創建docker容器之後,無法相互訪問,強制把link文件刪除)
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker stop tomcat2
 tomcat2
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker rm tomcat2
 tomcat2
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --hostname tomcat2 --name tomcat2 tomcat:8
 95e728be43e6ea2abe5d8a4df2c6f830ce880e7ba08b8e232597e12500f5a23c
 
 # tomcat3由於之前把tomcat2綁定了hosts,tomcat2銷毀之後重啟建立的,導致tomcat3系統直接崩潰了。
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 ping tomcat2
 Error response from daemon: Cannot link to a non running container: /tomcat2 AS /tomcat3/tomcat2
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 cat /etc/hosts
 Error response from daemon: Cannot link to a non running container: /tomcat2 AS /tomcat3/tomcat2
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker restart tomcat3
 Error response from daemon: Cannot restartcontainer tomcat3: Cannot link to a non running container: /tomcat2 AS /tomcat3/tomcat2

11、docker容器可以支持的ip數量
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network ls
 NETWORK ID         NAME               DRIVER             SCOPE
 f92c1c2c4bf7       bridge             bridge             local
 e6983a928f90       host               host               local
 21e45a3c002b       none               null               local
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network inspect f92c1c2c4bf7 
 [
   {
        "Name": "bridge",
        "Id": "f92c1c2c4bf7f5b909637cded1301a513ac650f8eb5841504ed7619d7a0d5e66",
        "Created": "2020-05-01T16:34:11.962547179+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
               {
                    "Subnet": "172.18.0.0/16", #默認情況下可以開啟六萬多個ip
                    "Gateway": "172.18.0.1"
               }
           ]
       }

12、清空所有容器
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker rm -f $(docker ps -aq)
 95e728be43e6
 bb2f63e66d4b
 63821ec9194e
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker ps
 CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS               NAMES
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# ip add
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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 1500qdisc pfifo_fast state UP group default qlen 1000
   link/ether 00:16:3e:0a:07:ba brd ff:ff:ff:ff:ff:ff
   inet 172.17.119.96/20 brd 172.17.127.255 scope global dynamic eth0
       valid_lft 315020766sec preferred_lft 315020766sec
 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500qdisc noqueue state DOWN group default 
   link/ether 02:42:f1:f3:d2:be brd ff:ff:ff:ff:ff:ff
   inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
       valid_lft forever preferred_lft forever

13、自定義網絡命令詳解
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network create --help
 
 Usage:docker network create [OPTIONS] NETWORK
 
 Create a network
 
 Options:
      --attachable          Enable manual container attachment
      --aux-addressmap     Auxiliary IPv4 or IPv6 addresses used by
                             Network driver (default map[])
      --config-fromstring   The network from which copying the configuration
      --config-only        Create a configuration only network
  -d, --driverstring       Driver to manage the Network (default "bridge")
      --gatewaystrings     IPv4 or IPv6 Gateway forthe master subnet
      --ingress            Create swarm routing-mesh network
      --internal            Restrict external access to the network
      --ip-rangestrings     Allocate container ip from a sub-range
      --ipam-driverstring   IP Address Management Driver (default "default")
      --ipam-optmap         Set IPAM driver specific options (default map[])
      --ipv6                Enable IPv6 networking
      --labellist           Set metadata on a network
  -o, --optmap             Set driver specific options (default map[])
      --scopestring         Control the network's scope
      --subnetstrings       Subnet inCIDR format that represents a
                             network segment

14、bridge模式網絡

Docker守護進程創建了一個虛擬乙太網橋docker0,附加在其上的任何網卡之間都能自動轉發數據包。默認情況下,守護進程會創建一對對等接口,將其中一個接口設置為容器的eth0接口,另一個接口放置在宿主機的命名空間中,從而將宿主機上的所有容器都連接到這個內部網絡上。同時,守護進程還會從網橋的私有地址空間中分配一個IP位址和子網給該容器。

 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --net=bridge --hostname tomcat2 --name tomcat2 tomcat:8
 27f3deb11ce1c4c2103c91a29799247bd5dbce9a1aceea4787cd826ee32bfe59
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker ps
 CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS                     NAMES
 27f3deb11ce1       tomcat:8            "catalina.sh run"  29seconds ago     Up 28seconds       0.0.0.0:32780->8080/tcp   tomcat2
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat2 ping tomcat4
 ping: tomcat4: Name or servicenot known

15、host模式

該模式將禁用Docker容器的網絡隔離。因為容器共享了宿主機的網絡命名空間,容器和宿主機具有相同的IP位址172.17.119.96直接暴露在公共網絡中。因此,你需要通過埠映射(port mapping)來進行協調。該模式比bridge模式更快(因為沒有路由開銷),但是它將容器直接暴露在公共網絡中,是有安全隱患的。

 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --name tomcat3 --net host tomcat:8
 d4e9d230278c9a32b19069f0f63ce66766cf5943bc7c6121c148965177b3bfbe
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat3 ip add
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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 1500qdisc pfifo_fast state UP group default qlen 1000
   link/ether 00:16:3e:0a:07:ba brd ff:ff:ff:ff:ff:ff
   inet 172.17.119.96/20 brd 172.17.127.255 scope global dynamic eth0
       valid_lft 315019616sec preferred_lft 315019616sec
 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc noqueue state UP group default 
   link/ether 02:42:f1:f3:d2:be brd ff:ff:ff:ff:ff:ff
   inet 172.18.0.1/16 brd 172.18.255.255 scope global docker0
       valid_lft forever preferred_lft forever
 129: vethcc0922d@if128: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc noqueue master docker0 state UP group default 
   link/ether a2:45:72:a8:0d:84 brd ff:ff:ff:ff:ff:ff link-netnsid 0

16、container模式(一般緩存使用,在同一臺機器訪問比較快)

在理解了host模式後,這個模式也就好理解了。這個模式指定新創建的容器和已經存在的一個容器共享一個Network Namespace,而不是和宿主機共享。新創建的容器不會創建自己的網卡,配置自己的IP,而是和一個指定的容器共享IP、埠範圍等。同樣,兩個容器除了網絡方面,其他的如文件系統、進程列表等還是隔離的。兩個容器的進程可以通過lo網卡設備通信。

 # 相當於和tomcat1公用同一個ip同一個埠,導致埠衝突
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --net container:tomcat1 --name tomcat2 tomcat:8
 docker: Error response from daemon: conflicting options: port publishing and the container type network mode.
 See 'docker run --help'.

17、自定義橋接網絡

自定義網絡默認使用的是橋接網絡「bridge」

1.創建橋接網絡
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
 e99e400ffce3e42db45ecf4bf84baf97b726067d157445b24c630b5ad7689477
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network ls
 NETWORK ID         NAME               DRIVER             SCOPE
 f92c1c2c4bf7       bridge             bridge             local
 e6983a928f90       host               host               local
 e99e400ffce3       mynet               bridge             local
 21e45a3c002b       none               null               local
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network inspect mynet
 [
   {
        "Name": "mynet",
        "Id": "e99e400ffce3e42db45ecf4bf84baf97b726067d157445b24c630b5ad7689477",
        "Created": "2020-05-03T15:31:32.617833011+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": {}
   }
 ]

2.創建容器
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:8
 5490bfc5d4b92a8e816670d51604bc79292c9ed4a3c25218031370dd4f85a674
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:8
 eb1b6b71c87e344c2d11c872d8374d74b4e3fa5129c7fade1a1bfb0ef8dc29ce
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker ps
 CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS                     NAMES
 eb1b6b71c87e       tomcat:8            "catalina.sh run"  7seconds ago       Up 5seconds        0.0.0.0:32778->8080/tcp   tomcat-net-02
 5490bfc5d4b9       tomcat:8            "catalina.sh run"  19seconds ago     Up 18seconds       0.0.0.0:32777->8080/tcp   tomcat-net-01

3.自定義網絡本身就維護好了主機名和ip的對應關係(ip和域名都能通)
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-02 ip add
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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
 133: eth0@if134: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc noqueue state UP group default 
   link/ether 02:42:c0:a8:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet 192.168.0.3/16 brd 192.168.255.255 scope global eth0
       valid_lft forever preferred_lft forever
       
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
 64bytes from 192.168.0.3: icmp_seq=1ttl=64time=0.105 ms
 64bytes from 192.168.0.3: icmp_seq=2ttl=64time=0.065 ms
 64bytes from 192.168.0.3: icmp_seq=3ttl=64time=0.064 ms
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
 64bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1ttl=64time=0.037 ms
 64bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2ttl=64time=0.062 ms
 64bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3ttl=64time=0.062 ms

4.指定ip
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker run -d -P --name tomcat-net-04 --ip 192.168.0.77 --net mynet tomcat:8
 9be39c53162c188753c7986fc17e9792d3bf709f458be63e3d626e488e6cf6ea
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping 192.168.0.77
 PING 192.168.0.77 (192.168.0.77) 56(84) bytes of data.
 64bytes from 192.168.0.77: icmp_seq=1ttl=64time=0.089 ms
 64bytes from 192.168.0.77: icmp_seq=2ttl=64time=0.061 ms

18、打通mynet-docker01.不在同一網段,服務無法訪問

 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker ps
 CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS             PORTS                     NAMES
 9be39c53162c       tomcat:8            "catalina.sh run"  17minutes ago     Up 17minutes       0.0.0.0:32779->8080/tcp   tomcat-net-04
 eb1b6b71c87e       tomcat:8            "catalina.sh run"  27minutes ago     Up 27minutes       0.0.0.0:32778->8080/tcp   tomcat-net-02
 5490bfc5d4b9       tomcat:8            "catalina.sh run"  27minutes ago     Up 27minutes       0.0.0.0:32777->8080/tcp   tomcat-net-01
 d4e9d230278c       tomcat:8            "catalina.sh run"  35minutes ago     Up 35minutes                                 tomcat3
 cab9a4c1556a       tomcat:8            "catalina.sh run"  45minutes ago     Up 45minutes       0.0.0.0:32776->8080/tcp   tomcat1
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping tomcat3
 ping: tomcat3: Name or servicenot known

2.將服務加入新建網絡

 # 將tomcat1添加到自己的新建的網絡裡面
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network connect mynet tomcat1
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network inspect mynet
            "cab9a4c1556a7c5c4f91b71aa971aac47bedd8b8fadedfaafd13e3d41a8af994": {
                "Name": "tomcat1",
                "EndpointID": "1bf906eb112fd901e621c0a6077250ecde78a398b6babeded03ca2c05bcf0916",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16", # 多了一條地址
                "IPv6Address": ""
           },
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat1 ip add
 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536qdisc 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
 128: eth0@if129: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc 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
 137: eth1@if138: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500qdisc noqueue state UP group default # 新加了一塊網卡
   link/ether 02:42:c0:a8:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
   inet 192.168.0.4/16 brd 192.168.255.255 scope global eth1
       valid_lft forever preferred_lft forever
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping tomcat1
 PING tomcat1 (192.168.0.4) 56(84) bytes of data.
 64bytes from tomcat1.mynet (192.168.0.4): icmp_seq=1ttl=64time=0.082 ms

3.將服務退出新建網絡
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker network disconnect mynet tomcat1
 
 [root@iZ2zeir6vcnpz8qw3t455tZ ~]# docker exec -it tomcat-net-01 ping tomcat1
 ping: tomcat1: Name or servicenot known

如果文章有任何錯誤歡迎不吝賜教,其次大家有任何關於運維的疑難雜問,也歡迎和大家一起交流討論。關於運維學習、分享、交流,筆者開通了微信公眾號【運維貓】,感興趣的朋友可以關注下,歡迎加入,建立屬於我們自己的小圈子,一起學運維知識。群主還經營一家Orchis飾品店,喜歡的小夥伴歡迎👏前來下單。

有需要技術交流的小夥伴可以加我微信,期待與大家共同成長,本人微信:

最近有一些星友諮詢我知識星球的事,我也想繼續在星球上發布更優質的內容供大家學習和探討。運維貓公眾號平臺致力於為大家提供免費的學習資源,知識星球主要致力於即將入坑或者已經入坑的運維行業的小夥伴。

點擊閱讀原文  查看更多精彩內容!!!

相關焦點

  • Docker學習之docker-compose詳解
    項目(project): 由一組關聯的應用容器組成的一個完整的業務單元, 在 docker-compose 中定義docker-compose.yml 文件詳解Docker compose 允許用戶通過 docker-compose.yml 文件來定義一組相關聯的容器為一個工程。
  • Docker命令大全及Dockerfile詳解(附示例)
    命令,因為此退出容器終端,不會導致容器的停止$ docker exec -it mynginx_1 /bin/bash$ docker exec -it mynginx_1 /bin/bash start.sh# 查看容器埠映射:docker port 容器名$ docker port mynginx_1# 查看容器內已修改文件:docker diff 容器名$ docker diff
  • 【Docker】容器有幾種網絡模式?
    三、Bridge模式        相當於Vmware中的Nat模式,容器使用獨立network Namespace,並連接到docker0虛擬網卡(Docker進程首次啟動時會在當前節點上創建一個名為docker0的橋設備,並默認配置其使用172.17.0.0/16網絡,改網絡是Bridge模式的一種實現,也是創建容器是默認使用的網絡
  • Docker-compose命令大全及配置文件詳解
    本文是Python Web開發工具系列的第二篇,第一篇見Docker命令大全及Dockerfile詳解(附示例)。整個系列文章見個人博客(點擊原文閱讀即可跳轉):Docker-Compose的安裝安裝docker-compose前必需先安裝好docker。
  • Docker 網絡模型之 macvlan 詳解,圖解,實驗完整
    上一篇文章我們詳細介紹了 macvlan 這種技術,macvlan 詳解,由於它高效易配置的特性,被用在了 Docker 的網絡方案設計中,這篇文章就來說說這個
  • Docker網絡詳解及pipework源碼解讀與實踐
    Docker的4種網絡模式我們在使用docker run創建Docker容器時,可以用--net選項指定容器的網絡模式,Docker有以下4種網絡模式:下面分別介紹一下Docker的各個網絡模式。1.4 bridge模式bridge模式是Docker默認的網絡設置,此模式會為每一個容器分配Network Namespace、設置IP等,並將一個主機上的Docker容器連接到一個虛擬網橋上。下面著重介紹一下此模式。
  • Docker實戰:docker部署nginx項目詳解
    命令格式為:docker search [options] keyword,輸出內容包括鏡像名稱、鏡像描述、收藏數、是否官方創建、是否自動創建等信息,默認輸出的結果按收藏數進行排序。這裡我們可以看到docker倉庫提供了很多nginx鏡像,最受歡迎的還是官方的nginx。
  • Docker Network—Bridge 模式
    涉及到連接,就引出了網絡通信的幾種模式。Docker 默認提供了 5 種網絡驅動模式。bridge: 默認的網絡驅動模式。如果不指定驅動程序,bridge 便會作為默認的網絡驅動模式。當應用程式運行在需要通信的獨立容器(standalone containers)中時,通常會選擇 bridge 模式。
  • 如何理解docker網絡
    我們從將一個簡單例子出發,引出docker的六種網絡模式,然後從linux底層原理和命令出發來闡述docker網絡的實現原理。一個簡單的例子        首先,我們來看一個簡單的例子,在同一個host上創建兩個容器,來看看host和兩個容器之間是否可以互通。
  • Docker網絡筆記
    一、什麼是ip地址二、劃分子網2.1、為什麼要劃分子網2.2、子網分類2.3、子網劃分2.4、子網掩碼2.5、無分類-構成超網三、網絡模式3.1、橋接3.2、NAT3.3、Host3.4、內部網絡四、Docker0
  • Docker小白到實戰之Docker網絡簡單了解一下
    Docker網絡模式簡介當Docker進程啟動時,會在主機上創建一個名為docker0的虛擬網橋,此主機上啟動的Docker容器默認會連接到這個虛擬網橋上。這樣所有容器通過這個虛擬網橋就打通了,所以這裡的docker0工作方式和物理交換機很像。
  • Docker Stack配置文件詳解
    Stack 文件就是 Docker Compose 文件。
  • VMware虛擬機三種網絡模式詳解
    在使用虛擬機軟體的時候,很多初學者都會遇到很多問題,而VMware的網絡連接問題是大家遇到最多問題之一。在學習交流群裡面,幾乎每天都會有同學問到這些問題,寫這篇詳解也是因為群裡童鞋網絡出故障,然後在幫他解決的過程中,對自己的理解也做一個總結。接下來,我們就一起來探討一下關於VMware Workstations網絡連接的三種模式。
  • Docker容器網絡-實現篇
    前面介紹了:Docker容器網絡-基礎篇前文說到容器網絡對Linux虛擬化技術的依賴,這一篇章我們將一探究竟,看看Docker究竟是怎麼做的。而要通過二層網絡到達容器2,就需要127.17.0.3對應的MAC地址。所以,容器1的網絡協議棧就需要通過eth0網卡來發送一個ARP廣播,通過IP找到MAC地址。所謂ARP(Address Resolution Protocol),就是通過三層IP位址找到二層的MAC地址的協議。這裡說到的eth0,就是Veth Pair的一端,另一端則插在了宿主機的docker0網橋上。
  • Docker入門詳解
    容器(Container):類似於一個輕量級的沙盒,可以將其看作一個極簡的Linux系統環境(包括root權限、進程空間、用戶空間和網絡空間等),以及運行在其中的應用程式。Docker引擎利用容器來運行、隔離各個應用。容器是鏡像創建的應用實例,可以創建、啟動、停止、刪除容器,各個容器之間是是相互隔離的,互不影響。
  • Docker精髓講解(容器數據卷、Dockerfile、Docker網絡)
    [root@slaves2 Dockerfile]# docker run -d -P --name tomcat02 tomcat#默認為橋接模式:[root@slaves2 Dockerfile]# docker run -d -P --name tomcat02 --net bridge tomcat
  • Docker 入門萬字詳解!新手也能看懂!
    這種精細化運作模式自有其優勢。>Bridge默認 docker 網絡隔離基於網絡命名空間,在物理機上創建 docker 容器時會為每一個 docker 容器分配網絡命名空間,並且把容器 IP 橋接到物理機的虛擬網橋上。
  • Dockerfile詳解
    docker build命令用於從Dockerfile構建鏡像。可以在docker build命令中使用-f標誌指向文件系統中任何位置的Dockerfile。Docker鏡像發布的步驟:1、編寫一個dockerfile文件2、docker build 構建成為一個鏡像3、docker run 鏡像4、docker push 鏡像(發布鏡像到DockerHub、阿里雲鏡像倉庫)鏡像操作圖:查看官方各個鏡像的Dockerfile(以centos為例)
  • Docker - 網絡管理
    默認情況下,容器和宿主機之間網絡是隔離的現在啟動了一個 nginx 容器
  • docker-7:mac使用mac-docker-connector打通宿主機與docker網絡
    ,mac本地是不能直接訪問的,需要打通docker和mac本地的網絡,本文即解決此問題。之前使用過另外一種方式,但是太麻煩,我現在不用了:docker-1:本地開發打通宿主機與docker服務網絡https://mp.weixin.qq.com/s/-Qkt5SeDYgYhDNqbQaUWYg使用docker-connector(vpn概念),官方地址:https://github.com/wenjunxiao/mac-docker-connector