您的位置:首页 > 运维架构 > Docker

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

2017-08-15 12:27 597 查看
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
网络验证连接:

<
4000
/span>

$ 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: