目录

bridge网络

使用自定义网络   

使用IPv6

启用从Docker容器到外部世界的转发

使用默认桥接网络

默认桥接网络的更多细节


 

 

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指令)进行通信,关于桥接网络的一点解释(摘自这里):

 

 

                                                                                                  

Logo

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

更多推荐