docker的网络分为单主机网络和多主机网络,本篇内容只讨论单主机网络。docker的单主机网络分三种类型,none,host和bridge网络。docker会在docker daemon装好之后默认虚拟出来一个网桥docker0,用户也可以自定自己的bridge类型的网络
docker的网络类型:
chenyangdeMacBook-Pro:~ chenyang$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a34d0b07fcfb bridge bridge local
1fe811f1ceed host host local
dc0944247854 none null local
下面我门将详细介绍这三种类型的网络。
none网络
none网络的意思就是该容器除了lo,没有其他网卡,使用方式如下:
chenyangdeMacBook-Pro:~ chenyang$ docker run -it --network=none busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
697743189b6d: Pull complete
Digest: sha256:506f440802e1dc578a9953dd0957a48caeb6a4008df9af04a75d9e184aa01006
Status: Downloaded newer image for busybox:latest
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ #
这种类型的容器网络唯一的好处就是安全,与外界网络隔离,如果需要一个安全的网络环境来运行一些应用程序,none网络是不错的选择。
网络
如果host对容器使用网络驱动程序,则该容器的网络堆栈不会与Docker主机隔离。例如,如果您运行绑定到端口80 host的容器并使用网络,则容器的应用程序将在主机IP地址的端口80上可用。
主机网络驱动程序仅适用于Linux主机,并且不支持Docker for Mac,Docker for Windows或Docker EE for Windows Server。
host网络的使用方式如下:
chenyangdeMacBook-Pro:~ chenyang$ docker run -it --network=host busybox
host网络的使用场景:
- 容器需要对网络传输有更好的要求,推荐使用host网络。
- 跨host的网络解决方案,容器直接配置host 网络
host网络的缺点:
- 容器和host使用相同的端口会发生冲突,host上已经使用的端口容器内就不能再使用了
bridge网络
创建容器的时候如果不指定具体的网络类型,容器会挂在默认的网桥docker0上面。
比如我们启动一个http的容器:
chenyangdeMacBook-Pro:~ chenyang$ docker run -d httpd
33142a89d74f8628f6116939c22722593dd28b2adc1b872d95bb01c493fb5015
chenyangdeMacBook-Pro:~ chenyang$ docker exec -it 3314 bash
chenyangdeMacBook-Pro:~ chenyang$ docker inspect 3314
容器的网络情况如下,IP:172.17.0.1/16,gateway:172.17.0.2:
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "a34d0b07fcfb65e68e0142a96dacdb3a2b94b2fdba53f0e91b94ae896ec5e4a0",
"EndpointID": "ac5b48dfd7702deedceece4118d85f0580fe47ca07841d130e41e71222c44b73",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
再查看一下docker0的网络配置:
chenyangdeMacBook-Pro:~ chenyang$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "a34d0b07fcfb65e68e0142a96dacdb3a2b94b2fdba53f0e91b94ae896ec5e4a0",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
可以看到,docker0的网络配置就是默认创建出来容器网络的网关。
user-defined网络
none,host,bridge是docker默认创建出来的网络,用户也可以创建自己的网络,docker提供三种类型的网络驱动:bridge,overlay,macvlan,后面两种用于跨主机的网络,这里重点关注bridge网络。
创建bridge类型的自动移网络如下:
chenyangdeMacBook-Pro:~ chenyang$ docker network create --driver bridge my_net
e0655774c21cf732d8fa92274a57273ba4f30e505684840e555211b9cb61a0f5
我们可以进一步看一下my_net网络的配置:
chenyangdeMacBook-Pro:~ chenyang$ docker network inspect e06
[
{
"Name": "my_net",
"Id": "e0655774c21cf732d8fa92274a57273ba4f30e505684840e555211b9cb61a0f5",
"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": {}
}
]
也可以自定义网段和网关:
chenyangdeMacBook-Pro:~ chenyang$ docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net1
678e3765100de49bb6459c0bbb636727465c48e3c45f66d5fa37f8210581541c
chenyangdeMacBook-Pro:~ chenyang$ docker network inspect 678e
[
{
"Name": "my_net1",
"Id": "678e3765100de49bb6459c0bbb636727465c48e3c45f66d5fa37f8210581541c",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.16.0/24",
"Gateway": "172.22.16.1"
}
]
},
"Internal": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
使用网络my_net1,只要在创建容器的时候指定–network为my_net1就ok。
此外,如果自定网络指定了网段和网关,则使用该网络的容器可以指定IP。
两个bridge类型的网络上的容器是不能ping通的,但是可以使用如下命令,将容器挂在另外一个网络上,这样该容器就可以和另外一个网络上的容器ping通了:
docker network connect my_net container_id
如上设置,就可以让容器container_id能够和my_net网络上的容器ping通。