版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangjun0210/article/details/86076971
1. Docker 网络模式
Docker有bridge、container、host、none 4种网络模式,我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,若没有指定,默认bridge,如下表
网络模式 | 指定 | 说明 |
---|---|---|
bridge | --net=bridge | 默认模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信 |
container | --net=container:容器名或ID | 创建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围 |
host | --net=host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
none | --net=none | 该模式关闭了容器的网络功能 |
2. 自定义网络模式
语法
$ docker network create --driver bridge new_bridge
3. bridge模式
3.1 bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。
3.2 网络模式详解
-
在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
-
Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。
$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024257a5b606 no
若出现
-bash: brctl: command not found
请执行如下命令安装
$ yum install bridge-utils
- 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
# 运行容器
$ docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
# 查看容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2239247b37d0 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp nginx_bridge
# 查看容器网络
$ docker inspect 2239247b37d0
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "1e6a2db2eb6d44ab97e384b7e84fe91a4215c95dd1b3afd7d485d3d04e144b0c",
"EndpointID": "eea4399f79b7dc40c57bb897eb17441322c8faedf0e3188bffc530f32bcb4bf4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "1e6a2db2eb6d44ab97e384b7e84fe91a4215c95dd1b3afd7d485d3d04e144b0c",
"Created": "2019-01-07T03:18:11.911442255-05: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": {
"2239247b37d0adacbcb360bd249bdb123b1c7baa5371b57b348046ccbe418ca0": {
"Name": "nginx_bridge",
"EndpointID": "eea4399f79b7dc40c57bb897eb17441322c8faedf0e3188bffc530f32bcb4bf4",
"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": {}
}
]