Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls命令查看
none 网络:顾名思义,none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。这样一个封闭的网络封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。
host 网络:连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host完全一样。可以通过 --network=host 指定使用 host 网络。
在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host 网络的使用场景又是什么呢?直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。Docker host 的另一个用途是让容器可以直接配置 host 网络。
[root@vm001 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
428f3e3c8496 bridge bridge local
2c68a3f6806a host host local
3304f31d9041 none null local
[root@vm001 ~]# docker run -it --network=hosy busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
697743189b6d: Pull complete
Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f
Status: Downloaded newer image for busybox:latest
docker: Error response from daemon: network hosy not found.
[root@vm001 ~]# docker run -d -p 80:80 --name web -h webserver httpd
0466c72fe4df9323192a804a82521ebe4fd785944d70ed60537aa24ac36f4249
[root@vm001 ~]# curl http://localhost
<html><body><h1>It works!</h1></body></html>
[root@vm001 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:f5:3a:55 brd ff:ff:ff:ff:ff:ff
inet 10.20.0.111/24 brd 10.20.0.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::9602:d762:b614:98cb/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:ea:b3:96 brd ff:ff:ff:ff:ff:ff
inet 192.168.101.29/24 brd 192.168.101.255 scope global dynamic enp0s8
valid_lft 67485sec preferred_lft 67485sec
inet6 fe80::bf67:d535:da4d:edab/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:2e:b9:8e:1b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:2eff:feb9:8e1b/64 scope link
valid_lft forever preferred_lft forever
16: veth14e64bc@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 56:8f:1e:84:cd:3b brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::548f:1eff:fe84:cd3b/64 scope link
valid_lft forever preferred_lft forever
Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定–network,创建的容器默认都会挂到 docker0 上。
[root@vm001 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02422eb98e1b no veth14e64bc
当前 docker0 上没有任何其他网络设备,我们创建一个容器看看有什么变化。
[root@vm001 ~]# docker run -d httpd
01068d819fa1b03210fe1fbe517d41e576e45e8c034c783437fbd361e9d0a40b
[root@vm001 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02422eb98e1b no veth14e64bc
veth1d6c709
[root@vm001 ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "428f3e3c84969db0880098a3c0ec3b6d840eb76a9a25f442547307e5eb34f4f0",
"Created": "2019-03-24T09:38:30.393383805+08:00",
"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,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"01068d819fa1b03210fe1fbe517d41e576e45e8c034c783437fbd361e9d0a40b": {
"Name": "affectionate_lewin",
"EndpointID": "72968c1a05f3597aad49cb3bf2b833462eb9b9425e1bc242ac4c405b2cdf3443",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"0466c72fe4df9323192a804a82521ebe4fd785944d70ed60537aa24ac36f4249": {
"Name": "web",
"EndpointID": "b960dbc17d5a006f1273299c8a7fadd7182194d8e04990b62b4544f4528f7467",
"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": {}
}
]
除了 none, host, bridge 这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。Docker 提供一种 user-defined 网络驱动:bridge。我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:
[root@vm001 ~]# docker network create --driver bridge my_net
3761dec61b52d042dd59a1b43304fd42c96cc58abb9d309fd02bf2747fd1118d
[root@vm001 ~]# docker network inspect my_net
[
{
"Name": "my_net",
"Id": "3761dec61b52d042dd59a1b43304fd42c96cc58abb9d309fd02bf2747fd1118d",
"Created": "2019-03-24T14:18:42.164291603+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
network常用命令