【容器应用系列教程】Docker网络管理
【容器应用系列教程】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
负责记录网络分配信息
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
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WangShengJJのblog!