【容器应用系列教程】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:7docker 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负责记录网络分配信息

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
                
评论