编辑推荐: |
本文来自于csdn,实例解析Docker网络管理机制,介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Docker网络安全和通信. |
|
1.给自己的docker (Dcoker1.12GA)容器起个名称
给docker名称的好处是:
- 容易记
- 可以通过特殊命令,使得名称可以在容器和容器之间使用
1.1.查看docker已经存在的镜像
wxl@wxl-pc:~$
docker images |
1.2.选择training/webapp这个镜像,通过–name命令设置名称
wxl@wxl-pc:~$
docker run -d -P --name wangxiaoleiweb training/webapp
python app.py |
最后一行可以看到wangxiaoleiweb已经命名成功
可以使用docker inspect通过刚刚设置的名称来查看wangxiaoleiweb
wxl@wxl-pc:~$
docker inspect wangxiaoleiweb |
1.3.删除docker名称,docker的名称都是唯一的,即一但使用了就不能在另一个镜像使用该名称,可以删除后重新命名.(只删除名字,镜像不会被删除)
2.默认的容器的网络
2.1.Docker通过网络驱动(network driver),默认网络驱动分别是桥接(bridge)和覆盖(overlay)两种.
为一个容器桥接网络
wxl@wxl-pc:~$
docker run -itd --name =networktest ubuntu:14.04
2a433c9467d3d35474 daa544dcac665ecc4b71b202b8 2d0bd59049f7d52e397f |
wxl@wxl-pc:~$
docker network inspect bridge
[
{ "Name": "bridge",
"Id": "7f6b9cbd3eece7301 d196363b5250c44fd0b 275f3c3d38a952 af2ad8b2fd38c2",
"Scope": "local", "Driver":
"bridge", "EnableIPv6":
false, "IPAM": { "Driver":
"default", "Options":
null, "Config": [
{ "Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
}, "Internal": false, "Containers":
{ "2a433c9467d3d35474daa 544dcac665ecc4b71b 202b82d0bd590 49f7d52e397f":
{ "Name": "networktest",
"EndpointID": "d0b94ec934b390784faa 5ad8946e9ba6031afe446 7889e1f7fe0eda5d79deac1",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
}, "Options": { "com.docker.network.bridge.default_bridge":
"true", "com.docker.network.bridge.enable_icc":
"true", "com.docker.network.bridge.enable_ip_masquerade":
"true", "com.docker.network.bridge.host_binding_ipv4":
"0.0.0.0", "com.docker.network.bridge.name":
"docker0", "com.docker.network.driver.mtu":
"1500"
}, "Labels": {}
}
] |
可以看到通过检查网络可以看到容器的IP地址,名称等信息.
2.2.从网络中删除某个容器,可以通过该容器的网络名称,容器名称,id来作为删除的标示,但是通过网络名称是方便的,如networktest
wxl@wxl-pc:~$
docker network disconnect bridge networktest |
再用docker network inspect bridge会发现已经没有networktest信息了
3.自定义容器的网络
容器的网络(network)是用来隔离容器和容器之间或者网络与网络之间的方法,所以,所以我们通过建立网络来隔离容器.其中,内置的bridge网络是无法删除的.
3.1.创建网络
Docker Engine 支持两种网络桥接网络(bridge network)和覆盖网络(overlay
network),桥接的网络局限于单个主机运行的Docker Engine,而覆盖网络可以包含多个主机.
wxl@wxl-pc:~$
docker network create -d bridge my-bridge-network
3bfde1ba62a75e3823 6517f4f0731f48c281cec 107e976039773be134968c453 |
其中,-d指使用Dockerbridge(桥接)方式的网络,如果没有加默认的也是桥接网络.
通过docker network ls来查看已经创建好的网络
3.2.将一个容器添加至新创建的网络中
#这里创建了一个db的容器(若本地没有该镜像会自动拉取)
wxl@wxl-pc:~$ docker run -d --network=my-bridge-network
--name db training/postgres |
通过inspect命令查看已经添加至网络的db容器
wxl@wxl-pc:~$
docker inspect --format= '{{json .NetworkSettings.Networks}}'
db
{"my-bridge-network": {"IPAMConfig":null,"Links":null,
"Aliases":["237e0f7060b6"],
"NetworkID":"3bfde1ba62a75e3823 6517f4f0731f48c281 cec107e976039773be1 34968c453"
,"EndpointID":" 33516faca38c0f76b d2c6ebb6e8c2574c62e242 d5a0c10b77c49e14 b2549f3e5",
"Gateway":" 172.18.0.1"," IPAddress":"172.18.0.2", "IPPrefixLen":16
,"IPv6Gateway":"", "GlobalIPv6Address": "",
"GlobalIPv6PrefixLen" :0, "MacAddress":" 02:42:ac:12:00:02"}}
|
3.3.通过ping的方式验证网络连通性,将两个容器(db容器和web容器)从不同的网络,放置同一个网络.
3.3.1.把training/webapp容器命名为web,方便后续操作
wxl@wxl-pc:~$
docker run -d --name web training/webapp python
app.py
8f12cfaaedda2b348bef437 fa2eeed19ef69ad07 cd98aa72e0c2113710413e6f
|
3.3.2.查看web容器的ip
wxl@wxl-pc:~$
docker inspect --format= '{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}'
web
172.17.0.2
|
3.3.3.进入db容器并且尝试ping一下web容器,发现是ping不通,ctrl+c终止ping,如下图
#进入db容器
wxl@wxl-pc:~$ docker exec -it db bash
#首次尝试ping web容器
root@237e0f7060b6:/# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of
data.
^C
--- 172.17.0.2 ping statistics ---
24 packets transmitted, 0 received, 100% packet
loss, time 23183ms
root@237e0f7060b6:/# exit |
3.3.4.现在,将web容器添加至db容器的网络(即my-bridge-network),然后在ping,即可ping通
wxl@wxl-pc:~$
docker network connect my-bridge-network web
|
#再次进入db容器
wxl@wxl-pc:~$ docker exec -it db bash
#ping web容器,发现已经可以ping通
root@237e0f7060b6:/# ping web
PING web (172.18.0.3) 56(84) bytes of data.
64 bytes from web.my-bridge-network (172.18.0.3):
icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from web.my-bridge-network (172.18.0.3):
icmp_seq=2 ttl=64 time=0.110 ms
64 bytes from web.my-bridge-network (172.18.0.3):
icmp_seq=3 ttl=64 time=0.109 ms
^C
--- web ping statistics ---
3 packets transmitted, 3 received, 0% packet
loss, time 1998ms
rtt min/avg/max/mdev = 0.097/0.105/0.110/0.010
ms
|
可见,不同的容器在不同的网络是可以起到隔离作用的,所以,自定义一个网络可以保证容器和容器之间通信安全.
|