Docker网络

Docker网络完成原理

docker 运用linux 桥接,在宿主机虚拟一个docker 容器网桥(docker0) ,docker 启动一个容器时会依据docker 网桥的网段分配给容器一个IP地址,称为Container-IP,一起Docker 网桥是每个容器的默许网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够经过容器的 Container-IP 直接通讯。

Docker的网络模式

docker 网桥是宿主机虚拟出来的,并不是实在存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接经过Container-IP 拜访到容器。假设容器希望外部拜访能够拜访到,能够经过映射容器端口到宿主机(端口映射),即 docker run 创立容器时分,经过 -p 或者 -P 参数来启用。拜访容器的时分,就经过 [宿主机IP]:[映射端口] 拜访容器。

Docker的网络模式

Docker的网络模式

为容器创立端口映射

端口映射,底层原理实践是做了一个DNAT转化。

随机映射端口

端口号从32768开端

格局docker run -itd  --name=为容器指定称号 -P 镜像称号

示例

Docker的网络模式

Docker的网络模式

方法二:指定映射端口

格局docker run -itd --name=为容器指定称号 -p 宿主机端口:容器端口 镜像称号

Docker的网络模式

Docker的网络模式

Docker的网络模式

端口映射实践是做了一个DNAT转化,经过nat表进行转发的

端口映射,底层原理实践是做了一个DNAT转化。

192.168.44.20:49153 映射到 172.17.0.2:80,192.168.44.20:8080 映射到 172.17.0.3:80。

Docker的网络模式

留意

之前启动容器时有报错,是因为没有敞开路由转发

Docker的网络模式

增加路由转发功用

Docker的网络模式

Docker的网络模式

Docker的网络形式

Docker的网络形式(4+1)

  • Host: 容器不会虚拟出自己的网卡,装备主机的IP等,而是运用宿主机的IP和端口
  • Container: 创立的容器不会创立自己的网卡,装备自己的IP,而是和一个指定的容器同享IP,端口规模
  • None: 该形式关闭了容器的网络功用。
  • Bridge: 默许为该形式,此形式会为每一个容器分配,设置IP等,并将容器衔接到一个docker0 的虚拟网桥,经过docker 0 网桥以及iptables nat 表装备与宿主机通讯。
  • 自定义网络

在装置Docker 时,它会自动创立三个网络:bridge(创立容器默许衔接到此网络),none,host。

检查docker 的网络列表

在装置Docker 时,它会自动创立三个网络:bridge(创立容器默许衔接到此网络),none,host。

#检查docker的网络列表
docker network ls
或者
docker network list

Docker的网络模式

指定容器网络形式

运用docker run 创立Docker容器时,能够用--net--network 选项指定容器的网络形式

  • host形式:运用 –net=host 指定。
  • none形式:运用 –net=none 指定。
  • container形式:运用–net=container:NAME/ID指定。
  • bridge形式:运用 –net=bridge 指定,默许设置,可省掉。

Docker网络形式详解

host形式

  • 相当于Vmware中的桥接形式,与宿主机在同一个网络中,但没有独立IP地址。

  • Docker运用了Linux的Namespaces技术来进行资源阻隔,如PID Namespace阻隔进程,Mount Namespace阻隔文件体系,Network Namespace阻隔网络等。

  • 一个Network Namespace供给了一 份独立的网络环境,包括网卡、路由、iptable规矩等都与其他的Network Namespace阻隔。

  • 一个Docker容器一般会分配一个独立的NetworkNamespace。但假设启动容器的时分运用host形式,那么这个容器将不会获得一个独立的NetworkNamespace,而是和宿主机共用一个NetworkNamespace。容器将不会虚拟出自己的网卡、装备自己的IP等,而是运用宿主机的IP和端口。

容器和宿主机同享网络命名空间,但没有独立IP地址,运用宿主机的IP地址,和宿主机同享端口规模,例如宿主机运用了80端口,那么容器不能运用80端口。这种形式比较便利,但不安全。

Docker的网络模式

host形式中的IP是和宿主机是同享同一个IP地址的 容器运用的端口号同享同一个规模的,与宿主机是同享一个指令空间的。

示例

Docker的网络模式

Docker的网络模式

container形式

  • container形式: 运用 –net=contatiner:NAME/ID 指定。

  • 这个形式指定新创立的容器和已经存在的一个容器同享一个Network Namespace,而不是和宿主机同享。新创立的容器不会创立自己的网卡、装备自己的IP,而是和一个指定的容器同享IP,端口规模等。 能够在必定程度上节省网络资源,容器内部依然不会具有一切端口。

  • 相同,两个容器除了网络方面,其他的如文件体系,进程列表等还是阻隔的。

  • 两个容器的进程能够经过lo网卡(回环网卡)设备通讯。

新创立的B容器和A容器同享命名空间。假设A容器运用了80端口,B容器就不能运用80端口。

Docker的网络模式

示例

运用container形式创立的容器是同享网络命名空间的,可是端口号不能相同,外部网络想要拜访容器,就能够指定一个容器的端口号进行拜访操作,容器之间彼此通讯是经过IO回环网卡彼此通讯

Docker的网络模式

  • -f 选项用于提取某个模块中的某一项
    Docker的网络模式

Docker的网络模式

能够看到test2和test1同享同一个网络命名空间

none 形式

  • none形式:运用 –net=none 指定

  • 运用none 形式,docker 容器有自己的network Namespace ,可是并不为Docker 容器进行任何网络装备。也便是说,这个Docker 容器没有网卡,ip, 路由等信息。

  • 这种网络形式下,容器只有lo 回环网络,没有其他网卡。

  • 这种类型没有办法联网,可是封闭的网络能很好的确保容器的安全性。

  • 该容器将完全独立于网络,用户能够依据需求为容器增加网卡。此形式具有一切端口。(none网络形式装备网络

  • 特殊情况下才会用到,一般不必。

Docker的网络模式

none形式下的容器没有指令空间,虽然具有一切的装备,可是装备都是空的

bridge 形式

bridge形式是docker的默许网络形式,不必–net参数, 便是bridge形式。

相当于Vmware中的nat形式,容器运用独立network Namespace, 并衔接到docker0虚拟网卡I经过docker0网桥以及iptables nat表装备与宿主机通讯,此形式会为每. 个容器分配Network Namespace、 设置IP等,并将一一个 主机上的Docker 容器衔接到一个虚拟网桥上。

  1. 当Docker进程启动时,会在主机上创立一个名为docker0的虛拟网桥,此主机上启动的Docker容器会衔接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机相似,这样主机上的一切容器就经过交换机连在了一个二层网络中。

  2. 从docker0子网中分配一个IP给容器运用(分配一个和网桥相同网段内的IP,网桥作为网关),并设置docker0的IP地址为容器的默许网关。在主机上创立一对虛拟网卡veth pair设备。veth设备总是成对呈现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因而,veth设备常用来衔接两个网络设备。

  3. Docker将 veth pair设备的一端放在新创立的容器中,并命名为eth0 (容器的网卡),另一端放在主机中,以veth*这样相似的姓名命名,并将这个网络设备加入到docker0 网桥中。能够经过brctl show指令检查。

  4. 运用docker run -P 时,docker实践 是在iptables做了DNAT规矩,完成端口转发功用。能够运用iptables -t nat -vnL检查。

每个容器有自己独立的命名空间。容器之间经过网桥转发进行通讯,成对的网络设备veth pair。

Docker的网络模式

示例

Docker的网络模式

Docker的网络模式

Docker的网络模式

Docker的网络模式

自定义网络形式

直接运用bridge 形式,是无法指定IP运转docker 的,例如执行以下指令就会报错

Docker的网络模式

Docker的网络模式

创立自定义网络

需求先自定义网络,再指定IP运转docker。

Docker的网络模式

  • docker1 :为执行ifconfig -a 指令时显现的网卡名,假设不运用 –opt 参数指定此称号,运用 ifconfig -a 检查网卡的网络信息时,看到的将会是相似 br-110eb56a0b22这样的姓名,这不便利回忆。
  • mynetwork:为执行”docker network list” 指令时,显现的 bridge 网络形式称号。

Docker的网络模式

也能够docker exec进入容器后下载net-tools工具,之后运用ifconfig指令检查容器IP地址。

删去自定义网络

假设想要删去自定义的网络,能够运用 docker network rm 网络形式称号 进行删去,例如docker network rm mynet

删去网络形式前,需求先确保运用该网络形式创立的容器已退出(即已中止)。假设容器仍在运转,则该网络无法删去。

Docker的网络模式

Docker的网络模式

Docker容器网络生产经历

docker的网络主张和宿主机的IP”对照”

比如宿主机地址10.2.5.6,容器的地址就能够修改为172.5.6.x,这样便利在故障产生时,更简单定位故障节点方位。

daemon.json 装备介绍(键值对的格局)

# daemon.json 装备介绍
{
 "graph": "/data/docker",
 "storage-driver": "overlay2",
 "insecure-registries": ["registry.access.redhat.com", "quay.io"],
 "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
 "bip": "172.24.38.1/24",    #指定网桥的网段,这里不能写0,有必要写1
 "exec-opts": ["native. cgroupdriver= systemd"],
 "live-restore": true
}
​
#装备项留意点:
● graph:该关键字未来将被弃用,能够选用"data-root" 替代。
● storage-driver:存储驱动,即分层文件体系。
● insecure-registries:不安全的docker registries, 即运用http协议推拉镜象。
● registry-mirrors:加快站点,一般能够运用阿里、网易云、docker我国 (https: //registry.docker-cn.com)的地址。
● bip:指定doccer bridge地址(不能以.0结尾),生产中主张选用172.xx.yy.1/24,其间xx. yy为宿主机ip后四位,便利定位问题。
● 若启动失利,检查/var/log/message 日志排错。
● live-restore:启用实时复原。
默许情况下,当Docker守护程序终止时,它将关闭正在运转的容器。从Docker Engine 1.12开端,您能够装备守护程序,以便在守护程序不可用时容器仍在运转。此功用称为实时复原。实时复原选项有助于削减因为守护程序崩溃,计划内的停机或升级而导致的容器停机时刻。
​
​
#运用装备文件/etc/docker/daemon.json (没有时新建该文件)
vim /etc/docker/daemon.json
{
" insecure-registries": ["192.168.10.7:666"],
"registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"],
"live-restore": true
}

总结

  • host:容器与宿主机同享网络命名空间
  • container:容器与指定的容器同享网络指令空间
  • none:容器没有任何网络设置
  • bridge:容器具有单独的网络命名空间,且具有独立的IP,端口,路由等,运用veth pair衔接docker0网桥,并以docker0网桥为默许网关
  • 自定义:运用docker network create创立一个自定义的网络

docker run -p (大写) 随机端口
-P主机映射端口:容器端口