Docker运维教程(8)Docker网络与跨主机通信设置

在进行网络配置之前,使用docker network命令可以查看一下当前容器的网络,这些都是宿主机安装Docker后自动创建的三个网络(还有一个共享容器的网络没有显示是因为它和host模式一样,共享的是谁DRIVER就显示为谁),如图:

docker_net1.png

一、Docker容器网络模式介绍

1、桥接模式(Bridge):默认网络模式,使用最广,每一个容器都会跟宿主机的桥接网卡docker0相连,可以使用brctl show 命令观察容器创建前后的变化,能够看到容器创建后会将自身的网卡绑定在docker0桥接网卡中,容器默认分配的地址是172.17.0.x段,因为这属于桥接网卡的地址池范围

docker network inspect

2、仅主机模式(Host):该模式下容器跟宿主机共享主机名、网络和端口信息,容器不需要做端口映射,但和宿主机存在端口抢占的问题 

3、容器模式(Container): 该模式下可以让当前容器与指定的其它容器共享网络

4、无网络模式(None):有独立的network namespace,但是不进行任何网络配置,容器中只有lo网卡。

5、自定义(user-defined):自定义网桥,有bridge、overlay、macvlan三种网络驱动,后面两种用于创建跨主机网络。

 

二、Docker各种网络模式的简单配置

1、使用默认的bridge桥接模式启动容器,在容器中查看网络会多出一张桥接网卡,用于宿主机和Docker的桥接

docker run --net=bridge -d docker.io/nginx /bin/bash

2、使用host模式启动容器的话,进容器查看网卡会发现跟宿主机网络送一模一样的,如果是一个业务多进程都在一个容器里面的话建议用这种方式,宿主机就看到80端口的监听 

docker run --net=host -d docker.io/nginx /bin/bash

3、使用共享网络模式启动容器,这样多个容器会使用同一个网络地址。如下示例中test_2会使用test_1的网络,它们IP会是一样的 

docker run --name test_1 -it --rm nginx
docker run --name test_2 --network container:test_1 -it --rm nginx

4、使用link方式启动容器,该选项会在要启动的容器中添加一条DNS记录指向到link的主机上,这样可以方便的在新容器中访问已有容器的服务,只用指定端口即可 

docker run -d --name test_2 --link test_1  centos /bin/bash

5、使用None模式来启动容器,不进行任何网络设置 

docker run --net=none -d docker.io/nginx /bin/bash

三、创建Docker自定义网络实现跨主机通信 

1、首先创建一块新的网桥设备

docker network create --driver bridge test_net  #创建一个名为test_net的网桥
brctl show  #可以看到增加了一块网桥设备,名称变为test_net的短ID
docker network inspect test_net #找到test_net的短ID,和上步对比是一致的

2、上一步操作后查看IP网段是172.18.0.0/16段,这是Docker自动分配的IP网段,也可以自定义需要的网段 

docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 test_net2

 

 

3、可以指定容器运行在任意自定义网络中,如果创建网络时有指定subnet,还可以指定容器的IP 

docker run -itd --network=test_net centos
docker run -itd --network=test_net2 --ip 172.22.16.8 centos  #该网络必须有事先配置subnet才行

4、当多个容器工作在一个网络中时,他们互相之间是可以通信的。而自定义的网桥与默认网桥是不能直接通信的,因为本身就要隔离。那如何才能实现不同网桥之间能互通呢?只需要通过docker network connect将容器加入到指定网络中即可,如下: 

docker network connect test_net bd5 #bd5为A网桥中容器的短ID

5、操作完成后,2个网桥中的主机应该就可以互ping了 

四、使用macvlan桥接实现跨主机通信

1、创建macvlan网络,该网络可以和宿主机在一个网段,实现多宿主机之间容器互通

docker network create --driver macvlan --subnet 10.0.0.0/24 -gateway 10.0.0.254 -o parent=eth0 macvlan_1  #每个宿主都可以这样创建
#subnet指定了自定义的网段
#parent指定了一块需要创建macvlan网络的网卡

2、指定网络启动容器,IP需要手动配置,容器启动后可以ping测试是否互通 

docker run -it --network macvlan_1 --ip 10.0.0.11 centos:latest  #宿主1启动
docker run -it --network macvlan_1 --ip 10.0.0.12 centos:latest  #宿主2启动

五、使用overlay类型网络实现跨主机通信 

1、使用容器运行consul

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

2、配置Docker监听端口以及consul地址 

vi /etc/docker/daemon.json

{
 "hosts":["tcp://0.0.0.0:2376","unic:///var/run/docker.sock"],
  "cluster-store": "consul://10.0.0.13:8500"  #consul地址
  "cluster-advertise": "10.0.0.11:2376"  #每台docker宿主地址,docker宿主都需配置端口监听
}

3、重启docker,如果启动失败的话需要修改docker的启动脚本 

vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd  --containerd=/run/containerd/contrainerd.sock  #去掉了-H //的选项

systemctl restart docker

4、重启完成后进入consul界面可以看到docker的信息 

consul1.png

5、创建overlay网络,这个网络和宿主机不再是同一个网段,而且不能冲突。该网络是全局网络,使用docker network命令查看是global而不是local 

docker network create -d overlay --subnet 172.16.2.0/24 --gateway 172.16.2.254 overlay_1  #在任一宿主机创建即可,其他宿主机通过2376端口也会创建这个网络

6、创建容器测试,这些容器都会自动分配一个172.16.2.0网段的IP,也不再需要使用link来让容器互通,它们内部有DNS自动可以实现解析 

docker run -it --network overlay1 --name test01 centos:latest
docker run -it --network overlay1 --name test02 centos:latest  #容器名不能相同了

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值