Docker使用网络命令,创建自己的网络

https://blog.csdn.net/qq_35049196/article/details/77186564

Docker官方推荐用户使用自己的自定义网络,所以在使用容器的时候最好使用自定义的网络,默认docker使用自带的bridge网络,bridge网络下的docker容器相互之间无法解析彼此的容器名称。如果您需要容器能够通过 bridge 网络进行通信,则官方允许使用旧版本的--link,这--link是建议使用的唯一用例。最后,官方强烈地考虑使用用户定义的网络。

好了,开始讨论Docker的基本网络配置(没有使用overlay网络):

1.首先,创建并运行两个容器,container1和container2:


$ docker run -itd --name=container1 busybox
 
18c062ef45ac0c026ee48a83afa39d25635ee5f02b58de4abc8f467bcaa28731
 
$ docker run -itd --name=container2 busybox
 
498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152


2.创建一个孤立的bridge网络来测试(即:自定义网络)。


$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw
 
06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8
3.连接container2到网络,然后inspect网络验证连接:

$ docker network connect isolated_nw container2
 
$ docker network inspect isolated_nw
 
[
    {
        "Name": "isolated_nw",
        "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.25.0.0/16",
                    "Gateway": "172.25.0.1/16"
                }
            ]
        },
        "Containers": {
            "90e1f3ec71caf82ae776a827e0712a68a110a3f175954e5bd4222fd142ac9428": {
                "Name": "container2",
                "EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d",
                "MacAddress": "02:42:ac:19:00:02",
                "IPv4Address": "172.25.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]
注意container2自动分配了一个IP地址。由于您--subnet在创建网络时指定了IP地址,因此从该子网中选择了IP地址。

提醒一下,container1只能连接到默认bridge网络。

4.启动第三个容器,但这次使用该--ip标志为其分配IP地址, 并isolated_nw使用docker run 命令的--network选项将其连接到网络:


$ docker run --network=isolated_nw --ip=172.25.3.3 -itd --name=container3 busybox
 
467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551
只要您为容器指定的IP地址是网络子网的一部分,可以通过使用--ip或--ip6标志将IPv4或IPv6地址连接到网络时将容器分配到容器。当您在使用用户定义的网络时以此方式指定IP地址时,配置将作为容器配置的一部分进行保留,并在容器重新加载时进行应用。使用非用户定义的网络时,分配的IP地址将被保留,因为不保证Docker守护程序重新启动时容器的子网不会更改,除非您使用用户定义的网络。
5.检查所使用的网络资源container3。为简洁起见,截断以下输出。


$ docker inspect --format=''  container3
 
{"isolated_nw":
  {"IPAMConfig":
    {
      "IPv4Address":"172.25.3.3"},
      "NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
      "EndpointID":"dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103",
      "Gateway":"172.25.0.1",
      "IPAddress":"172.25.3.3",
      "IPPrefixLen":16,
      "IPv6Gateway":"",
      "GlobalIPv6Address":"",
      "GlobalIPv6PrefixLen":0,
      "MacAddress":"02:42:ac:19:03:03"}
    }
  }
}
因为连接container3到isolated_nw您启动时,它根本没有连接到默认bridge网络。
6.检查所使用的网络资源container2。如果你安装了Python,你可以打印输出。


$ docker inspect --format=''  container2 | python -m json.tool
 
{
    "bridge": {
        "NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
        "EndpointID": "0099f9efb5a3727f6a554f176b1e96fca34cae773da68b3b6a26d046c12cb365",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAMConfig": null,
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:03"
    },
    "isolated_nw": {
        "NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
        "EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d",
        "Gateway": "172.25.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAMConfig": null,
        "IPAddress": "172.25.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:19:00:02"
    }
}
注意container2属于两个网络。bridge 当您启动它时,它加入了默认网络,并将其连接到isolated_nw。

eth0 Link encap:以太网HWaddr 02:42:AC:11:00:03

eth1 Link encap:以太网HWaddr 02:42:AC:15:00:02

7.使用docker attach命令连接到运行container2并检查其网络堆栈:


$ docker attach container2
使用该ifconfig命令检查容器的网络堆栈。您应该看到两个以太网接口,一个用于默认bridge网络,另一个用于isolated_nw网络。

$ sudo ifconfig -a
 
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)
 
eth1      Link encap:Ethernet  HWaddr 02:42:AC:15:00:02
          inet addr:172.25.0.2  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe19:2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)
 
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
8.
Docker嵌入式DNS服务器可以连接到给定网络的容器进行名称解析。这意味着任何连接的容器都可以通过其容器名称在同一网络上ping另一个容器。从里面container2,你可以container3按名字ping 。

 / # ping -w 4 container3
PING container3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.3.3: seq=3 ttl=64 time=0.097 ms
 
--- container3 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms
此功能不适用于默认bridge网络。双方 container1并container2连接到bridge网络,但你不能ping container1从container2使用的容器名称。

/ # ping -w 4 container1
ping: bad address 'container1'
您仍然可以直接ping IP地址:

/ # ping -w 4 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.095 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms
64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.072 ms
64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.101 ms
 
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.072/0.085/0.101 ms
从分离container2,离开它使用运行CTRL-p CTRL-q。

9.
目前,container2连接到这两个bridge和isolated_nw 网络,因此它可以与两个通讯container1和container3。然而,container3并container1没有任何网络共同点,所以他们无法沟通。要验证这一点,请附加container3并尝试container1通过IP地址ping 。

$ docker attach container3
 
$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
^C
 
--- 172.17.0.2 ping statistics ---
10 packets transmitted, 0 packets received, 100% packet loss
 
从分离container3,离开它使用运行CTRL-p CTRL-q。

即使容器未运行,也可以将容器连接到网络。但是,docker network inspect仅显示运行容器的信息。
以上为Docker基本网络的信息,但是如果您确实要使用默认的bridge网络,请看下面使用--link选项如何使用。

链接容器而不使用用户定义的网络
完成基本容器网络示例中的步骤后 , container2可以container3自动解析名称,因为这两个容器都连接到isolated_nw网络。但是,连接到默认bridge网络的容器无法解析彼此的容器名称。如果您需要容器能够通过bridge网络进行通信,则需要使用旧版链接功能。这--link是建议使用的唯一用例。您应该强烈地考虑使用用户定义的网络。

使用旧link标志在默认bridge网络上的通信之间添加以下功能进行通信:

将容器名称解析为IP地址的能力
将网络别名定义为引用链接容器的替代方法的能力,使用 --link=CONTAINER-NAME:ALIAS
安全的集装箱连接(隔离通过--icc=false)
环境变量注入
要重申,当您使用用户定义的网络时,默认情况下提供所有这些功能,不需要其他配置。此外,您可以自动附加到多个网络并从多个网络中分离。

使用DNS进行自动名称解析
支持--link为链接的容器提供名称别名的选项
网络中容器的自动安全隔离环境
环境变量注入
以下示例简要介绍如何使用--link。

1.继续上面的例子,创建一个新的容器container4并将其连接到网络isolated_nw。另外,container5使用--link标志链接到容器 (container5不存在!)。

$ docker run --network=isolated_nw -itd --name=container4 --link container5:c5 busybox
 
01b5df970834b77a9eadbaff39051f237957bd35c4c56f11193e0594cfd5117c
这有点棘手,因为container5还不存在。当 container5创建,container4将能够解决的名字c5到 container5的IP地址。
注意:使用传统链接创建的容器之间的任何链接本质上都是静态的,并且通过别名强制绑定容器。它不容忍链接的容器重新启动。用户定义的网络中的新链接功能支持容器之间的动态链接,并允许链接的容器中的重新启动和IP地址更改。

由于您尚未创建容器container5尝试ping它将导致错误。附加container4并尝试ping任一container5或c5:

$ docker attach container4
 
$ ping container5
 
ping: bad address 'container5'
 
$ ping c5
 
ping: bad address 'c5'

离开container4运行CTRL-p CTRL-q。
2.创建另一个名为的容器container5,并将其链接到container4 使用别名c4。


$ docker run --network=isolated_nw -itd --name=container5 --link container4:c4 busybox
 
72eccf2208336f31e9e33ba327734125af00d1e1d2657878e2ee8154fbb23c7a
现在附加container4并尝试ping c5和container5。

$ docker attach container4
 
/ # ping -w 4 c5
PING c5 (172.25.0.5): 56 data bytes
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms
 
--- c5 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms
 
/ # ping -w 4 container5
PING container5 (172.25.0.5): 56 data bytes
64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms
 
--- container5 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms
退出container4运行CTRL-p CTRL-q。
3.最后,附上container5并验证你可以ping通container4。


$ docker attach container5
 
/ # ping -w 4 c4
PING c4 (172.25.0.4): 56 data bytes
64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms
64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms
64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms
 
--- c4 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.065/0.070/0.082 ms
 
/ # ping -w 4 container4
PING container4 (172.25.0.4): 56 data bytes
64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms
64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms
64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms
 
--- container4 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.065/0.070/0.082 ms

--------------------- 
作者:丶益达丶 
来源:CSDN 
原文:https://blog.csdn.net/qq_35049196/article/details/77186564 
版权声明:本文为博主原创文章,转载请附上博文链接!


更多精彩内容