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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker


2、 查看当前网络

docker network ls

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_02

(2)、新建容器的网络设置

1)、bridge模式

bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。容器通过宿主机的NAT规则后可以访问外网。

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_03

[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

发现使用的是默认的网桥

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_04


ip a可以看到,每开启容一个器就会在宿主机搭建一个网络桥接

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_05


如果我们用交互模式进入容器,可以看到

有lo和eth0两个网络设备

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_Docker_06

2)、host模式

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_07

host网络模式需要在容器创建时指定 --network=host

[root@server1 harbor] docker run -it --name demo --network host busybox
/ # ip addr show

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_Docker_08


内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_linux_09

3)、none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用
--network=none指定。

[root@server1 harbor] docker run -it --name demo --network none busybox
/ # ip addr

只有lo口的

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_10

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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_11


内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_Docker_12


2、此时暂停的容器demo1,demo2。并调换启动顺序,先启动demo2,再启动demo1

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_13


发现先启动的容器,先分配ip

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_14


内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_15


3、容器内互通

新建一个交互方式的容器,发现在容器内与之前建立的demo1容器可以实现互相通信。

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_16

三、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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_17


图2

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_18


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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_linux_19


连接的demo2对demo1进行ping,发现连接成功

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_20


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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_21

具体步骤如下
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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_22


2、用Container 网络模式新建一个容器vm2

发现ip与vm1的ip一样,这是因为共用了网络栈

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_23


3、测试结果

他们之间可以相互ping通,但是只以vm1具有ip

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_Docker_24


内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_linux_25


内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_26

五、跨主机容器网络—macvlan网络方案实现

跨主机网络解决方案

docker原生的overlay和macvlan

Linux kernel提供的一种网卡虚拟化技术。

无需Linux bridge,直接使用物理接口,性能极好。

1、配置新网卡

server1

添加虚拟网卡

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_27


修改新网卡配置

[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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_linux_28


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

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_docker_29


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,修改其内容如下

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_自定义_30


启用网卡,设定混杂模式,

[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的容器进程

内网两台服务器docker部署的容器间怎么通信 docker两个容器互通_运维_31