概述
- birdge(桥接网络)
默认网络驱动。如果你不具体指定一个网络驱动,当前创建的网络就是桥接网络。
当应用程序运行在需要通信的独立容器中时,通常会使用桥接网络。
使用桥接网络
在网络方面,桥接网络是一种链路层设备,它将网络段之间的流量转发。桥接网络可以是硬件设备也可以是运行在宿主机内核中的软件。
在Docker方面,桥接网络使用软件桥接,它允许处在同一个桥接网络中的container通讯,以此与没有连接到该桥接网络的其他container隔离。Docker桥接驱动自动在宿主机上安装规则,所以在不同桥接网络中的container不能直接互通。
桥接网络适用于运行在同一个Docker daemon主机的container。如果想要实现运行在不同Docker daemon上的container通信,需要维护系统级别的路由,或者可以使用覆盖网络(Overlay Network)。
当Docker启动时,一个默认的桥接网络(名称为bridge)被自动创建,并且新建的container会连接到该网络上,直到明确指定其他网络。
![](https://img.haomeiwen.com/i7391491/0dcf91ad265abbfd.png)
你可以自定义桥接网络。桥接网络优于默认的桥接网络
若使用桥接网络,推荐使用自定义桥接网络
自定义桥接网络与默认桥接网络的区别
自定义桥接网络在容器化应用之间提供更好的隔离性和交互性。
连接到同一个自定义桥接网络的container会互相暴露所有的接口,但不会向外界暴露任何接口。这就使容器化的应用通讯起来更加方便,同时也不必担心不小心向外界暴露了端口。
设想一个应用包含前端web程序和后端数据库程序。外界需要访问前端系统(可能通过80端口访问),前端系统再根据IP和端口访问数据库,而数据的IP和端口不需要对外界公开,只需要暴露给前端系统即可。
使用自定义桥接网络,只需要前端系统开放端口,而数据库系统不需要开放任何端口,因为前端系统可以通过桥接网络访问到数据库。
如果同样的一套系统使用默认桥接网络,则需要使用-p
或--publish
标签来开放前端系统和数据库系统的端口。这意味着Docker主机需要通过其他方式来锁定外界对数据库系统端口的访问。
自定义桥接网络在container之间提供DNS自动解析
使用默认桥接网络的容器只能通过IP地址来互相访问,除非使用--link
,但它已经过时了。
在自定义桥接网络中,容器可以通过名称或别名互通。
容器可以即时地从自定义桥接网络连接或断开
在容器的生命周期中,你可以即时地连接或断开自定义桥接网络。如果要断开默认的桥接网络,你需要停止容器,然后指定一个网络重新创建它。
每个自定义桥接网络都是可配置的
如果使用默认桥接网络,虽然它是可以更改配置的,但所有容器都使用相同一份配置,类似于MTU和iptables
规则。除此之外,配置默认桥接网络是在Docker外完成的,配置后需要重启Docker。
自定义桥接网络使用docker network create
完成创建和配置。
连接在默认桥接网络的容器共享环境变量
原始情况下,两个容器之间共享环境变量的唯一方式是使用--link
标签。
在自定义桥接网络下,这种变量共享的方式不可用。然而我们可以使用一些更好的方式:
- 多个容器可以使用Docker volume挂载一个承载共享变量的文件或目录。
- 多个容器可以使用
docker-compose
启动,该文件可以定义需要共享的变量。 - 可以使用swarm service来代替单独的容器,并且这在共享secrets和configs也有优势。
总结
连接到同一个自定义网络下的容器互相暴露所有端口。如果某个端口需要被其他网络上的容器或非Docker主机访问,那该端口必须使用-p
或-publish
发布。
管理用户自定义桥接网络
创建自定义桥接网络
使用docker network create -d bridge my-net
创建一个自定义桥接网络。
可以指定子网、IP地址范围、网关等其他选项。
$ docker network -d "bridge" my-net
-
docker network create
说明
![](https://img.haomeiwen.com/i7391491/034d6383821f1e00.png)
移除自定义桥接网络
使用docker network rm my-net
移除自定义网络。在删除之前,需要断开与其相连的容器。
$ docker network rm my-net
创建一个容器,使其连接到自定义桥接网络
- 创建新容器时连接到自定义网络
当创建一个容器时,可以使用一个或多个--netwrok
标签指定该容器使用的网络。
下面的例子创建了一个Nginx容器,让它连接到刚才自定义的桥接网络my-net
。同时,该容器还将80端口映射到了Docker主机的8080端口,这样其他客户端可以用过该端口访问它。其他连接到my-net
的容器可以访问该Nginx容器的所有端口。
docker container create --name my-nginx \
--network my-net \
--publish(-p) 8080:80 \
nginx:latest
- 已有容器连接到自定义网络
对于正在运行的容器连接到自定义网络来说,使用docker network connect
命令。
下面的命令使一个正在运行的my-nginx容器连接到自定义的my-net网络。
$ docker network connect my-net my-nginx
使容器断开自定义网络
使一个正在运行的容器断开自定义桥接网络,使用docker network disconnect
命令。
下面的命令使my-nginx容器从my-net网络断开。
$ docker network disconnect my-net my-nginx
使用IPv6
在容器或swarm服务内使用IPv6之前,需要开启Docker daemon的IPv6支持选项。
注意:IPv6网络仅能够在运行在Linux主机上的Docker daemon开启。
1、 编辑/etc/docker/daemon.json,将键为ipv6
的值设置为true
。
{
"ipv6": true
}
2、重新加载Docker配置文件
$ systemctl reload docker
3、创建网络时使用--ipv6
标签,并使用--ip6
标签为容器分配IP6地址。
Demo见文档Networking with standalone containers
参考文档
Use bridge networks
Enable IPv6 support
Networking with standalone containers
网友评论