Docker上一篇:Dockerfile暴力入门
Docker下一篇:

Docker网络

在一台安装Docker的Linux机器上执行ifconfig命令,可以发现出现一个名为docker0的虚拟网桥:

3-1Docker0

Docker网络常用命令

查看Docker网络命令的帮助docker network --help

3-2帮助命令

查看Docker网络模式列表docker network ls

3-3网络列表

查看网络源数据docker network inspect [network_name]
删除网络docker network rm [network_name]
查看容器的网络docker inspect [container_name]

Docker网络的作用

  1. 用于实现容器间的互联和通信以及端口映射
  2. 容器IP变动时,可以通过服务名连接(类似于SpringCloud的服务名)

网络模式

网络模式简介命令
bridge为每一个容器分配、设置IP等,并将容器连接到docker0虚拟网桥。默认为该模式。--network bridge
host容器将不再虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口--network host
none容器有独立的Network namespace,但并没有对齐进行任何网络设置,如分配veth pair和网桥连接、IP等。--network none
container新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。--network container:NAME

bridge模式

Docker服务默认会创建一个docker0网桥,该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

在启动一个容器时,如果没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0

3-1Docker0

网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)
每个容器实例内部也有一块网卡,每个接口叫eth0;
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。

容器之间互相访问时,以docker0为网关;当宿主机与容器之间访问时,以docker0为网关。

3-4bridge

在宿主机运行一个centos_ssh:7的容器(构建可以ssh登录的centos7),在容器内执行ip addr(如果提示找不到命令,请安装initscripts):

3-5container-ip_addr

可以看到有一个24: eth0@if25,在宿主机执行ip addr,则将会看到有一个25: vethadb701b@if24

3-6master-ip_addr

这就是上述的eth0veth

host模式

host模式是指直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换。在这种模式下,容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口。

3-7host模式

命令:docker run -d --network host --name [container_name] [image](不需要指定端口)

none模式

禁用网络功能,可以理解为不与外界有网络连接,且没有网卡。网络只有lo标识,即127.0.0.1

命令:docker run -d -p [master_port]:[container_port] --network none --name [container_name] [image]

container模式

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。

3-8container模式

命令:docker run -d -p [master_port]:[new_container_port] --network container:[net_container_name] --name [new_container_name] [image]

如果net_container挂掉了,则new_container的网络模式会变成none模式。

自定义模式

在实际开发环境中,容器的IP是可能会变化的,为了保证服务的可用性,需要用容器名代替容器IP去查找服务。

步骤:

  1. 新建自定义网路
  2. 新建容器时指定容器名
  3. 新建容器时指定网络
docker network create test
docker run --network test --name centos1 -d centos_ssh:7
docker run --network test --name centos2 -d centos_ssh:7

之后,在容器内部就可以通过容器名互相访问了。

Docker上一篇:Dockerfile暴力入门
Docker下一篇: