前言

随着容器化技术的普及,Docker 已成为开发和运维领域不可或缺的工具。掌握 Docker 的资源管理机制和容器互联方法,对于构建高效、稳定的容器化应用至关重要。本文将系统介绍 Docker 的 CPU、内存、磁盘 IO 资源控制,数据卷管理,端口映射以及容器互联等核心功能,帮助读者全面理解 Docker 的资源隔离与共享机制。


速查

# 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 run -it --name iotest --device-read-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 run --cpu-period 100000 #(范围1000 ~ 1000000(单位us)默认值10000) 一个CPU的周期
		   --cpu-quote 50000  #0.5个CPU,50000/100000,使用cpu资源的上限
		   --cpu-shares 1024 #在运行多个容器时且资源紧缺时有效设置,权重
				  	    2048
		   --cpu-cpuset #cpu硬件亲和,cpu0,2或cpu1,3(0~n)
		   -m 512M #内存上限
		   --memory-swap 1G  #交换卷内存 ,物理300M,swap700M 1G/0/-1 = -m同值 如果你设置swap1G 物理内存占用300M
		   --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 -P ... #随机端口
		   -p 宿主机端口:容器端口 ...

#卷挂载
#绑定挂载
docker run -v 宿主机目录:容器数据卷目录 ... #要用绝对路径
#绑定数据卷容器
docker run --name  -v /data1 -v /data2 ...
docker run --volume-from 数据卷容器名 ...
#命名卷卷挂载
docker volume create 卷名
docker run -v 挂载卷名:容器数据目录 ...
docker volume rm 卷名
docker volume list
docker volume inspect 卷名
#使用link进行单向连接,已弃用
docker run --link 容器名:连接名


一、资源限制

1.1 CPU 资源控制

1.1.1 概述(cgroups)

cgroups(Control Groups)是 Linux 内核提供的资源控制机制,对容器非常重要。它主要提供四大功能:

  • 资源限制:限制任务使用的总资源量
  • 优先级分配:通过 CPU 时间片和 IO 带宽分配优先级
  • 资源统计:统计 CPU 时长、内存用量等
  • 任务控制:对 cgroup 中的进程执行挂起/恢复等操作

Docker 通过 cgroups 来实现 CPU、内存、IO 等资源的限制与度量。

1.1.2 设置 CPU 使用率上限

通过 --cpu-period--cpu-quota 参数控制 CPU 使用率:

原理:Linux 使用 CFS(Completely Fair Scheduler),通过 cpu.cfs_period_us(周期,微秒)和 cpu.cfs_quota_us(配额,微秒)两个参数控制。

  • quota / period = 可用 CPU 核心数的小数表示
  • 默认 period = 100000(100 ms),quota = -1 表示不限制

示例:限制容器为 50% 的一个 CPU:

docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash

解释:50000 / 100000 = 0.5 → 相当于 0.5 个 CPU(即 50% 的单核)

更直观的写法

docker run -itd --name cputest --cpus="0.5" centos:7 /bin/bash

在这里插入图片描述

1.1.3 设置 CPU 占用比(权重)

通过 --cpu-shares 指定相对权重(默认 1024),仅在 CPU 争用时生效:

示例

docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7

在争用情况下,CPU 分配比约为 1:2。
在这里插入图片描述

1.1.4 绑定指定 CPU

使用 --cpuset-cpus 将容器进程绑定到宿主机的指定 CPU 核上:

示例:将容器绑定到第 1 和第 3 个核:

docker run -itd --name test7 --cpuset-cpus "1,3" centos:7 /bin/bash

1.1.5 压力测试与验证

在容器内创建 CPU 压力测试脚本:

#!/bin/bash
i=0
while true; do let i++; done

或在容器内安装 stress 工具:

yum install -y epel-release
yum install -y stress
stress -c 4

1.1.6 修改 cgroups 手工测试

# 找到容器对应的 cgroup 路径(容器ID替换)
cd /sys/fs/cgroup/cpu/docker/<container-id>/
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
echo 50000 > cpu.cfs_quota_us   # 设置配额(临时生效)

1.1.7 注意事项

  • --cpu-shares 是权重,不是限额。
  • --cpu-quota/--cpu-period 是硬限制(quota = -1 表示无限制)。
  • 使用 --cpuset-cpus 能提高性能稳定性(避免与其他进程抢核)。
  • 在多核宿主机上理解 quota/period 的含义(单位是 “相对于 1 个 CPU 的份额”)。

1.2 内存使用限制

1.2.1 基础选项

  • -m, --memory:限制容器可用的物理内存(例如 -m 512m
  • --memory-swap:限制容器可用的物理内存 + swap 总量

1.2.2 内存限制规则

示例:-m 300m --memory-swap=1g

  • 物理内存:300 MB
  • 物理 + swap 总共:1 GB → swap 可用:700 MB

默认行为:若不设置 --memory-swap,通常容器可使用的 swap 为 -m 值的两倍(行为可能随 Docker 版本/配置变化)。

特殊值:

  • --memory-swap = -1:swap 不受限制(宿主机可用多少 swap 就用多少)
  • --memory-swap = -m:容器不能使用 swap(物理内存用尽会触发 OOM)

1.2.3 示例命令

docker run -itd --name test8 -m 512m centos:7 /bin/bash
# 或者设置 swap 总额
docker run -itd --name test8b -m 300m --memory-swap=1g centos:7

1.2.4 验证与观察

  • 使用 docker stats 观察 MEM USAGE / LIMIT
    在这里插入图片描述

  • 在宿主机查看 cgroup:

    cd /sys/fs/cgroup/memory/docker/<container-id>/
    cat memory.limit_in_bytes
    cat memory.usage_in_bytes
    

    在这里插入图片描述

  • OOM 行为:如果容器超过允许内存且没有 swap 或无更多内存可用,会被内核 OOM killer 杀掉。可查看容器日志与 dmesg 来确认 OOM 事件。

1.2.5 建议与注意

  • 为生产服务设置合理内存限制,避免单容器把宿主机内存耗尽。
  • 对于内存敏感的应用,建议同时设置 -m--memory-swap,并配合健康检查/重启策略。
  • 在 cgroup v2 环境下内存控制文件名/行为可能与 v1 略有不同(检查 /sys/fs/cgroup 结构)。
  • swap治标不治本,如果内存经常不够还是需要增加内存

1.3 磁盘 IO 控制

Docker 提供对块设备读写带宽与 IOPS 的限制选项(基于 cgroups 的 blkio 控制器)。
注意:在 cgroup v2 中,blkio 功能被 io 控制器取代,语义与文件名有所不同(如果你运行的是较新内核/系统,请参考对应 cgroup 版本文档)。


1.3.1 常用参数

  • --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

1.3.2 示例与验证

docker run -it --name test10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash

修改 GRUB 配置(Linux)
当使用centos7但是docker 26.x时,会出现--device-write-bps无法起效的情况,因为在Docker 26+ 开始逐步迁移到 ​cgroup v2,部分功能在 ​cgroup v1​ 下可能不再完全兼容。如果系统仍然是 ​cgroup v1,某些新参数(如 --device-write-bps)可能无法正确应用。因此如果想在centos7使用--device-write-bps,有以下方法:

  • 手动设置 cgroup v1 的限制(适用于 Docker 26 + cgroup v1)​

注意:需要在容器运行时使用

# 获取容器 ID
CID=$(docker inspect -f '{{.Id}}' test10)

# 找到 /dev/sda 的主次设备号(如 8:0)
DEVICE_MAJOR_MINOR=$(lsblk -d -o MAJ:MIN /dev/sda | tail -n 1)

# 手动设置写入限制(1MB/s = 1048576 bytes/s)
echo "$DEVICE_MAJOR_MINOR 1048576" | sudo tee /sys/fs/cgroup/blkio/docker/$CID/blkio.throttle.write_bps_device
  • 使用docker20.x

使用 dd 测试写速:

dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

在这里插入图片描述

1.3.3 注意事项

  • 限制需要指定具体块设备路径(如 /dev/sda)。错误的设备路径不会生效。
  • 在虚拟化环境或云盘(如 EBS、云盘快照)上,底层 IO 性能由云提供商或 hypervisor 决定,容器层设置可能受限。
  • 在 cgroup v2 上,对 IO 的控制接口为 io.max 等,需要使用不同的工具/路径来配置验证。

1.4 清理磁盘空间

清理未使用的数据(可释放磁盘空间):

docker system prune -a

该命令会删除停止的容器、未使用的镜像、未使用的网络和构建缓存(要谨慎使用,会删除很多资源)。

1.5 常见陷阱与建议

  • 理解权重 vs 限额--cpu-shares = 权重(争用时生效);--cpu-quota/--cpus = 硬限制。
  • cgroup v1 vs v2:不同内核/发行版可能使用不同 cgroup 版本,相关文件/控制器名会不同(例如 blkio ↔ io)。CentOS7 默认通常是 cgroup v1。
  • IO 限制依赖底层设备:在云/虚拟机上测试时,注意底层虚拟磁盘的行为。
  • 生产环境:建议配合监控(Prometheus + cAdvisor / node-exporter)来持续观察容器资源使用情况并调优。
  • 权限:修改 /sys/fs/cgroup/* 需要 root 权限;Docker run 的限制设置通常更简单、安全。

二、数据卷容器

2.1 数据卷

数据卷是 Docker 实现持久化存储的核心机制。作为容器内的特殊目录,它支持与宿主机或其他容器共享数据。使用数据卷后,容器可以安全地读写数据,而不会对原始镜像造成影响。这种设计确保了数据的持久性 - 即使容器被删除或重建,存储的数据依然完好无损。

2.1.1 创建与挂载数据卷

使用 docker run 命令启动一个容器时,可以通过 -v--mount 选项将宿主机的目录挂载到容器中的数据卷。下面是一个简单的例子:

docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
#不存在的宿主机目录会自动创建

在这里插入图片描述

  • -v /var/www:/data1: 将宿主机上的 /var/www 目录挂载到容器中的 /data1 目录。这样容器内 /data1 的修改会同步到宿主机上的 /var/www
  • --name web1: 给容器指定一个名称 web1
  • -it centos:7 /bin/bash: 使用 centos:7 镜像启动容器并进入交互式 shell。

2.1.2 数据写入与验证

echo "this is web1" > /data1/abc.txt
cat /var/www/abc.txt

此时,容器中的 /data1/abc.txt 文件与宿主机中的 /var/www/abc.txt 文件是同步的。即使容器退出,宿主机上的数据依然存在。也就是说实现了容器内数据的持久化,这是一种直接的绑定挂载,但为了方便管理,业务上更多使用的是命名卷挂载的方法。

2.2 命名卷

2.2.1 数据卷容器(Data Volume Container) - “旧方法”

定义:一个数据卷容器本身并不运行应用程序,它唯一的用途是创建一个或多个数据卷,然后让其他容器通过 --volumes-from 选项来挂载这些卷。

工作方式

  1. 创建卷容器:创建一个容器(通常使用 --name my-data-container),并定义一些卷(-v /data)。这个容器可以随时停止或退出,只要不删除它就行。
  2. 其他容器挂载:新的应用容器使用 --volumes-from my-data-container 来挂载这个“卷容器”中定义的所有卷。

示例

# 1. 创建一个数据卷容器,并定义两个数据卷
docker create -v /dbdata -v /config --name my-volume-container centos:7

# 2. 应用容器(如数据库)通过 --volumes-from 挂载这些卷
docker run -d --name mysql-app --volumes-from my-volume-container mysql:5.7

# 3. 备份容器也可以挂载同一个卷进行备份
docker run --rm --volumes-from my-volume-container -v $(pwd):/backup centos:7 tar czf /backup/backup.tar.gz /dbdata

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

  • 抽象层:它本身是对数据卷的一种管理方式,提供了一个命名的引用点。
  • 依赖容器:卷的生命周期与这个“卷容器”绑定。如果删除了该容器,卷不会自动删除(除非使用 docker rm -v),但管理起来很麻烦。
  • 已弃用:Docker 官方不再推荐使用 --volumes-from

2.2.2 命名卷(Named Volumes) - “新方法”

定义:由 Docker 直接管理的、具有唯一名称的卷。它是 Docker 卷系统的一等公民。

工作方式

  1. 创建卷:使用 docker volume create 或直接在 docker run -v 时指定一个名称。
  2. 容器挂载:容器直接通过名称挂载这个卷。

示例

# 方法1:预先创建命名卷,然后绑定
docker volume create nginx1
# 方法2:在运行容器时直接创建(更常用)
docker run -d -v nginx1:/var/lib/nginx --name nginx1 nginx

在这里插入图片描述

# 备份:运行一个临时容器,同时挂载命名卷和宿主机目录
docker run --rm -v nginx1:/source -v $(pwd):/backup alpine tar czf /backup/nginx.bak.tar.gz -C /source .

docker run --rm \            #备份完成后删除镜像
  -v nginx1:/source \         # 挂载命名卷到容器的 /source
  -v $(pwd):/backup \        # 挂载当前目录到容器的 /backup
  alpine \                   # 使用轻量级 alpine 镜像
  tar czf /backup/nginx.bak.tar.gz -C /source .  # 必须要加打-C,如果不加 -C /source,打包时会包含 /source/这个绝对路径,导致解压时强制创建 /source目录

在这里插入图片描述

# 查看所有命名卷
docker volume list

在这里插入图片描述

# 显示指定卷名的详细信息
docker volume inspect nginx

在这里插入图片描述

# 仅删除未被任何容器引用的悬空卷,不会删除使用docker volume create创建的命名卷
docker volume prune
# 删除​所有未被容器使用的卷,会删除使用docker volume create创建的命名卷
docker volume prune -a

特点

  • 一等公民:卷是独立于容器的对象,由 Docker 的 Volume API 直接管理。
  • 生命周期独立:删除容器不会删除命名卷,需要显式使用 docker volume rm 命令。
  • 易于管理:可以使用 docker volume ls, docker volume inspect, docker volume prune 等命令进行管理。
  • 可移植性:是 Docker Compose 和 Swarm 中数据管理的推荐方式。
  • 支持驱动:可以使用不同的卷驱动(如 local, nfs, sshfs 等)来将数据存储在远程。

核心关系:演变与替代

特性数据卷容器(旧)命名卷(新)关系说明
本质一个容器,其内部定义了匿名卷或绑定挂载一个由 Docker 管理的独立对象命名卷将“数据”的概念从“容器”中彻底分离出来。
创建方式docker create -v /path ...docker volume create <name>-v <name>:/path命名卷的创建方式更直接、意图更明确。
挂载方式--volumes-from <container_name>-v <volume_name>:/path/in/container命名卷的挂载不依赖任何其他容器,降低了耦合度。
生命周期管理与容器生命周期纠缠,容易误删独立的生命周期,管理命令清晰这是最大的进步。命名卷的生命周期管理简单可靠。
官方推荐已弃用强烈推荐命名卷是现代 Docker 数据管理的标准答案。
在 Docker Compose 中的体现不直接支持,需要额外定义容器volumes: 顶级键中直接定义Compose 的设计哲学就是基于命名卷的。

数据卷容器可以看作是“命名卷”出现之前的一种过渡方案或工作区(Workaround)。它的目的是为了给数据卷一个易于引用的名字(即容器名),从而实现数据在多个容器间的共享。

然而,Docker 官方意识到了这种模式的笨拙和容易出错的问题,于是引入了命名卷作为一等公民。命名卷完美地实现了数据卷容器的所有目标(命名的、可共享的、持久化的数据),同时提供了更清晰、更安全、更强大的管理方式。

现代最佳实践

停止使用数据卷容器和 --volumes-from。对于需要在容器间共享的持久化数据,一律使用命名卷

  • 场景1:单个容器需要持久化数据 -> 使用命名卷。
  • 场景2:多个容器需要共享同一份数据(如 Web 应用容器和备份容器) -> 让这些容器都挂载同一个命名卷。
  • 场景3:使用 Docker Compose -> 在 volumes 部分定义命名卷,然后在服务中引用。

三、端口映射

3.1 随机端口映射

docker run -d --name test1 -P nginx

查看映射信息:

docker ps -a

3.2 指定端口映射

docker run -d --name test2 -p 43000:80 nginx

四、容器互联

4.1 创建源容器

docker run -itd -P --name web1 centos:7 /bin/bash

4.2 创建接收容器并互联

docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash

4.3 测试连接

docker exec -it web2 bash
ping web1

由于这些原因,–link也已经被官方标记为弃用,现在更推荐使用自定义网络模式来进行容器间的互联
单主机限制​:只能在单个 Docker 主机内工作
​手动维护​:需要显式指定链接关系
​功能有限​:仅提供基础的网络连通性和环境变量注入
​易出错​:容器启动顺序敏感

五、Docker 镜像的创建

  • 镜像分层:Docker 镜像不是单一文件,而是由多层文件系统组成。每执行一条 Dockerfile 指令,都会生成新的镜像层。容器启动时会在镜像的只读层上添加一层可读写层。
  • 镜像缓存:Docker 会缓存每一层的镜像,如果某一层的内容没有变化,则会复用缓存层,以提高构建效率。
  • UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。 AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。Union文件系统是Docker镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
    • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。我们下载的时候看到的一层层的就是联合文件系统。

镜像加载原理

Docker镜像采用分层文件系统结构,这种层级架构基于UnionFS技术实现

镜像的最底层是bootfs,其构成与标准Linux/Unix系统相同,包含bootloader和内核。bootloader负责引导加载内核,Linux系统启动时会首先加载bootfs。当内核完成加载后,bootfs会被卸载,内存控制权转交给内核运行。

位于bootfs之上的是rootfs层,包含典型的Linux系统目录结构,如/dev、/proc、/bin、/etc等。不同操作系统发行版(如Ubuntu、CentOS)的差异主要体现在rootfs层。

我们可以这样理解镜像构建过程:初始状态下内核是空的,通过下载debian基础镜像会在内核上叠加第一层;安装emacs工具会叠加第二层;安装apache服务则形成第三层。最终这些层级共同构成容器的完整rootfs文件系统,在Docker中称为镜像。

需要注意的是,镜像的所有分层默认都是只读状态。当实例化容器时,Docker会在这些只读层之上创建一个新的可读写层,使容器能够进行修改操作。
在这里插入图片描述

5.1 基于现有镜像创建

5.1.1 启动容器并修改

  1. 首先,通过 docker create 启动一个容器并进入其 bash 环境:

    docker create -it centos:7 /bin/bash
    

    -it 参数表示交互式运行,/bin/bash 表示启动 bash shell。

  2. 查看当前容器的状态:

    docker ps -a
    
  3. 修改容器内部的环境(例如安装软件包、修改配置文件等),然后退出容器。

5.1.2 提交为新镜像

docker commit -m "new" -a "centos" 容器ID centos:test
  • -m: 提交说明。
  • -a: 作者信息。
  • centos:test: 创建的新镜像名称。
    在这里插入图片描述

5.2 基于本地模板创建

通过导入模板文件,可以创建一个新的镜像。模板通常可以从开源项目(如 OPENVZ)中获取。

5.2.1 下载模板

例如,下载 Debian 模板:

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

5.2.2 导入为镜像

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

5.3 基于 Dockerfile 创建

Dockerfile 是一个文本文件,其中包含了一系列的指令,每个指令创建一个新的镜像层。通过 Dockerfile,我们可以实现镜像的自动化构建。

5.3.1 Dockerfile 常用指令

  1. FROM
    指定新镜像基于的基础镜像,Dockerfile 的第一条指令必须为 FROM

    使用的基础镜像,在实际环境中基本都是系统镜像。而微服务镜像则用

    FROM centos:7
    
  2. MAINTAINER
    指定镜像的维护者信息:

    MAINTAINER "John Doe <johndoe@example.com>"
    
  3. RUN
    执行命令并将结果提交到镜像中。常用来安装软件包、依赖,修改配置等。

    尽量少叠RUN,RUN一次会叠一层会增大容量。

    RUN yum install -y httpd
    
  4. ENTRYPOINT
    设置容器启动时默认执行的命令,优先级高于CMD:

    一个dockerfile中只能有一个ENTRYPOINT可以被执行。

    ENTRYPOINT ["httpd", "-D", "FOREGROUND"]
    
  5. CMD
    容器启动时执行的默认命令。CMD 指令会被 docker run 命令后指定的命令覆盖。通常服务配置完成后才配置这个。一个dockerfile中只能有一个CMD可以被执行。

    CMD ["httpd", "-D", "FOREGROUND"]
    
  6. EXPOSE
    声明容器内的端口:

    EXPOSE 80
    
  7. ENV
    设置环境变量:

    ENV MY_VAR=my_value
    
  8. ADD
    将文件或目录从宿主机复制到镜像中,支持从 URL 下载文件,并能自动解压归档文件:

    ADD myfile.tar.gz /app
    
  9. COPY
    将本地文件或目录复制到镜像中:

    COPY . /app
    
  10. VOLUME
    在容器中创建挂载点:

    VOLUME ["/data"]
    
  11. USER
    设置容器内运行命令时的用户:

    USER root
    
  12. WORKDIR
    设置后续指令的工作目录:

    WORKDIR /app
    
  13. ONBUILD
    设置当该镜像作为基础镜像时,后续 Dockerfile 执行的命令:

    ONBUILD RUN echo "Building from base image"
    
    注意:如果用别人的基础前,先看清楚ONBUILD RUN,别被rm -rf /*了
    
  14. HEALTHCHECK
    设置容器的健康检查:

    HEALTHCHECK CMD curl --fail http://localhost:8080 || exit 1
    

5.3.2 Dockerfile 示例

FROM centos:7
LABEL maintainer="my ssh image <mgb>"
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all && \
    yum -y install openssh* net-tools lsof telnet passwd && \
    echo 'root:root123' | chpasswd && \
    sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && \
	#明确允许root登录
    sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config && \
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''&& \ 
	#-f指定密钥文件路径
	#-N ''设置空密码,避免交互式提示导致构建失败
    mkdir -p /root/.ssh && \
    chown root.root /root && \
    chmod 700 /root/.ssh
EXPOSE 22
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD netstat -tuln | grep -q 22 || exit 1

在这里插入图片描述

在这里插入图片描述

5.3.3 构建镜像

docker build -t httpd:centos .

总结

Docker 提供了完善的资源管理机制,通过 cgroups 实现 CPU、内存、磁盘 IO 的精细控制。数据卷和端口映射功能使得容器能够持久化存储数据并与外部网络通信。容器互联机制简化了多容器应用的部署和管理。镜像创建方面,Docker 提供了多种灵活的方式,特别是基于 Dockerfile 的自动化构建,大大提高了镜像管理的效率和可重复性。

掌握这些核心功能,能够帮助开发者和运维人员更好地利用 Docker 构建高效、稳定的容器化应用,实现资源的合理分配和利用,提升应用性能和可靠性。在实际生产环境中,建议结合监控工具和自动化部署流程,充分发挥 Docker 容器化的优势。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐