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

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网络。双方 container1container2连接到bridge网络,但你不能ping container1container2使用的容器名称。

/ # 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连接到这两个bridgeisolated_nw 网络,因此它可以与两个通讯container1container3然而,container3container1没有任何网络共同点,所以他们无法沟通。要验证这一点,请附加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 c5container5

$ 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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值