docker网络管理命令如下:
- docker network create
- docker network connect
- docker network ls
- docker network rm
- docker network disconnect
- docker network inspect
创建网络:
默认创建的是bridge网络:
[root@docker01 ~]# docker network create simple-network
b3e3c58a844e486644e0bd44a67fc983532a36e854208e8256cbb0e164f50480
[root@docker01 ~]# docker network inspect simple-network
[
{
"Name": "simple-network",
"Id":
"b3e3c58a844e486644e0bd44a67fc983532a36e854208e8256cbb0e164f50480",
"Created": "2018-01-04T16:53:21.071813651+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
不像bridge网络,直接可以创建。创建overlay网络需要一些条件:
- 访问到一个键值存储。支持Consul,Etcd,ZooKeeper分布式键值存储
- 与键值存储连接的主机集群。
- 在swarm群集中的每个主机上正确配置了引擎的daemon。
支持overlay网络的docker选项:
- clusterstore
- clusterstoreopt
- clusteradvertise
当你创建了一个网络,默认会创建一个不重叠的子网,使用--subnet选项可以直接指定子
网络,在bridge网络中只可以指定一个子网络,而在overlay网络中支持多个子网络。
除了--subnet,还可以指定:--gateway,--ip-range,--aux-address
选项。
要确保子网不会重叠,否则,网络会创建失败并返回错误。
创建自定义网络时,可以向驱动程序传递附加选项,bridge驱动接受以下选项:
例如:
[root@docker01 ~]# docker network create -o
"com.docker.network.bridge.host_binding_ipv4"="192.168.0.133" my-network
1e4f2931c9352a19127eb323b717c16c87187f0221f466b24892b1576174432c
[root@docker01 ~]# docker network inspect my-network
[
{
"Name": "my-network",
"Id":
"1e4f2931c9352a19127eb323b717c16c87187f0221f466b24892b1576174432c",
"Created": "2018-01-04T17:33:08.658600787+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.20.0.0/16",
"Gateway": "172.20.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.host_binding_ipv4": "192.168.0.133"
},
"Labels": {}
}
]
启动一个容器并发布端口:可以看到绑定的地址
连接容器
可以连接已存在的容器到一个或者多个网络中。一个容器可以连接到多个不同网络驱动的网络中。
当连接一旦建立,容器便可以和其他的容器通讯,通过IP或者容器名称。
对于支持多主机连接的overlay网络或者自定义插件,连接到同一个多主机网络的不同主机上的容器,也可以用这种方式通信。
基本容器网络示例:
1、首先,创建和运行两个容器:container1和container2
2、创建一个用户自定义网络 isolated_nw,是bridge网络
root@docker01 ~]# docker network create d bridge subnet
172.25.0.0/16 gateway 172.25.0.1 isolated_nw
59474e3fd39230f8998b2fbc7d6b7b488f6f9df0e56f6ae8f79c3c2c34ee1931
3、连接continer2容器到这个新创建的网络,并inspect这个网络,检查网络的连接
[root@docker01 ~]# docker network connect isolated_nw continer2
[root@docker01 ~]# docker network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id":
"59474e3fd39230f8998b2fbc7d6b7b488f6f9df0e56f6ae8f79c3c2c34ee1931",
"Created": "2018-01-05T09:06:18.420782438+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.25.0.0/16",
"Gateway": "172.25.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"3243b2b7cb47fa1820582b3a9c44a4b20c4c11646facadff8ba6c70fcc876294": {
"Name": "continer2",
"EndpointID":
"9cb56361727e22f16177a7246196d9a33e3bc9642b403b8c254cc2d1aac9bd53",
"MacAddress": "02:42:ac:19:00:02",
"IPv4Address": "172.25.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@docker01 ~]#
4、创建容器continer3,并分配一个固定IP172.25.3.3
[root@docker01 ~]# docker run -itd --name continer3 --network isolated_nw --
ip=172.25.3.3 centos7:new002 /bin/bash
f71f8258f80f380287a29f2ecc45fd995f6a4f424cbdcefd7dbb5252d48beadd
使用--ip和--ip6参数指定的IP地址,如果是用户定义的网络,在容器重启的时候,会保持有效,如果不是用户定义的网络,分配的IP地址是不会保持有效的。
5、检查continer3的网络资源:
[root@docker01 ~]# docker inspect --format='' continer3
6、检查continer2容器的网络资源:
[root@docker01 ~]# docker inspect --format='' continer2 | python -m json.tool
现在continer2属于两个网络:
7、进入容器continer2,并尝试和continer3及continer1通信
有两个IP,网关是连接到的第一个网络的网关
docker内嵌了DNS服务,意思是链接到同一个网络的容器,可以使用容器名进行通信。
默认的bridge网络是不可以使用名称通信的,IP可以
如果想让默认网络中,也可以使用容器名进行通信呢?
使用link的特性。这是唯一推荐使用link的场景。应该使用自定义的网络来替代它的。
在默认网络中使用link增加了一下特性:
- 解析容器名到IP地址
- 定义网络别名
-
- --link=CONTAINER-NAME:ALIAS
- 增强网络连接的安全性
- 环境变量注入
例如:
[root@docker01 ~]# docker run -itd --name container4 --link container1:c1
centos7:new002 /bin/bash
取消连接:
[root@docker01 ~]# docker network disconnect isolated_nw continer2
[root@docker01 ~]# docker network disconnect isolated_nw continer3
删除网络: