Docker的网络(三)

著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。

从Linux的network namespace开始,经过详细讲解Docker的内置网络host和bridge是怎么使用的,来给你们展现不一样容器之间网络的隔离和互访是如何实现的。固然好包括一个高级话题:Docker的多机通讯和Overlay网络介绍html

网络基础回顾

Docker bridge详解

docker bridge network是怎么映射到主机IP地址上网的呢?经过本机 ip a命令咱们能够看到以下内容: 其中docker0 的networkspace是本机,veth26d281@if13有本身的networkspace,同时也是docker0网卡的一个接口。linux

经过 docker exec test1 ip a 进入查看dokcer容器的ip network,其中 eth0@if14veth26d281@if13是一对,

经过 brctl show 能够看到它们之间的关联关系,由于 veth26d281是docker0的一个接口,又由于上面的 eth0@if14veth26d281@if13是一对,,因此能够经过这个接口转换成本机宿主的ip去访问Internt

容器之间的link

咱们在使用Docker的时候,常常可能须要链接到其余的容器,好比:web服务须要链接数据库。按照往常的作法,须要先启动数据库的容器,映射出端口来,而后配置好客户端的容器,再去访问。其实针对这种场景,Docker提供了--link 参数来知足。nginx

docker run -d --name test2 --link test1 busybox
复制代码

更多link内容参考git

容器的端口映射

在启动容器时,若是不配置宿主机器与虚拟机的端口映射,外部程序是没法访问虚拟机的,由于没有端口。 端口映射的指令是github

docker run -p ip:hostPort:containerPort redis
复制代码

使用-p参数会分配宿主机的端口映射到虚拟机。
IP表示主机的IP地址。
hostPort表示宿主机的端口。
containerPort表示虚拟机的端口 。web

容器的4种网络模式

咱们在使用docker run建立Docker容器时,能够用--net选项指定容器的网络模式,Docker有如下4种网络模式:redis

  • host模式,使用--net=host指定。
  • container模式,使用--net=container:NAME_or_ID指定。
  • none模式,使用--net=none指定。
  • bridge模式,使用--net=bridge指定,默认设置。

下面分别介绍一下Docker的各个网络模式:docker

  1. host模式
    众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其余的Network Namespace隔离。一个Docker容器通常会分配一个独立的Network Namespace。但若是启动容器的时候使用host模式,那么这个容器将不会得到一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出本身的网卡,配置本身的IP等,而是使用宿主机的IP和端口。数据库

    例如,咱们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当咱们在容器中执行任何相似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80便可,不用任何NAT转换,就如直接跑在宿主机中同样。可是,容器的其余方面,如文件系统、进程列表等仍是和宿主机隔离的。flask

  2. container模式
    在理解了host模式后,这个模式也就好理解了。这个模式指定新建立的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的IP,而是和一个指定的容器共享IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过lo网卡设备通讯。

  3. none模式
    这个模式和前两个不一样。在这种模式下,Docker容器拥有本身的Network Namespace,可是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。须要咱们本身为Docker容器添加网卡、配置IP等。

  4. bridge模式
    bridge模式是Docker默认的网络设置,此模式会为每个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器链接到一个虚拟网桥上。下面着重介绍一下此模式。

Overlay和Underlay的通俗解释

  • 跨主机网络意味着将不一样主机上的容器用同一个虚拟网络链接起来。这个虚拟网络的拓扑结构和实现技术就是网络模型。
  • Docker overlay 如名称所示,是 overlay 网络,创建主机间 VxLAN 隧道,原始数据包在发送端被封装成 - - VxLAN 数据包,到达目的后在接收端解包。
  • Macvlan 网络在二层上经过 VLAN 链接容器,在三层上依赖外部网关链接不一样 macvlan。数据包直接发送,不须要封装,属于 underlay 网络。
  • Flannel 咱们讨论了两种 backend:vxlan 和 host-gw。vxlan 与 Docker overlay 相似,属于 overlay 网络。host-gw 将主机做为网关,依赖三层 IP 转发,不须要像 vxlan 那样对包进行封装,属于 underlay 网络。
  • Weave 是 VxLAN 实现,属于 overlay 网络。

更多详细内容请点此处查看

Docker Overlay网络和etcd实现多机容器通讯

关于该示例图的详细应用步骤请点此处

扩张阅读

使用VXLAN实现docker的多机通讯,一种网络虚似化技术
overlay-networks
Docker网络——单host网络

本文涉及命令

当前机器上docker有哪些网络
docker network ls
#查看指定的网络详情
docker network inspect [networkId]
docker run -d --name test2 --link test1 busybox
docker network create -d bridge my-bridge
docker run -d --name test3 --network my-bridge busybox
docker network connect my-bridge test2
docker run --name web -d nginx
docker network inspect bridge
docker run --name nginx  -d -p 80:80 nginx
docker run -p ip:hostPort:containerPort redis
##-e 设置环境变量
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis [image]
#实时查看docker容器日志
$ sudo docker logs -f -t --tail #行数 容器名
docker network create -d overlay demo
#实时查看docker容器名为s12的最后10行日志
$ sudo docker logs -f -t --tail 10 s12

docker network ls
复制代码

相关文章
相关标签/搜索