上文提到默认的桥接网络模式下,容器之间连接的需要使用具体的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 参数生效

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐