docker学习——docker的bridge网络
目录bridge网络使用自定义网络 使用IPv6启用从Docker容器到外部世界的转发使用默认桥接网络默认桥接网络的更多细节 bridge网络docker的桥接网络使用虚拟网桥,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信,当我们启动docke时,会自动创建一个默认bridge网络,除非我们进...
目录
bridge网络
docker的桥接网络使用虚拟网桥,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信,当我们启动docke时,会自动创建一个默认bridge网络,除非我们进行另外的配置,新创建的容器都会自动连接到这个网络,我们也可以自定义自己的bridge网络,docker文档建议使用自定义bridge网络,默认的bridge网络具有一定的缺陷
连接到同一bridge网络的容器可以相互访问彼此任意一个端口,如果不发布端口,外界将无法访问这些容器,在创建容器时,通过-p或是--publish指令发布端口
自定义bridge网络与默认bridge网络对比:
- 默认桥接网络中的容器只能通过IP地址访问其他容器(除非使用遗留的-link指令连接两个容器),而自定义桥接网络提供DNS解析,可以通过容器的名字或是别名访问其他容器
- 容器可以自由的进入或是退出自定义桥接网络,如果想要退出默认桥接网络,需要先停止容器的运行,然后重新创建该容器,并指定需要连接的其他网络
- 如果更改了默认桥接网络的网络配置,需要重新启动docker,并且由于默认桥接网络只有一个,因此所有容器的网络配置都是一样的,而用户自定义网络可以在创建时指定网络配置(例如默认网关、MTU等),不需要重启docker,灵活性更高
- 在默认桥接网络中,可以通过--link参数连接两个容器来共享环境变量,用户自定义网络中无法使用这种方式,但是docker提供了更好的方式: 1、多个容器可以使用docker volume(这是docker存储数据的一种方式,以后会介绍)挂载到同一个文件,在文件中指明环境变量,从而实现所容器的环境变量共享 2、多个容器可以使用同一个docker-compose(与docker service有关)文件启动 ,可以在该文件中定义共享环境变量 3、可以使用swarm services,并且通过 secrets 和 configs (这两个还没看)实现环境变量共享
使用自定义网络
1、创建一个自定义网络:
$ docker network create my-net
可以指定子网、IP地址范围、网关等网络配置,更多请查看: docker network create ,移除自定义网络:
$ docker network rm my-net
移除自定义网络前先移除该网络上的所有容器
2、连接容器到自定义网络:
$ docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
上述命令依据nginx镜像实例化一个容器,通过--network加入到用户自定义网络my-net中,同时发布了端口80到本地主机的8080端口,可以使用docker network connect指令将运行的容器加入到对应的网络:
$ docker network connect my-net my-nginx
3、离开用户自定义网络:
使用docker network disconnect命令
$ docker network disconnect my-net my-nginx
使用IPv6
如果想要在容器中使用IPv6,首先要更改docker系统进程的配置,使其支持IPv6,请看这里: enable the option
在创建自定义网络时,通过--ipv6参数指定开启IPv6
启用从Docker容器到外部世界的转发
默认情况下,连接到默认桥接网络的容器的数据报不会被转发到外部。要启用转发,需要更改两个设置。这些不是Docker命令,它们会影响Docker主机的内核。
1、设置linux内核允许IP转发:
$ sysctl net.ipv4.conf.all.forwarding=1
2、将iptables FORWARD 的值更从DROP更改为ACCEPT:
$ sudo iptables -P FORWARD ACCEPT
这几个配置不会持久化,每次重启都需要重新配置,所以需要将它们添加到start-up script
文档中并未介绍用户自定义网络能否转发数据报到外部,我觉得默认情况下也是不能的,也需要做出上述配置
使用默认桥接网络
要点:
1、将容器连接到默认桥接网络:运行docker run指令时,未指定--network参数,则连接到默认桥接网络
2、配置默认桥接网络的方式:更改/etc/docker/daemon.json的内容即可,文档给出的例子如下:
{
"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"]
}
3、如果我们开启了docker系统进程的IPv6支持,默认桥接网络也会默认开启IPv6支持,而且不能关闭,自定义网络可以通过是否指定--ipv6来决定是否开启IPv6
默认桥接网络的更多细节
容器通过本地主机进行上网,本地主机上会建立名为docker0的虚拟网桥,容器会创建名为veth的虚拟网卡,网卡一端连接到docker0网桥,另一端连接容器,容器就可以通过网桥进行上网,容器可以通过分配的IP地址(通过docker inspect 指令可以查看)或是名字(需要使用link指令)进行通信,关于桥接网络的一点解释(摘自这里):
更多推荐
所有评论(0)