【容器应用系列教程】Docker网络管理

上期教程:Docker的安装和基本操作

一、Docker的几个网络工作模式

[root@lvm ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5c8d7aaa6302   bridge    bridge    local
6d9af871e429   host      host      local
c5ff52b498d6   none      null      local
  • bridge模式
    • 类似NAT的工作模式
    • -p参数
    • docker run -itd -p 80:80 nginx:latest
  • host模式
    • 容器、物理机共享同一个网络命名空间
    • 服务运行在容器中,端口监听在物理机
    • 端口不可以和物理机端口冲突
    • docker run -itd --net=host centos:7
  • container模式
    • 新建的容器会与一个已有的容器共享同一个网络命名空间
    • 前提
      • 事先存在一个bridge模式的容器
    • 优势
      • 减少网络消耗,增加网络通信效率
    • 劣势
      • 原有的容器故障,所有容器均失效
    • docker run -itd --name=centos01 centos:7
    • docker run -itd --net=container:centos01 --name=centos02 centos:7
  • none模式
    • 容器不会连接任何网络
    • docker run -itd --net=none --name=centos03 centos:7

二、网络管理操作

1.创建网络

[root@lvm ~]# docker network create --subnet=192.168.1.0/24 --gateway=192.168.1.1 mynet01
83cc2918bd37e7ed565e35b687b609507e2a6548fdb55e93bb966518c3de8cd0
  • network create创建网络
  • --subent=网段
  • --gateway=网关

2.查看网络

[root@lvm ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
5c8d7aaa6302   bridge    bridge    local
6d9af871e429   host      host      local
83cc2918bd37   mynet01   bridge    local
c5ff52b498d6   none      null      local

3.指定容器网络

[root@lvm ~]# docker run -itd --net=mynet01 --name centos centos:7 /bin/bash

指定静态地址

[root@lvm ~]# docker run -itd --net=mynet01 --ip=192.168.1.100 --name centos03 centos:7 /bin/bash

4.为容器接入网络

在原有网络的基础上,在容器内部再创建一个虚拟网卡,接入新的网络

[root@lvm ~]# docker run -itd --name centos01 centos:7
[root@lvm ~]# docker network connect mynet01 centos01

可以看到有2块虚拟网卡

[root@lvm ~]# docker exec -it centos01 bash
[root@167c809218c9 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 11333  bytes 29620333 (28.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8657  bytes 471037 (459.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.3  netmask 255.255.255.0  broadcast 192.168.1.255

5.删除网络

在删除网络之前,要先删除连接自定义网络的容器

[root@lvm ~]# docker network rm mynet01
mynet01

三、flannel+etcd实现Docker网络管理

flannel开源项目地址:https://github.com/flannel-io/flannel

1.作用

  • 跨物理机的容器相互通信
  • 改变容器分配IP的方式
  • etcd负责记录网络分配信息

docker_net01

2.配置flannet+etcd环境

A.环境描述

主机名 IP地址 软件
flannet.linux.com 192.168.140.16 Docker、flannet、etcd
docker.linux.com 192.168.140.15 Docker、flannet

B.两台机器分别安装Docker

过程省略
关于Docker安装教程

C.配置etcd数据库

flannet.linux.com上操作

[root@flannet ~]# yum install -y etcd
[root@flannet ~]# vim /etc/etcd/etcd.conf

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
[root@flannet ~]# systemctl enable --now etcd

如果没有netstat命令,请yum install -y net-tools

[root@flannet ~]# netstat -tunlp | grep etcd
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      4517/etcd           
tcp6       0      0 :::2379                 :::*                    LISTEN      4517/etcd
测试etcd数据库
[root@flannet ~]# etcdctl set file1/name wangshengjj
wangshengjj
[root@flannet ~]# etcdctl get file1/name
wangshengjj

D.在两台服务器安装flannel

[root@flannet ~]# yum install -y flannel
[root@docker ~]# yum install -y flannel

E.修改flannel配置文件

[root@flannet ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.140.16:2379"	#修改数据库连接地址
[root@docker ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.140.16:2379"

F.在etcd数据库写入flannel网络使用的网段信息

这一步需要在安装etcd的机器上操作

[root@flannet ~]# etcdctl mk /atomic.io/network/config '{"Network":"10.100.0.0/16"}'

G.启动flannel

[root@flannet ~]# systemctl enable --now flanneld
[root@docker ~]# systemctl enable --now flanneld

启动成功后,会自动创建一个名为flannel0的虚拟网卡

[root@flannet ~]# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.100.43.0  netmask 255.255.0.0  destination 10.100.43.0
        inet6 fe80::b66e:c6d:1274:ced2  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)
        
[root@docker ~]# ifconfig flannel0
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.100.84.0  netmask 255.255.0.0  destination 10.100.84.0
        inet6 fe80::9c50:c025:d601:9a65  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (UNSPEC)

H.修改Docker启动脚本(重要)

这一步,主要是让flannel接管docker的默认网络

[root@flannet ~]# vim /usr/lib/systemd/system/docker.service
#在这条参数后边,加上变量
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_NETWORK_OPTIONS
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_NETWORK_OPTIONS

让配置生效,然后重启Docker服务

[root@flannet ~]# systemctl daemon-reload
[root@docker ~]# systemctl daemon-reload
[root@flannet ~]# systemctl restart docker
[root@docker ~]# systemctl restart docker
查看docker0网卡
[root@flannet ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.100.43.1  netmask 255.255.255.0  broadcast 10.100.43.255
        inet6 fe80::42:1cff:fe49:a90c  prefixlen 64  scopeid 0x20<link>
        ether 02:42:1c:49:a9:0c  txqueuelen 0  (Ethernet)
[root@docker ~]# ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.100.84.1  netmask 255.255.255.0  broadcast 10.100.84.255
        ether 02:42:98:67:f0:77  txqueuelen 0  (Ethernet)

I.修改iptables防火墙规则(重要)

由于yum安装的flannel默认会修改FORWARD规则为拒绝,所以我们要改回默认的允许

[root@flannet ~]# iptables -P FORWARD ACCEPT
[root@docker ~]# iptables -P FORWARD ACCEPT

J.两台服务器创建容器,测试通信

[root@flannet ~]# docker run -itd --name centos centos:7
[root@docker ~]# docker run -itd --name centos centos:7
[root@flannet ~]# docker exec -it centos /bin/bash
[root@docker ~]# docker exec -it centos /bin/bash
进行ping测试
[root@7e24d4cbba8f /]# ping 10.100.84.2
PING 10.100.84.2 (10.100.84.2) 56(84) bytes of data.
64 bytes from 10.100.84.2: icmp_seq=1 ttl=60 time=0.815 ms
64 bytes from 10.100.84.2: icmp_seq=2 ttl=60 time=0.309 ms
64 bytes from 10.100.84.2: icmp_seq=3 ttl=60 time=0.371 ms
[root@ca24d303731e /]# ping 10.100.43.2
PING 10.100.43.2 (10.100.43.2) 56(84) bytes of data.
64 bytes from 10.100.43.2: icmp_seq=1 ttl=60 time=0.326 ms
64 bytes from 10.100.43.2: icmp_seq=2 ttl=60 time=0.502 ms