Docker 网络 和 资源限制

本文详细介绍了Docker的网络实现原理,包括Docker网桥、容器IP、网络模式如Host、Container、None和Bridge模式,以及如何实现宿主机与容器间的通信。此外,还探讨了Docker资源限制,如CPU使用率上限、CPU资源占用比、内存限制和磁盘IO配额控制,以确保容器的高效运行和资源管理。
摘要由CSDN通过智能技术生成

前言

  • 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

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值