默认网络
安装Docker后, Docker会自动创建三个网络, 使用docker network ls可以列出所有网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a15ca8d2f9f9 bridge bridge local
da647a919817 host host local
ebd9744f3c65 none null local
bridge网络就是docker0网络, 在宿主机器上使用ifconfig就可以看到这个网络接口.
可以在容器启动时通过传递选项--network=
none网络将容器添加到一个特定容器的网络栈里, 这个容器里除了lookback接口,没有其他网络接口.
host网络将容器添加到宿主机网络栈中, 容器内的网络配置等同于宿主机网络.
bridge网络详解
bridge网络在所有Docker上都可以使用
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "a15ca8d2f9f92caa38cf8680fe4f0833a31e3a387581b41fdf000189c229d7e5",
"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": {},
"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": {}
}
]
Docker引擎默认给bridge网络创建了子网掩码和默认网关.
所有连接到bridge的容器都可以通过IP地址互相通信, 但是Docker在默认的bridge网络上不提供自动的服务发现, 如果想与bridge上的容器通信, 需要使用
docker run --link选项
docker0 bridge网络支持端口映射, docker run --link允许docker0上的容器彼此通信, 但这些技术很难实现, 并且容易出错, 所以尽量避免使用它们, 而是应该使用自定义网络来取代它们.
用户自定义网络
使用自定义网络可以更好的隔离容器, Docker提供了一些默认的网络驱动用以创建自定义网络, 包括bridge网络, overlay网络和MACVLAN网络, 也可以创建一个网络插件或者根据自己的规格实现的远程网络.
用户可以创建多个自定义网络, 一个容器也可以被添加到多个网络中, 容器不能跨网络通信, 但是连接到两个网络的容器可以和各自网络内的容器通信, 当容器连接到多个网络时, 实际的外部连接由第一个词典序的非内部网络提供.
bridge网络
创建一个bridge网络
[root@localhost:~# docker network create --driver bridge isolated_nw
a8e903e7dd07abdad797802da95b09379b218389973f0084a2ea517c3f11e55a
root@localhost:~# docker network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "a8e903e7dd07abdad797802da95b09379b218389973f0084a2ea517c3f11e55a",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1/16"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
root@localhost:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
fc562e375776 bridge bridge local
6ef4aff23bcd host host local
a8e903e7dd07 isolated_nw bridge local
61c5f4765fb4 none null local
使用下面命令指定使用的网络
root@localhost:~# docker run --network=isolated_nw -itd --name=container3 busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
fdab12439263: Pull complete
Digest: sha256:f102731ae8898217038060081c205aa3a4ae3f910c2aaa7b3adeb6da9841d963
Status: Downloaded newer image for busybox:latest
e962f9744795324ceb28a21969fdb929af5072084285ff440dbc614ce79ffa32
root@localhost:~# docker network inspect isolated_nw
[
{
"Name": "isolated_nw",
"Id": "a8e903e7dd07abdad797802da95b09379b218389973f0084a2ea517c3f11e55a",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1/16"
}
]
},
"Internal": false,
"Containers": {
"e962f9744795324ceb28a21969fdb929af5072084285ff440dbc614ce79ffa32": {
"Name": "container3",
"EndpointID": "48d799b965e595c8780308a0ac19655afc1e44eaa0fc57481eedb23f818097bf",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
在自定义bridge网络中不支持linking, 但可以公开容器的一个端口, 这样可以使其成为外部网络的一部分.(This is useful if you want to make a portion of the bridge
network available to an outside network.)
bridge网络适合在单台主机上运行较小的网络, 如果想建立相当大的网络, 需要使用overlay网络.
docker_gwbridge网络
docker_gwbridge是一个本地的bridge网, 它会在以下两种情况被docker自动创建
- 当初始化或者加入一个集群的时候, 用于不同主机间的集群节点的通信
- 当所有的容器都不能提供对外部的连接时
如果需要一些特定配置的docker_gwbridge, 可以提前创建, 如
docker network create --subnet 172.30.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
docker_gwbridge
Docker引擎集群模式下的overlay网络
可以在集运模式下的管理节点上创建overlay网络, 此时是不需要外部的key-value存储的, 集群使该overlay网络只对集群内的节点是可用的,
使用外部key-value存储的overlay网络
自定义网络插件
Docker内嵌的DNS服务器
Docker守护进程为连接到自定义网络的容器提供服务发现而运行了一个内嵌的DNS服务, 从容器发出的名字解析请求首先由该内嵌服务器处理, 如果内嵌DNS服务不能处理该解析请求, 那么就会将请求转发到外部的DNS服务. 当新容器创建后只有默认的127.0.0.11会列在resolv.conf中.