Docker网络原理及Cgroup硬件资源占用控制

目录

一. Docker 网络实现原理

1. 介绍

2. docker 的网络模式

3. 网络模式详解

3.1 host模式

3.2 container模式

3.3 none 模式

3.4 bridge 模式

3.5 自定义网络

3.6 网络总结

二. Docker容器的资源控制

1. cgroup 介绍

2. CPU 资源控制

2.1 设置cpu使用率上限

2.2 设置CPU资源占用比(设置多个容器时才有效)

2.3 设置容器绑定指定的CPU

3. 对内存使用的限制

3.1 限制容器可以使用的最大内存

3.2 限制容器可用的swap 大小 

4. 对磁盘IO配额控制(blkio)的限制

5. 清除docker占用的磁盘空间

6. 生产解决问题


一. Docker 网络实现原理

1. 介绍

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

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

docker run -d --name test1 -P nginx					#随机映射端口(从32768开始)

docker run -d --name test2 -p 10000:80 nginx		#指定映射端口

#查看容器的输出和日志信息
docker logs 容器的ID/名称

2. docker 的网络模式

  • Host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
  • Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
  • None:该模式关闭了容器的网络功能。
  • Bridge:默认为该模式,此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
  • 自定义网络 

 docker初始状态下有三种默认的网络模式 ,bridge(桥接),host(主机),none(无网络设置)

docker network ls	 或  docker network list			
#查看docker网络列表

#使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式

host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
container模式:使用 --net=container:NAME_or_ID 指定。
bridge模式:使用 --net=bridge 指定,默认设置,可省略。

3. 网络模式详解

3.1 host模式

相当于 Vmware 中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
Docker 使用了 Linux 的 Namespaces 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。
一个 Network Namespace 提供了一份独立的网络环境,包括网卡、路由、iptable 规则等都与其他的Network Namespace隔离。 一个Docker容器一般会分配一个独立的Network Namespace。 但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口。

docker run -d --name test1 --network host nginx:latest

docker ps --filter  "network=host"

lsof -i:80

3.2 container模式

在理解了 host 模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

#基于镜像nginx:latest 创建一个名为web1的容器
docker run -itd --name web1 nginx:latest /bin/bash
#查看容器web1的pid号
docker inspect -f '{
  {.State.Pid}}' web1
ls -l /proc/web1的pid/ns
 
#创建web2容器,使用container网络模式,和web1共享网络命名空间
docker run -itd --name web2 --net=container:web1 nginx:latest /bin/bash
#查看web2容器的pid
docker inspect -f '{
  {.State.Pid}}' web2
ls -l /proc/web2的pid/ns/
#可以看到web2和web1共享同一个网络命名空间
 

docker inspect web1的ID

docker inspect web2的ID   web2向web1用的IP网段

3.3 none 模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息。这种网络模式下容器只有lo回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

docker run -itd --name web3 --network=none nginx:latest  /bin/bash

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值