https://docs.docker.com/network/

1 分类

Docker中的网络驱动(network driver)是可插拔的,docker中默认已经存在了几种网络驱动以提供核心的网络功能,主要有以下几类:

  • bridge: docker 默认的network driver。如果不显示指定driver类型,docker默认会使用bridge模式的network。通常,当应用程序运行在独立的容器中,并且要相互通信,可以使用bridge模式。Bridge模式下容器与docker host的网络是相互隔离的。
  • host: Host模式下,独立的容器与docker host的网络隔离被移除, 容器直接使用docker hostnetwork.
  • overlay: Overlay network能够连通不同的docker daemon,能够使swarm service之间能够相互通信. Overlay network也能够使 swarm service与独立的容器连通, 能够使位于不同Docker daemon上的独立的容器连通。Overlay模式省去了容器之间操作系统层级的路由工作。
  • macvlan: Macvlan network能够给容器分配一个MAC地址,使的此容器就像一个此网络上的物理设备。Docker Daemon可以通过MAC地址给容器路由消息。对于一些遗留的应用需要直接连接到物理网络而不是通过docker host的网络栈转发时, macvlan 驱动是最好的选择.
  • none: 禁止网络功能For this container, disable all networking. 通常用在使用自定义网络驱动的情形。none 模式对 swarm services不适用。
  • Network plugins: 可以使用第三方的network 插件.

2 Bridge network

https://docs.docker.com/network/bridge/

Bridge network是一个链路层设备,在不用的网络单元之间转发消息。一个bridge可以是硬件设备也可以是运行在host OS内核的软件设备。

在Docker中,bridge network是一个软件bridge,能够允许连接到同一个bridge network的容器之间进行通信,同时能够隔离没有连接到此bridge network的容器。Docker的bridge驱动会自动在host machine安装路由规则,所以不同bridge network 上的容器之间不能直接相互通信。

  Bridge network应用在同一个docker host上的容器。在不同docker host上的容器之间通信时,要么在操作系统层加路由,要么使用overlay network。

  启动一个docker时,一个默认的bridge network会被自动创建,新启动的容器会连接到它,除非特别指定网络。也可以创建一个自定义的bridge network。

2.1 自定义bridge与默认bridge的区别

 

用户自定义的bridge 要优于默认的bridge,它们的区别如下:

1)自定义的bridge提供容器之间的自动DNS解析。

默认bridge上的容器只能通过IP地址访问彼此,除非使用过时的—link选项。自定义的bridge能够通过name或者alias访问彼此。

2)自定义的bridge提供更好的隔离性。

所有没有指定--network的容器都会连接到默认bridge,这可能会产生风险,因为不相关的容器也能够访问彼此。

自定义的bridge只有明确指定此network的容器才能够彼此通信。

3)容器能够随时加入和退出自定义的network

在一个容器的生命周期中,可以随时加入和退出一个自定义的network。 但是,如果想要从一个默认bridge上移除一个容器,就需要先停止这个容器,然后使用不同的network选项重新创建一个容器。

4)每一个自定义的network使用独立的配置选项

如果一个容器使用默认bridge,可以配置它,但是所有的容器使用相同的配置,例如MTU和iptables rules. 同时,配置默认的bridge是在docker本身之外并且需要重启docker。自定义的bridge通过docker network create 创建和配置。如果不同组内的应用有不同的网络需求,可以单独配置自定义的网络。

5)默认bridge上连接的容器共享环境变量

最开始,容器之间共享环境变量的唯一方式是使用--link. 但是这种变量共享的方法不适用于自定义的bridge。 现在,有更好的方法来实现环境变量共享。

  1. 多个容器可以使用docker volume挂载同一个文件或者目录来共享信息。
  2. 个容器可以使用docker-compose一起启动并且使用compose file来定义共享的变量。
  3. 可以使使用swarm service 代替独立的容器以使用共享秘钥和配置。

2.2 常用命令

1) 创建一个自定义bridge

$docker network create my-net

可以指定subnet,IP range,gateway以及其他选项。可以通过docker network create –help查看命令详情。

 

2) 删除一个自定义bridge

$docker network rm my-net

如果有容器正连接到此网络,需要先断开连接(docker network disconnect)。

3)连接/断开一个自定义bridge

创建一个容器时可以使用--network来指定一个自定义网络。

例如:创建Nginx容器到my-net网络,同时发布容器的80端口到docker host的8080端口,可以使用如下命令:

$ docker create --name my-nginx \

  --network my-net \

  --publish 8080:80 \

  nginx:latest

连接一个正在运行的容器到一个已经存在的自定义bridge可以使用docker network connect命令。例如: 连接已经运行的容器my-nginx到已经存在的网络my-net.

$ docker network connect my-net my-nginx

断开一个正在运行的容器,使用docker network connect 例如:

$ docker network disconnect my-net my-nginx
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐