Docker从网络管理到容器优化
Docker 技术全面解析:从网络管理到容器优化
- 前言
- 一、Docker 网络管理
- 1.1. Docker 网络实现原理
- 1.2. Docker 的网络模式
- 二、资源限制
- 2.1. CPU 资源控制
- 2.2. 内存使用限制
- 3.3. 磁盘 IO 控制
- 三、数据卷容器
- 四、端口映射
- 五、容器互联
- 六、Docker 镜像的创建
- 结语
前言
在当今云计算和微服务架构盛行的时代,Docker 作为一种轻量级的容器化技术,已经成为现代应用开发和部署的重要工具。它不仅能够简化应用的打包和分发过程,还能提高资源利用率和应用的可移植性。本文将深入探讨 Docker 的网络管理、资源限制、数据卷管理、端口映射、容器互联以及镜像创建等多个方面的技术细节,帮助读者全面掌握 Docker 的核心概念和实践技巧。
一、Docker 网络管理
1.1. Docker 网络实现原理
Docker 使用 Linux 桥接技术,在宿主机上虚拟出一个 Docker 容器网桥(docker0)。当启动一个容器时,Docker 会根据 docker0 的网段为容器分配一个 IP 地址,称为 Container-IP。Docker 网桥是每个容器的默认网关,同一宿主机内的容器通过这个网桥可以直接通信。然而,外部网络无法直接通过 Container-IP 访问容器,需要通过端口映射来实现外部访问。
1.2. Docker 的网络模式
Docker 提供了多种网络模式,以满足不同的应用场景需求:
- Host 模式:容器与宿主机共享网络栈,直接使用宿主机的 IP 地址。
- Container 模式:新创建的容器与已有的容器共享一个 Network Namespace。
- None 模式:容器没有网络配置,只有回环接口(lo)。
- Bridge 模式:Docker 的默认网络模式,容器通过虚拟网桥与宿主机和其他容器通信。
- 自定义模式:允许用户自定义容器的网络范围、子网和路由,提供更高的网络控制和隔离性。
#1. 查看当前 Docker 网络列表
docker network ls
#2. 查看某个网络的详细信息
docker network inspect <网络名或ID>
#3. 查看容器的网络信息
docker inspect <容器ID或名称> | grep IPAddress
#4. 查看 veth 设备与网桥的绑定关系(需安装 bridge 工具)
brctl show
#5. 查看 iptables NAT 规则(用于端口映射)
iptables -t nat -L -n -v
docker run -d --name test1 -P nginx #随机端口从32768开始
docker run -d --name test2 -p 40000:80 nginx #指定端口
docker logs [CONTAINER ID|NAMES] #查看容器的输出和日志信息
docker run -d --name host --network host nginx
docker run -itd --name os7 centos:7 /bin/bash
docker ps
docker inspect -f '{{.State.Pid}}' [contariner ID|NAMES] #查看容器进程号
ls -l /proc/[容器进程号]/ns
docker run -itd --name test2 --network contariner:[CONTARINER ID|NAMES] centos:7 /bin/bash
docker network create --subnet=172.18.0.0/24 --opt "com.docker
.network.bridge.name"="docker1" mynetwork #自定义容器网卡
docker run -itd --name test5 --network mynetwork --ip 172.18.0.10 centos:7 /bin/bash
二、资源限制
2.1. CPU 资源控制
Docker 通过 cgroups 实现对 CPU 资源的控制,主要方法包括:
- 设置 CPU 使用率上限:通过
--cpu-quota
和--cpu-period
参数控制容器的 CPU 使用率。 - 设置 CPU 占用比:通过
--cpu-shares
参数设置容器的 CPU 使用权重。 - 绑定指定 CPU:通过
--cpuset-cpus
参数将容器进程绑定到宿主机的指定 CPU 核上。
docker run -itd --name os7_2 --cpu-quota 80000 centos:7 /bin/bash #80000 (80%)
docker exec -it os_7 /bin/bash
vi 1.sh
#!/bin/bash
i=0
while true; do let i++;done
chmod +x 1.sh
docker stats
docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash
docker run -itd --name c1 --cpu-shares 1024 centos:7 /bin/bash
docker exec -it c1 /bin/bash
docker exec -it c2 /bin/bash
yum -y install epel-release
yum -y install stress
stress -c 4
cd /sys/fs/cgroup/cpu/docker/<container-id>/
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
echo 50000 > cpu.cfs_quota_us # 设置配额(临时生效)
注意事项(CPU)
--cpu-shares
是权重,不是限额。--cpu-quota
/--cpu-period
是硬限制(quota = -1 表示无限制)。- 使用
--cpuset-cpus
能提高性能稳定性(避免与其他进程抢核)。 - 在多核宿主机上理解
quota/period
的含义(单位是 “相对于 1 个 CPU 的份额”)。
2.2. 内存使用限制
通过 -m
和 --memory-swap
参数限制容器可用的物理内存和 swap 总量,确保容器不会耗尽宿主机的内存资源。
docker run -itd --name test8 -m 512m centos:7 /bin/bash
# 或者设置 swap 总额
docker run -itd --name test8b -m 300m --memory-swap=1g centos:7
cd /sys/fs/cgroup/memory/docker/<container-id>/
cat memory.limit_in_bytes
cat memory.usage_in_bytes
--memory
与 --memory-swap
规则
- -m 300m --memory-swap=1g`
- 含义:容器可用物理内存 = 300 MB;物理 + swap 总共 = 1 GB → swap 可用 = 700 MB(1G - 300M)。
- 默认行为:若不设置
--memory-swap
,通常容器可使用的 swap 为-m
值的两倍(行为可能随 Docker 版本/配置变化)。 - 若
--memory-swap
=-1
:swap 不受限制(宿主机可用多少 swap 就用多少)。 - 若
--memory-swap
=-m
:容器不能使用 swap(物理内存用尽会触发 OOM)。
3.3. 磁盘 IO 控制
Docker 提供了对块设备读写带宽与 IOPS 的限制选项,基于 cgroups 的 blkio 控制器,确保容器对磁盘 I/O 的使用不会影响宿主机的性能。
--device-read-bps /dev/sda:1M #限制设备上读速率为 1 MB/s。
--device-write-bps /dev/sda:1M #限制写速率为 1 MB/s。
--device-read-iops /dev/sda:100 #限制读 IOPS(次数)。
--device-write-iops /dev/sda:100 #限制写 IOPS(次数)。
docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
# CPU
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-quota 50000 centos:7
docker run -itd --name c3 --cpuset-cpus "1,3" centos:7
docker run -itd --name c4 --cpus="0.5" centos:7
# 内存
docker run -itd --name memtest -m 512m centos:7
docker run -itd --name memtest2 -m 300m --memory-swap=1g centos:7
# blkio
docker run -it --name iotest --device-write-bps /dev/sda:1MB centos:7
# 监控/验证
docker stats
docker exec -it <container> bash
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpu.cfs_quota_us
cat /sys/fs/cgroup/memory/docker/<container-id>/memory.limit_in_bytes
# 清理
docker system prune -a #删除 Docker 中所有未使用的资源,包括镜像、容器、网络和悬空卷(但默认不删除卷),以 释放磁盘空间。
三、数据卷容器
数据卷是 Docker 中用于持久化存储数据的机制,通过数据卷容器,多个容器可以共享数据,避免数据丢失或重复管理。数据卷容器不运行应用程序,仅提供数据卷供其他容器挂载和使用。
#创建与挂载数据卷
docker run -itd -v /var/www/:/data1 --name web1 centos:7 /bin/bash
#创建数据卷容器
docker run -itd -v /data1 -v /data2 --name web2 centos:7 /bin/bash
docker run -itd --volumes-from web2 --name web3 centos:7 /bin/bash
四、端口映射
端口映射机制使得容器内部运行的服务能够被外部网络访问。通过 -P
参数实现随机端口映射,或通过 -p
参数手动指定宿主机和容器之间的端口映射关系。
五、容器互联
容器互联机制通过 --link
选项实现容器之间的网络通信,源容器和接收容器可以通过容器名称进行通信。尽管容器互联适用于简单的场景,但在复杂环境中,建议使用 Docker 网络来管理容器间的通信。
docker run -itd -P --name web1 centos:7 /bin/bash
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash
docker exec -it web2 /bin/bash
ping web1
六、Docker 镜像的创建
Docker 提供了多种创建镜像的方法:
- 基于现有镜像创建:通过修改容器并提交为新的镜像。
- 基于本地模板创建:从模板文件导入创建镜像。
- 基于 Dockerfile 创建:通过编写 Dockerfile 实现镜像的自动化构建,支持定制化的镜像创建过程。
docker create -it centos:7 /bin/bash
docker ps -a
docker commit -m "new" -a "centos" <contarinet id> centos:test #-m: 提交说明 -a:作者信息 centos:test 文件名称:标签
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
curl -L 下载路径 -o 保存路径
cat [文件名] | docker import - [名称]:[标签]
#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
#准备html页面
echo "RRRRRR" > index.html
docker build -t httpd:centos .
docker run -d -p 9090:80 httpd:centos
结语
Docker 作为一种强大的容器化技术,提供了丰富的功能和灵活的配置选项,能够帮助开发者和运维人员高效地管理和部署应用。通过深入理解 Docker 的网络管理、资源限制、数据卷管理、端口映射、容器互联以及镜像创建等方面的知识,读者可以更好地利用 Docker 提升应用的可靠性、可扩展性和可维护性。希望本文能够为您的 Docker 学习之旅提供有价值的参考和指导。