应用--link来连贯容器

https://docs.docker.com/netwo...

Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. One feature that user-defined networks do not support that you can do with --link is sharing environmental variables between containers. However, you can use other mechanisms such as volumes to share environment variables between containers in a more controlled way.

删除原有的test2容器,而后从新创立一个,应用--link选项连贯test1容器

docker run -d --name test2 --link test1 busybox /bin/sh -c "while true;do sleep 3600;done"

目前test1与test2的ip别离为172.17.0.2/16,172.17.0.3/16。
因为创立test2容器的时候,应用了--link,如下两种形式都是等价的。
但第二种形式的益处是:

  • 它能够让咱们在解决业务逻辑的时候不必关怀连贯的内部容器的ip到底是什么。
  • 假如咱们设置的db内部的容器重启之后IP变了,这个
docker exec -it test2 ping 172.17.0.2docker exec -it test2 ping test1

--link并不是双向的,想在test1上应用name来ping通test2就是不行的

#okdocker exec -it test1 ping 172.17.0.3#failuredocker exec -it test1 ping test2

手动建设bridge网络

做完上述的link试验之后,删掉test2容器,回过头查看一下docker网络

[vagrant@docker-node1 ~]$ docker network lsNETWORK ID NAME DRIVER SCOPEa61c325bd7ba bridge bridge localefb6975c8935 host host local3fa0f2e1a00b none null local

而后咱们本人新建一个bridge网络

docker network create -d bridge my-bridge

建完之后,网络列表是这样的:

[vagrant@docker-node1 ~]$ docker network lsNETWORK ID NAME DRIVER SCOPEa61c325bd7ba bridge bridge localefb6975c8935 host host local4213425c5293 my-bridge bridge local3fa0f2e1a00b none null local

应用brctl show命令查看,后果如下

bridge namebridge idSTP enabledinterfaces
br-4213425c52938000.02421f24b958no
docker08000.02425387e6fbnoveth1d4a1de

而后新建一个test3容器,使它连贯到咱们手动建设的my-bridge网络

docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true;do sleep 3600;done"

此时再应用brctl show命令,就能够查看到my-bridge网络的veth接口了

bridge namebridge idSTP enabledinterfaces
br-4213425c52938000.02421f24b958noveth7bb5433
docker08000.02425387e6fbnoveth1d4a1de

应用docker network inspect 4213425c5293命令,也能看到该网络下的test3容器了

{    "Containers": {        "b9716e4b50ddb4800a03bd04530eea086331493a50fa1dffbcdcadad1801ba58": {            "Name": "test3",            "EndpointID": "ee2124e316486c522ba5414fb5bfd4fc463f45c22e944d65a0028fbcacf39794",            "MacAddress": "02:42:ac:12:00:02",            "IPv4Address": "172.18.0.2/16",            "IPv6Address": ""        }    }}

而后咱们再让test1在连贯name为bridge的网络的根底上,使它还能够连贯到my-bridge

docker network connect my-bridge test1

此时test1就同时连贯到bridge和my-bridge两个网络上了。
name为bridge的网络

docker network inspect a61c325bd7ba{    "Containers": {        "5b567458c87cc1c7eff73d47a753e1171c6478f2705868f01ebd858b196a2283": {            "Name": "test1",            "EndpointID": "e6710f0db01bdbf3669aabeab866a4f27bf1605226dd3d3c98a8b7ea1c6896f0",            "MacAddress": "02:42:ac:11:00:02",            "IPv4Address": "172.17.0.2/16",            "IPv6Address": ""        }    }}

name为my-bridge的网络

docker network inspect 4213425c5293{    "Containers": {        "5b567458c87cc1c7eff73d47a753e1171c6478f2705868f01ebd858b196a2283": {            "Name": "test1",            "EndpointID": "a12ab3ef7cdb07c4cd6cb7bd7f5114e6b05107b19de0240abe1f704d46d8afae",            "MacAddress": "02:42:ac:12:00:03",            "IPv4Address": "172.18.0.3/16",            "IPv6Address": ""        },        "b9716e4b50ddb4800a03bd04530eea086331493a50fa1dffbcdcadad1801ba58": {            "Name": "test3",            "EndpointID": "ee2124e316486c522ba5414fb5bfd4fc463f45c22e944d65a0028fbcacf39794",            "MacAddress": "02:42:ac:12:00:02",            "IPv4Address": "172.18.0.2/16",            "IPv6Address": ""        }    }}

而后做如下测试,发现test1和test3都是能够ping通的,至于为啥没有应用--link选项也能通过name来ping通,而且还是双向ping通呢?

这是因为docker容器只有不是退出默认的bridge网络,而是自定义的bridge网络,容器之间都是能够相互ping通的

docker exec test1 ping test3docker exec test1 ping 172.18.0.2docker exec test3 ping test1docker exec test3 ping 172.18.0.3

至于如下ping失败的起因,则是test1尽管有两个ip,并且和test3有互通的网络,然而这两个ip齐全不在一个网段上了。

docker exec test3 ping 172.17.0.2