Docker网络
- 一、前言
- 二、docker原生网络
- (1)、 简介
- (2)、新建容器的网络设置
- 1)、bridge模式
- 2)、host模式
- 3)、none模式
- 4)、容器的ip分配规则
- 三、Docker自定义网络
- 四、Docker容器通信
- (1)、通信方式1:使用自定义网络
- (2)、通信方式2:使用Container 网络模式
- 五、跨主机容器网络—macvlan网络方案实现
一、前言
1、docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
2、docker安装后会自动创建3种网络:bridge、host、none
3、yum install -y net-tools 查看网络的工具
本章节将为4个部分去介绍docker网络通信
二、docker原生网络
(1)、 简介
1、 docker安装后会自动创建3种网络:bridge、host、none
网络模式 | 工作模式 |
host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围 |
None | 该模式关闭了容器的网络功能 |
Bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信 |
安装时会默认创建一个docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
ip addr show docker0
2、 查看当前网络
docker network ls
(2)、新建容器的网络设置
1)、bridge模式
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网。
[root@server2 ~] docker run -d nginx 后台运行nginx
[root@server2 ~] docker run -d --name demo1 -p 80:8080 game2048 后台运行demo1
[root@server2 ~] brctl show 查看网络连接
[root@server2 ~] ip a
发现使用的是默认的网桥
ip a可以看到,每开启容一个器就会在宿主机搭建一个网络桥接
如果我们用交互模式进入容器,可以看到
有lo和eth0两个网络设备
2)、host模式
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
host网络模式需要在容器创建时指定 --network=host
[root@server1 harbor] docker run -it --name demo --network host busybox
/ # ip addr show
3)、none模式
none模式是指禁用网络功能,只有lo接口,在容器创建时使用--network=none
指定。
[root@server1 harbor] docker run -it --name demo --network none busybox
/ # ip addr
只有lo口的
4)、容器的ip分配规则
1、同时创建两个容器,查看对应的ip
[root@server2 docker] docker run -d -it --name demo1 nginx
[root@server2 docker] docker run -d -it --name demo2 nginx
[root@server2 docker] docker inspect demo1
[root@server2 docker] docker inspect demo2
可以看到demo1是对应的ip是172.17.0.2,demo2是对应的ip是172.17.0.3
2、此时暂停的容器demo1,demo2。并调换启动顺序,先启动demo2,再启动demo1
发现先启动的容器,先分配ip
3、容器内互通
新建一个交互方式的容器,发现在容器内与之前建立的demo1容器可以实现互相通信。
三、Docker自定义网络
自定义网络模式,docker提供了三种自定义网络驱动:
bridge、overlay、macvlan。
自定义bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
1、查看新建立的网络
docker network create -d bridge my_net1
docker network ls 图1
docker network inspect my_net1 图2
图1
图2
2、设置具体的自定义网络
用我们创建的自定义网络取创建两个
-d是打入后台的意思 -it是交互界面,才会有进程
[root@server2 docker] docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 my_net1 建立新的网络
[root@server2 docker] docker run -d -it --name demo1 --network my_net1 busybox
[root@server2 docker] docker inspect demo1 图1、查看年demo1分配的ip
[root@server2 docker] docker run -d -it --name demo2 --network my_net1 busybox
图1、查看到demo1的ip为172.20.0.2
连接的demo2对demo1进行ping,发现连接成功
3、新建容器也可以指定具体的ip
[root@server1 harbor] docker run -d -it --name demo1 --network my_net1 --ip 172.20.0.10 busybox 设置此容器的ip(并且ctrl+p+q打入后台运行)
[root@server1 harbor] docker run -d -it --name demo2 --network my_net1 --ip 172.20.0.20 busybox
四、Docker容器通信
要实现容器内互通有两种方式,第一种是使用自定义网络
(1)、通信方式1:使用自定义网络
docker自带的DNS解析,可以不用做解析。ping容器的名字或者是ip都可以
[root@server2 docker] docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 my_net1
[root@server2 docker] docker run -d -it --name demo1 --network my_net1 --ip 172.20.0.10 busybox
d2dfc1bcef6976fa9942294d7a2de2417bb86c1dc456d85a43f2c9f476c4b2a6
[root@server2 docker] docker run -it --name demo2 --network my_net1 --ip 172.20.0.20 busybox
/ ping demo1
(2)、通信方式2:使用Container 网络模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。
Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
在容器创建时使用–network=container:vm指定(vm指定的是运行的容器名)
会连接两个容器具体相同ip,但是只以vm1会显示ip
具体步骤如下
1、搭建自定义容器vm1作为实验背景
[root@server2 docker] docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 my_net1
[root@server2 docker] docker run -it --name vm1 --network my_net1 busybox
/ ip a 图1
查看到当前的ip为172.20.0.2
2、用Container 网络模式新建一个容器vm2
发现ip与vm1的ip一样,这是因为共用了网络栈
3、测试结果
他们之间可以相互ping通,但是只以vm1具有ip
五、跨主机容器网络—macvlan网络方案实现
跨主机网络解决方案
docker原生的overlay和macvlan
Linux kernel提供的一种网卡虚拟化技术。
无需Linux bridge,直接使用物理接口,性能极好。
1、配置新网卡
server1
添加虚拟网卡
修改新网卡配置
[root@server1 network-scripts] cd /etc/sysconfig/network-scripts
[root@server1 network-scripts] cp ifcfg-eth0 ifcfg-eth1
[root@server1 network-scripts] vim ifcfg-eth1 图1
图1
2、启用网卡,设定混杂模式,
[root@server1 network-scripts] ifup eth1
[root@server1 network-scripts] ip link set eth1 promisc on
[root@server1 network-scripts] ip addr show eth1
3、docker主机上创建macvlan网络,开启容器进程
[root@server1 network-scripts] docker network create -d macvlan --subnet 172.54.0.0/24 --gateway 172.54.0.1 -o parent=eth1 macvlan1
1a4404b1fd8a1586081fa14600e1f1e843872f20609800fd6482f8a28f5c604f
[root@server1 network-scripts] docker run -it --name demo2 --network macvlan1 --ip 172.44.0.11 busybox
/
4、另外一块主机配置
server2
操作同上,添加一块相同的网卡eth1,修改其内容如下
启用网卡,设定混杂模式,
[root@server1 network-scripts] ifup eth1
[root@server1 network-scripts] ip link set eth1 promisc on
[root@server1 network-scripts] ip addr show eth1
创建相同网段的macvlan,设定ip为172.54.0.12的容器进程
[root@server2 mnt] docker network create -d macvlan --subnet 172.54.0.0/24 --gateway 172.54.0.1 -o parent=eth1 macvlan1
[root@server2 mnt] docker run -it --name demo3 --network macvlan1 --ip 172.54.0.12 busybox
5、实验结果:在server2的容器中,ping通server1的容器进程