前言
- Docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制
一、Docker 网络实现原理
1.1 Docker 的网桥与容器IP
- Docker 使用 Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时 会根据 Docker网桥的网段分配给容器一个IP地址,称为 Container-IP,同时Docker网桥(docker0)是每个容器的默认网关。
- 因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP(容器IP)直接通信。
- 默认情况下,外部网络不知道 docker 的 127.17.0.1 网桥地址 和 容器的 IP 地址。


1.2 查看容器的 IP 地址
docker ps -a
查看容器 exec 进入容器
yum install -y net-tools


1.3 宿主机访问容器
首先需要开启宿主机的IP转发功能:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
重启docker 与网卡
- Docker网桥(docker 0)是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。
- 如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过
[宿主机IP]:[容器端口]访问容器。
启动容器时,指定容器端口格式:
docker run -itd --name test1 -P nginx #随机映射端口 (从32768开始)
docker run -itd --name test2 -p 43000:80 nginx #指定映射端口
-P 随机生成端口

宿主机IP:容器映射端口 来访问容器中的内容

-p 指定容器端口

用 http://192.168.10.70:49999/ 也可以成功访问 nginx服务。
进入容器中,修改查看 nginx 主页文件

那么是如何实现宿主机与容器之间的通信呢?
答:通过 iptables 的 DNAT ,目的网络地址转换
在docker run 指定 -p/-P 的时候就会添加一条 iptables 规则。
查看规则:iptables -t nat -nvL
1.4 Docker 的网络模式:
Docker 有五种网络模式:
- Host:容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。
- Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口。
- None:该模式关闭了容器的网络功能(不用网卡和IP地址)。
- Bridge:Docker默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker 0 虚拟网桥,通过 docker 0 网桥以及iptables nat 表配置与宿主机通信。
- 自定义网络:自己制定网段
安装Docker时,它会自动创建三个网络:
- Bridge (创建容器默认连接到此网络)
- None
- Host
#查看docker网络列表
docker network ls或docker network list

指定网络模式:
使用 docker run 创建 Docker 容器时,可以用 --net 或 --network 选项指定容器的网络模式:
- Host模式:使用
--net=host指定。 - None模式:使用
--net=none指定。 - Container模式:使用
--net=container:容器NAME 或 容器ID指定,因为要制定是哪个容器。 - Bidge模式:使用
--net=bridge指定,默认设置,可省略。
详解网络模式:
1.4.1 Host 模式
-
Host 是和宿主机共享IP和端口,相同
-
相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址;
-
Docker 使用了Linux的 Namespaces 技术来进行资源隔离,如:
- PID Namespace 隔离进程;
- Mount Namespace 隔离文件系统
- Network Namespacel 隔离网络等。
-
一个Network Namespace 提供了一份独立的网络环境,包括 网卡、路由、iptable规则等都与其他的Network Namespace隔离。
-
一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

1.4.2 Container 模式
- Container 是和 容器共享网络IP和端口的,指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享;
- 新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等;
- 两个容器除了网络方面(两个容器共用一个命名空间),其他的如文件系统、进程列表等还是隔离的;
- 两个容器的进程可以通过lo网卡设备通信。
查看容器的进程号
一个容器就是一个进程,查看容器的进程号
docker ps -a
docker inspect -f '{
{.State.Pid}}' 容器ID

根据容器进程ID查看容器命名空间 net namespace 编号
ls /proc/进程ID/ns



本文详细介绍了Docker的网络实现原理,包括Docker网桥、容器IP、网络模式如Host、Container、None和Bridge模式,以及如何实现宿主机与容器间的通信。此外,还探讨了Docker资源限制,如CPU使用率上限、CPU资源占用比、内存限制和磁盘IO配额控制,以确保容器的高效运行和资源管理。
最低0.47元/天 解锁文章
1520

被折叠的 条评论
为什么被折叠?



