docker深刻学习三

docker学习三:network

docker支持容器之间的网络通讯,docker的网络通讯方式有如下五种:linux

bridge docker 默认的网络驱动,若是不指定网络驱动,docker就会建立一个bridge bridge适用于同一docker主机上的容器通讯
overlay overlay支持不一样daemon下的容器之间和集群服务之间的相互通讯 overlay适用于不一样主机的容器之间的通讯,或者集群服务中的多个应用程序协调工做
host host消除了独立容器与主机之间的网络隔离,container直接使用主机的网络 host适用于须要隔离容器除网络之外的其余部分的状况
macvlan macvlan容许用户为容器分配MAC地址,daemon能够将流量经过容器MAC地址之间路由到容器而不须要通过docker host的网络栈 macvlan适用于从虚拟机配置移植或者须要让容器表现为一台包含mac地址的物理机的状况
none none禁止容器的全部网络,其通常和用户自定义网络驱动一块儿使用,集群服务不支持none

bridge

docker bridge与通常的网桥功能相似,可以让同一网桥下的容器相互通讯。
docker提供默认bridge,若不指定容器的驱动,则自动将容器关联到默认bridge中。 官方推荐用户自定义bridge而不是使用默认bridgenginx

自定义bridge和默认bridge的区别

自定义bridge 默认bridge
隔离性和链接性 位于同一bridge的容器之间暴露自身全部的端口,容器端口默认对外界关闭,须要使用-p--publish开启 须要手动打开端口,同时须要经过docker外的方式控制外界对端口的访问
容器以前的DNS服务 支持自动DNS解析,能够经过容器别名访问容器 容器之间只能经过ip地址访问或者为通讯两端的容器分别使用--link选项
热插拔 支持在运行过程当中断开或链接自定义bridge 容器与默认网桥断开时,须要关闭容器并使用新配置重建容器
全局配置 每一个自定义bridge可使用docker命令单独配置 对默认bridge的配置会影响到全部使用默认bridge的容器,且配置默认bridge须要使用docker外的命令
共享环境变量 自定义bridge没法直接共享环境变量,但能够经过
挂载卷或者目录
使用compos声明共享变量
使用集群服务代替独立容器,经过配置共享变量
使用--link flag共享环境变量

配置自定义bridge

建立和删除bridge的命令以下:docker

docker network create my-net
docker network rm my-net

建立bridge时能够配置bridge的子网范围、网关和其余选项,具体的配置参数可使用docker network --help或者查看官方文档bash

链接bridge

能够在建立容器的同时链接bridge,如:网络

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

  $ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
a716400c6714        nginx:latest        "nginx -g 'daemon of…"   7 minutes ago       Created                                       my-nginx

上面建立了一个容器my-nginx,同时将容器链接到my-net 网桥并将8080端口暴露出来供外界访问。
链接已存在的容器和bridge时可使用如下命令分布式

$ docker network connect my-net my-nginx

取消链接可使用如下命令oop

$ docker network disconnect my-net my-nginx

overlay

overlay在多个docker主机上面建立一个分布式网络,该网络位于各个主机的具体网络之上,容许容器链接该网络进行通讯。
当建立一个集群或者将docker主机加入到集群时,docker主机会建立两个网络:学习

  1. ingress:是一个overlay网络,用于处理和集群控制有关的命令和数据流量,若是建立集群时没有指定自定义overlay网络,集群默认链接到ingress
  2. docker_gwbridge:一个 bridge网络,用于链接集群中各个daemon守护进程

建立overlay

建立overlay的命令与bridge基本一致,但建立overlay的命令必须在位于集群中的主机执行,使用命令docker swarm initdocker swarm join将主机加入到集群中code

$ docker network create -d overlay my-overlay

host

使用host网络至关于容器和主机共享一个网络,docker不会为容器分配ip地址,访问容器端口的方式改成直接访问主机对应的端口,-p-P等端口相关的指令会被忽略。
host网络只在linux下工做,不提供对mac和Windows的支持接口

macvlan

某些应用程序,尤为是后台应用程序或监视网络流量的应用程序,但愿直接链接到物理网络。在这种状况下,您可使用macvlan网络驱动程序为每一个容器的虚拟网络接口分配MAC地址,使其看起来像是直接链接到物理网络的物理网络接口。在这种状况下,您须要在Docker主机上指定一个物理接口,用于macvlan,以及macvlan的子网和网关。您甚至可使用不一样的物理网络接口隔离您的macvlan网络。但须要记住如下事项:

  • 因为IP地址耗尽或“VLAN传播”,很容易无心中损坏您的网络,在这种状况下,网络中存在大量不合适的MAC地址。
  • 您的网络设备须要可以处理“混杂模式”,其中一个物理接口能够分配多个MAC地址。
  • 若是您的应用程序可使用bridge(在单个Docker主机上)或overlay(跨多个Docker主机进行通讯),那么从长远来看,这些解决方案可能会更好。

none:关闭容器的网络

使用--network none能够关闭容器内的网络栈,在容器内只剩下回环地址。

$ docker run --rm -dit \
  --network none \
  --name no-net-alpine \
  alpine:latest \
  ash

查看容器内部网络,里面只含有回环地址

$ docker exec no-net-alpine ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
相关文章
相关标签/搜索