docker网络模式之 user-defined bridge模式
上文提到默认的桥接网络模式下,容器之间连接的需要使用具体的ip地址,官方也不建议采用如此方式,建议采用用户自定义方式,构建容器间的桥接网络。一、自定义桥接网络和默认桥接网络区别 1、 用户自定义的桥接为容器间的隔离与互操作提供好更好的操作。 连接在同一个自定义的桥接网络下的容器,相互之间的端口全公开,无对外开发的端口,因此,运行容器应用程序之间更好地交互,不会对...
上文提到默认的桥接网络模式下,容器之间连接的需要使用具体的ip地址,官方也不建议采用如此方式,建议采用用户自定义方式,构建容器间的桥接网络。
一、自定义桥接网络和默认桥接网络区别
1、 用户自定义的桥接为容器间的隔离与互操作提供好更好的操作。
连接在同一个自定义的桥接网络下的容器,相互之间的端口全公开,无对外开发的端口,因此,运行容器应用程序之间更好地交互,不会对外开放任何通道。
例如一个服务包含前台web程序和后台数据库服务,外部用户直接前台web服务,前台web服务,调用后台数据服务。使用用户自定义的桥接网络,只需要开放web的端口即可,因为自定义桥接下,容器间的端口可以相互访问。
如果使用默认的桥接网络,容器需要使用 -p ( 或--publish)为各自开发端口,如此,docker宿主机器需要阻止其他操作访问数据库端口。
2、使用用户自定义的桥接网络,容器之间自动完成DNS解析
默认桥接网络模式下,容器之间访问仅仅通过IP地址,另外一种方法,使用--link 参数(该参数为遗留配置,后续可能去掉),使用用户自定义的桥接模式,容器间可通过容器名称或者别名相互访问。
还是前面的应用环境下,假如web程序和数据库分别运行在web容器和db容器内,自定义模式下,web容器可找到db容器形成连接,而不用关系 db容器运行在那个主机的docker下。
如果是默认的桥接模式,则需要在web容器和db容器 启动时,均需要使用 --link参数,使得他们相互连接,如此方式针对两个以上,甚多多个容器,增加了操作复杂,或者,另一种方式,在/etc/hosts内追加别名,但一旦出现问题,调试困难。
3、 容器可动态、快速地关联、剥离自定义桥接网络
使用自定义的桥接模式,容器在整个生命周内,可以自如地关联、剥离到网络,但是,使用默认的桥接模式,需要先停止容器,然后再以不同的网络参数启动容器。
4、每个用户自定义桥接网络都创建了一个网桥配置
如果使用默认的桥接网络,所有容器使用相同网络配置,如MTU、路由规则、iptables等,而且,参数生效过程,需要重启docker.
用户使用自定义的桥接网络,可通过 docker network create 创建,可为不同组的容器,创建不同配置的网络。可独立配置每个桥接网络。
5、默认桥接网络上的两个容器间共享环境变量
使用--link标记 是使得两个容器共享环境变量的唯一途径,但是 这不适用于自定义的桥接网络,但是可通过如下方式解决:
(1) 多个容器可通过挂载同一个文件(或者目录)使用共享信息 docker volume
(2) 多个容器启动时 使用参数 docker-compose使用相同 构件文件,在构件文件内定义共享变量
(3)使用集群服务替代独立容器,共享 文件和相同配置。
使用自定义的桥接模式,容器之间交互端口全开发,如果不同网络的容器间交互使用的端口,必须使用 -p 或者 --publish参数 开放。
二、操作 自定义 桥接网络
2.1 创建自定义桥接网络
docker network create my-net
可通过 指令 docker network create --help 查看参数配置
[root@localhost hadoop]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which copying the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment
[root@localhost hadoop]#
使用 --ipv6 标记,启动ipv6 ,自定义的网络中,可选择是否关闭,或者启动ipv6, 默认桥接模式下,无法关闭ipv6 网络功能。
删除网络 使用 docker network rm
docker network rm my-net
同样可通过指令 docker network --help 查看具体操作介绍
[root@localhost hadoop]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@localhost hadoop]#
实际docker 针对自动以桥接网络的创建、 关连、剥离,实际上是 docker通过工具 直接操作 操作系统的底层网络设施(例如添加、删除网桥设备、配置iptables的路由规则等),
2.2 创建容器,指定网络
docker create --name my-nginx --network my-net --rm --publish 8080:80 nginx:latest
创建一个名为 my-nginx的容器,指定网络为刚创建的网络。并将内部端口80 映射到主机8080
2.3 关联容器到网络
关联一个正在运行的容器到指定的自定义网络,使用语句 docker network connect
docekr network connect my-net my-nginx
将一个容器的容器 my-nginx连接到一个正在运行的网络 my-net上
2.4 容器脱离网络
使用docker network disconnect
docker network disconnect my-net my-nginx
将容器my-nginx从网络my-net上断开连接。
删除网络时,如果存在容器连接到该网络,需要先断开网络上连接的容器,
2.5 容器数据转发到外部
默认情况下,连接到默认网络上的容器,无法转发数据到网络上,需要手动进行如下两次配置。而且这两次配置并不是docker的指令操作,但是他们却又影响docker的内核。
启动所有ip转发标识
sysctl net.ipv4.conf.all.forwarding=1
修改转发策略 从 DROP置为 ACCEPT
sudo iptables -P FORWARD ACCEPT
目前,如果正确安装了docker ,这两个操作基本上都配置了。可通过iptables -L 查看FORWARD的策略
[root@localhost hadoop]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
INPUT_direct all -- anywhere anywhere
INPUT_ZONES_SOURCE all -- anywhere anywhere
INPUT_ZONES all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DOCKER-USER all -- anywhere anywhere
DOCKER-ISOLATION-STAGE-1 all -- anywhere anywhere
Chain FORWARD 的策略已经置为 ACCEPT了
2.6 配置默认桥接网络
配置默认的桥接网络,通过修改daemon.json文件,修改完成后,需要 systemctl daemon-reload 重建加载参数,然后,重新启动才能生效
2.6.1 启动ipv6
{
"ipv6": true
}
新增 启用ipv6功能。
2.6.2 配置daemon
{
"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"]
}
配置子设备池, dns, 默认网关,ipv6的网关等。只有启用了ipv6功能时,才可以使用ipv6的配置。
配置完成后,重新加载参数,重启docker 参数生效
更多推荐
所有评论(0)