bridge网络相当于用软件的方法在宿主机内部虚拟一个交换机,它是一个二层网络设备。在一台宿主机内可以创建多个bridge,连接在同一bridge上的容器可以直接通信,连接在不同bridge上的容器不能直接通信。
不能直接通信不代表不可以通信,实际上连接在不同bridge上的容器,即使bridge分布在不同的节点上,也是可以通信的,但是必需通信三层路由,相当于是通过路由器将多个bridge连接起来。
Docker内置了一个名为bridge的bridge网络,容器默认使用的网络。建议不要使用这个内置网络,如果需要应该自己创建,内置的网络有很多限制,自已创建的网络才有足够的控制权。
用户自定义bridge网络与内置bridge网络的区别
- 用户自定义bridge网络的隔离性与操作性更好。这一段没看明白,为什么连接到默认bridge网络的容器必需通过-p选项对外暴露端口才能互相访问呢?连接在同一个bridge上,本来就是互通的。
- 用户自定义bridge网络提供DNS功能,默认bridge不提供。如果使用默认bridge,不同容器之间的互通只能直接使用IP地址或者是Link,而用户自定义网络可以直接使用容器名称。
- 运行中的容器可以随时离开、加入用户自定义bridge网络,默认bridge网络不行。必需先停止运行容器,再重新创建才能连接到其它网络。
- 用户自定义bridge网络可以灵活创建、配置。
- 默认bridge网络共享环境变量。连接在默认bridge网络上的容器可以通过--link标志共享环境变量,用户自定义bridge网络默认不可以,但是有多种解决方案。:
第一种是将需要共享的变量放在文件中,通过docker volume功能将它绑定到多个容器上。
第二种是使用docker compose,将需要共享的环境变量放置在compose的.env文件中。
第三种是使用docker swarm中有关配置的高级功能secrets、configs。
用户自定义bridge网络管理
创建网络:
$ docker network create my-net
在上述命令中可以设置了网网段、网关等,详细查看https://docs.docker.com/engine/reference/commandline/network_create/#specify-advanced-options或者运行:
docker network create --help
删除网络:
$ docker network rm my-net
连接容器到用户自定义bridge网络
命令如下:
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
my-net是用户自定义bridge网络的名称,8080:80表示将容器的80端口映射到宿主机的8080端口。
运行中的容器加入用户自定义网络:
$ docker network connect my-net my-nginx
容器离开用户自定义网络
如下:
$ docker network disconnect my-net my-nginx
配置默认bridge网络
Docker守护进程有自己的配置文件,名为daemon.json,其中包含默认bridge网络的配置信息,可以修改,如下:
{
"bip": "192.168.1.5/24",
"fixed-cidr": "192.168.1.5/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
修改完成以后需要重新启动docker daemon。