Docker从网络管理到容器优化

Docker 技术全面解析:从网络管理到容器优化

  • 前言
  • [一、Docker 网络管理](#一、Docker 网络管理)
      • [1.1. Docker 网络实现原理](#1.1. Docker 网络实现原理)
      • [1.2. Docker 的网络模式](#1.2. Docker 的网络模式)
  • 二、资源限制
      • [2.1. CPU 资源控制](#2.1. CPU 资源控制)
      • [2.2. 内存使用限制](#2.2. 内存使用限制)
      • [3.3. 磁盘 IO 控制](#3.3. 磁盘 IO 控制)
  • 三、数据卷容器
  • 四、端口映射
  • 五、容器互联
  • [六、Docker 镜像的创建](#六、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 的默认网络模式,容器通过虚拟网桥与宿主机和其他容器通信。
  • 自定义模式:允许用户自定义容器的网络范围、子网和路由,提供更高的网络控制和隔离性。
bash 复制代码
#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
bash 复制代码
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







bash 复制代码
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


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 核上。
bash 复制代码
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 


bash 复制代码
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


bash 复制代码
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 总量,确保容器不会耗尽宿主机的内存资源。

bash 复制代码
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 的使用不会影响宿主机的性能。

bash 复制代码
--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
bash 复制代码
# 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 中用于持久化存储数据的机制,通过数据卷容器,多个容器可以共享数据,避免数据丢失或重复管理。数据卷容器不运行应用程序,仅提供数据卷供其他容器挂载和使用。

bash 复制代码
#创建与挂载数据卷
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 网络来管理容器间的通信。

bash 复制代码
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 实现镜像的自动化构建,支持定制化的镜像创建过程。
bash 复制代码
docker create -it centos:7 /bin/bash
docker ps -a 
docker commit -m "new" -a "centos" <contarinet id> centos:test     #-m: 提交说明   -a:作者信息   centos:test  文件名称:标签
bash 复制代码
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
curl -L 下载路径 -o 保存路径
cat [文件名] | docker import - [名称]:[标签]
bash 复制代码
#基于的基础镜像
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 学习之旅提供有价值的参考和指导。

相关推荐
三口吃掉你8 小时前
Docker安装Elasticsearch、kibana、IK分词器
elasticsearch·docker·kibana·ik分词器
fly五行9 小时前
Windows 系统下使用 Docker 安装 Milvus 向量数据库
windows·docker·milvus
爱宇阳9 小时前
离线环境下运行 Docker 容器编排指南
docker·容器·eureka
Java陈序员10 小时前
免费开源!一款操作 MySQL 和 MariaDB 的 Web 界面工具!
mysql·docker·php·mariadb
梁正雄11 小时前
9、dockerfile
docker·dockerfile·dockerfile基础用法
panplan.top11 小时前
Tornado + Motor 微服务架构(Docker + 测试 + Kubernetes)
linux·python·docker·微服务·k8s·tornado
-指短琴长-11 小时前
Docker基础【Ubuntu安装/Windows安装】
windows·ubuntu·docker
Z_Xshan12 小时前
docker 容器web站点 中文文件名访问404问题
linux·开发语言·docker
回忆是昨天里的海12 小时前
k8s集群-节点间通信之安装kube-flannel插件
java·docker·kubernetes
ZHE|张恒14 小时前
Docker 安装 MinIO(20250422)
运维·docker·容器