Docker网络

  • 问题:
  • Docker容器如何连接网络
  • Docker容器之间能否接通网络
  • Docker容器之间可以通过名称ping通吗
  • 能否自定义一个网络

那么,我们带着几个问题来学习docker的网络


Docker容器是如何连接网络的

我们在安装了Docker以后,在 宿主机上 ip addr就会发现,多一个docker0的网卡配置

docker 查看网关范围 docker查看网络连接_tomcat

我们启动一个tomcat容器,然后再去容器看一下 ip addr

docker run -d -P --name tomcat01 tomcat
docker exec -it tomcat01 ip addr  # 支持此写法

docker 查看网关范围 docker查看网络连接_docker 查看网关范围_02

发现有个 6:eth0@if7的网络,我们再去宿主机上看一下网络



docker 查看网关范围 docker查看网络连接_Docker_03

会发现,宿主机上多了一个 7:veth0925cfc@if6的网络

实际上这是采用了 evth-pair技术,6:eth0@if7和7:veth0925cfc@if6就是一对儿对应的虚拟网络设备接口,两个接口可以连接起来,把网络打通

evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连。正因为有这个特性,evth-pair充当一个桥梁,连接各种虛拟网络设备的
OpenStac,Docker容器之间的连接,OVS的连接,都是使用evth-pair 技术

那么我们能不能ping通容器呢,试一下 (tomcat01的地址 172.17.0.2)

docker 查看网关范围 docker查看网络连接_docker_04

完全可以,实际上,我们在宿主机ping容器,经过docker0上的虚拟网络设备接口,也就是7:veth0925cfc@if6和

6:eth0@if7就可以走通

Docker容器之间可以通吗

先再建一个tomcat02容器

docker run -d -P --name tomcat02 tomcat
docker exec -it tomcat02 ip addr

docker 查看网关范围 docker查看网络连接_运维_05

ip addr

docker 查看网关范围 docker查看网络连接_docker 查看网关范围_06

发现又多了一对虚拟设备接口 8:eth@if9 和 9:vethe9ed702@if8

用 tomcat01 ping tomcat02(172.17.0.3)

docker exec -it tomcat01 ping 172.17.0.3

docker 查看网关范围 docker查看网络连接_docker_07

发现,容器之间也可以ping通

画一个网络模型

docker 查看网关范围 docker查看网络连接_运维_08

流程:从tomcat01–>evth-pair技术的虚拟设备接口–>docker0路由器–>evth-pair技术的虚拟设备接口–>连接到tomcat02

Docker容器之间可以通过名称ping通吗

docker exec -it tomcat01 ping tomcat02

docker 查看网关范围 docker查看网络连接_tomcat_09

直接使用容器名称是ping不通的,要是用 --link技术来实现(创建容器的时候指定)

在启动一个tomcat03 docker run -d -P --name tomcat03 --link tomcat02 tomcat

使用tomcat03ping tomcat02

docker exec -it tomcat03 ping tomcat02

docker 查看网关范围 docker查看网络连接_tomcat_10

结果ping通了

我们看一下docker的docker0网络配置(docker0的名称默认为bridge)

docker network ls
docker network inspect 网络id/名称

docker 查看网关范围 docker查看网络连接_tomcat_11

也就是说,创建的容器如不指定网络的话,那么默认的使用docker0(bridge)的网络模式



我们去看一下tomcat03的 /etc/hosts文件

docker 查看网关范围 docker查看网络连接_tomcat_12

**实质:**那么实质上就是,在tomcat03的hosts配置文件里,给tomcat02的ip设置了一个名字,访问tomcat02的时候实际上就是转发到172.17.0.3 也就是 tomcat02的ip地址

**局限性:**但是如果使用tomcat02去ping tomcat03呢,结果是不可行,现在已经不再使用 --link来连接容器了,局限性比较

能否自定义一个网络

当然可以,创建一个容器在不指定网络的情况下,默认是docker0(bridge)网络

docker network ls 查看所有网络

docker 查看网关范围 docker查看网络连接_docker 查看网关范围_13

温馨提示:忘记命令时,docker network --help 查文档

网络模式:

bridge :桥接docker (默认,自己创建也使用bridge模式)
none:不配置网络
host :和宿主机共享网络
container :容器网络连通! ( 用的少!局限很大)

创建容器时指定网络

docker run -d -P tomcat01 --net bridge tomcat # --net 指定网络

自定义网络

忘记怎么敲,就docker network create --help

docker 查看网关范围 docker查看网络连接_运维_14

–driver bridge
–subnet 192.168. 0.0/16
–gateway 192.168.0.1

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 net

docker 查看网关范围 docker查看网络连接_运维_15

docker network inspect net # 查看网络信息

docker 查看网关范围 docker查看网络连接_tomcat_16

尝试一下,使用我们自己的网络来启动容器

docker run -d -P --name tomcat-net-01 --net net tomcat
docker run -d -P --name tomcat-net-02 --net net tomcat

查看 net 网络的配置信息

docker network inspect net

docker 查看网关范围 docker查看网络连接_docker_17

使用我们自定义的网络创建的容器之间可以通过容器名字相互ping通

docker exec -it tomcat-net-01 ping tomcat-net-02

docker 查看网关范围 docker查看网络连接_docker 查看网关范围_18

打通网络

我们先使用默认bridge创建一个tomcat01,那么tomcat01可以访问到 net 网络下的 tomcat-net-01吗

不可以,两个网络间的容器需要打通后才可以访问

是指,网络和容器之间打通(例如,net网络和 tomcat01容器)

docker 查看网关范围 docker查看网络连接_运维_19

docker network connect net tomcat01

打通后,试一下可不可以访问 tomcat-net-01

docker exec -it tomcat01 ping tomcat-net-01

docker 查看网关范围 docker查看网络连接_docker_20

访问成功了

我们看一下tomcat01的网络配置

docker 查看网关范围 docker查看网络连接_tomcat_21

惊讶,这个容器的网络配置居然有两个,而且分配了两个ip地址!!!

网络模型图(偷个图,哈哈O(∩_∩)O)

docker 查看网关范围 docker查看网络连接_tomcat_22

也就是说,docker0的网络中有tomcat01这个容器,而且自定义的net网络中也有tomcat01这个容器

一般使用docker network connect 打通网络