目录
[6.在后台持续运行 docker run 创建的容器](#6.在后台持续运行 docker run 创建的容器)
[1.Docker 网络实现原理](#1.Docker 网络实现原理)
[3.1 CPU 资源控制](#3.1 CPU 资源控制)
[3.1.1 设置 CPU 使用率上限(--cpu-period / --cpu-quota)](#3.1.1 设置 CPU 使用率上限(--cpu-period / --cpu-quota))
[3.1.2 设置 CPU 占用比(权重 --- --cpu-shares)](#3.1.2 设置 CPU 占用比(权重 — --cpu-shares))
[3.1.3 绑定指定 CPU(--cpuset-cpus)](#3.1.3 绑定指定 CPU(--cpuset-cpus))
[3.1.4 压力测试与验证示例(CPU)](#3.1.4 压力测试与验证示例(CPU))
[3.1.5 注意事项(CPU)](#3.1.5 注意事项(CPU))
[3.2.1 --memory 与 --memory-swap 规则](#3.2.1 --memory 与 --memory-swap 规则)
[3.2.2 示例命令](#3.2.2 示例命令)
[3.2.3 验证与观察](#3.2.3 验证与观察)
[3.2.4 建议与注意](#3.2.4 建议与注意)
[3.3.1 常用 Docker 参数(blkio)](#3.3.1 常用 Docker 参数(blkio))
[3.3.2 验证(用 dd 测试写速)](#3.3.2 验证(用 dd 测试写速))
[3.3.3 注意事项(blkio)](#3.3.3 注意事项(blkio))
[3.4清理 Docker 占用的磁盘空间(补充)](#3.4清理 Docker 占用的磁盘空间(补充))
[3.1.2 在数据卷中写入数据](#3.1.2 在数据卷中写入数据)
[3.1.3 查看宿主机的数据](#3.1.3 查看宿主机的数据)
[3.2.1 创建数据卷容器](#3.2.1 创建数据卷容器)
[3.2.2 在数据卷容器中写入数据](#3.2.2 在数据卷容器中写入数据)
[3.2.4 在新容器中查看数据](#3.2.4 在新容器中查看数据)
[3.3 总结](#3.3 总结)
[4.1 随机端口映射](#4.1 随机端口映射)
[4.2 指定端口映射](#4.2 指定端口映射)
[4.3 总结](#4.3 总结)
[五、容器互联(使用 CentOS 镜像)](#五、容器互联(使用 CentOS 镜像))
[5.1 创建并运行源容器 web1](#5.1 创建并运行源容器 web1)
[5.2 创建并运行接收容器 web2](#5.2 创建并运行接收容器 web2)
[5.3 在接收容器 web2 中测试连接](#5.3 在接收容器 web2 中测试连接)
一、基础命令
1.创建容器

2.启动容器
docker start 容器的ID/名称
3.停止容器
docker stop 容器的ID/名称
4.查看容器状态
docker ps:查看正在运行的容器。
docker ps -a:查看所有容器,包括已停止的容器。
5.创建并启动容器

当利用 docker run 来创建容器时, Docker 在后台的标准运行过程是:
- Dockers引擎会在本地查找镜像
- 本地找到镜像 然后启动镜像
- 本地没有找到镜像,然后根据Docker引擎配置的仓库地址,远程去查找镜像。
- 远程查询到镜像,把镜像下载到本地,然后启动镜像
- 远程查询到镜像,Docker返回错误,提示镜像远程未找到。
- 运行中的镜像支持:停止、启动、重启、删除(先停止才可以删除)操作

6.在后台持续运行 docker run 创建的容器
需要在 docker run 命令之后添加 -d 选项让 Docker 容器以守护形式在后台运行。并且容器所运行的程序不能结束
docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
docker run -itd --name test1 centos:7 /bin/bash #创建容器并持续运行容器
docker容器的生命周期

暂停和停止状态的区别
docker pause 命令挂起指定容器中的所有进程
docker stop 容器内主进程会在指定时间内被杀死,默认为10s后。
7.容器交互
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器
docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
docker run -it centos:7 bash #不加 -d 选项会创建容器后直接进入容器,但是退
出容器,容器也会停止
8.容器复制
宿主机 > 容器
docker cp ~/test.txt 2592d3fad0fb:/opt/
容器 > 宿主机
docker cp 2592d3fad0fb:/opt/test.txt ~/abc123.txt
9.容器的导出与导入
用户可以将任何一个 Docker 容器从一台机器迁移到另一台机器。在迁移过程中,可以使用docker
export 命令将已经创建好的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导
出。可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
导出:
docker export 2592d3fad0fb > centos7.tar
导入:
cat centos7.tar | docker import - centos7:test #导入后会生成镜像,但不会创建容器
10.删除容器
格式:docker rm [-f] 容器ID/名称
docker stop 2592d3fad0fb
docker rm 2592d3fad0fb #删除已经终止状态的容器
docker stop $(docker ps -q) #批量停止
docker rm $(docker ps -aq) #批量删除容器
docker rmi $(docker images -aq) #批量删除镜像
二、网络管理
1.Docker 网络实现原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP 直接通信。


2.总结
1. 桥接模式(bridge)
默认的网络模式,容器通过虚拟网桥与宿主机和其他容器通信。
2. 主机模式(host)
容器共享宿主机的网络栈,直接使用宿主机的 IP 地址。
3. 容器模式(container)
容器共享另一个容器的网络栈,两个容器可以使用相同的 IP 地址进行通信。
4. 无网络模式(none)
容器没有网络配置,只有回环接口(lo)。
5. 自定义网路
定义网络允许用户自定义容器的网络范围、子网和路由,从而提供更高的网络控制和隔离性。
3.资源限制
3.1 CPU 资源控制
3.1.1 设置 CPU 使用率上限(--cpu-period / --cpu-quota)
- **原理:**Linux 使用 CFS(Completely Fair Scheduler)。通过两个参数控制:
- cpu.cfs_period_us(周期,微秒)和 cpu.cfs_quota_us(配额,微秒)。
- quota / period = 可用 CPU 核心数的 小数 表示(相对于 1 个 CPU)。
- 默认 period = 100000(100 ms)。quota = -1 表示不限制。
- 示例: 限制容器为 50% 的一个 CPU:
docker run -itd --name test6 --cpu-quota 50000 centos:7 /bin/bash 0.5
- 注意:如果宿主机有 4 个逻辑核,那么 0.5 个 CPU ≈ 0.5 / 4 = 0.125(即 12.5% 的整机 CPU 能力)。
- (计算示例:50000/100000 = 0.5;0.5/4 = 0.125 → 12.5%)
- 最小值/范围:--cpu-period 有效范围通常 1000 ~ 1000000(单位 us)。--cpu-quota 必须 >= 1000(1 ms)或者 -1(不限制)。
- 另一种更直观的写法:
docker run -itd --name cputest --cpus="0.5" centos:7 /bin/bash
--cpus=0.5 是 --cpu-quota/ --cpu-period 的友好封装(要求较新版本 Docker)。
3.1.2 设置 CPU 占用比(权重 --- --cpu-shares)
- 原理: --cpu-shares 指定相对权重(默认 1024),仅在 CPU 争用时生效(不是硬限制)。
- 举例:两个容器 c1、c2,--cpu-shares 512 与 --cpu-shares 1024,在争用情况下 CPU 分配比约为 1:2。
- 示例:
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
- **验证:**运行压力程序(stress -c N)后用 docker stats 观察 CPU % 倾向于 1:2(随系统负载和核心数而变化)。
3.1.3 绑定指定 CPU(--cpuset-cpus)
- **用途:**把容器进程绑定到宿主机的指定 CPU 核上(硬亲和性)。
- **示例:**将容器绑定到第 1 和第 3 个核:
docker run -itd --name test7 --cpuset-cpus "1,3" centos:7 /bin/bash
- **验证:**在宿主机运行 top 或 htop(按 1)查看各核利用率,或进入容器运行 taskset -p <pid>。
3.1.4 压力测试与验证示例(CPU)
- 在容器内创建一个繁忙循环脚本:

- 在容器内运行
./cpu.sh,在宿主机观察top与docker stats:

- 分别进入容器,进行压力测试

- 修改
cgroups手工测试(示例):

3.1.5 注意事项(CPU)
-m, --memory:限制容器可用的物理内存(例如 -m 512m)。
--memory-swap:限制容器可用的物理内存 + swap 总量(必须与 -m 一起使用以明确 swap 上
限)
3.2.1 --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.2.2 示例命令

3.2.3 验证与观察
- 使用
docker stats观察MEM USAGE / LIMIT。 - 在宿主机查看 cgroup:

- OOM 行为:如果容器超过允许内存且没有 swap 或无更多内存可用,会被内核 OOM killer 杀掉。可查看容器日志与 dmesg 来确认 OOM 事件。
3.2.4 建议与注意
- 为生产服务设置合理内存限制,避免单容器把宿主机内存耗尽。
- 对于内存敏感的应用,建议同时设置
-m与--memory-swap,并配合健康检查/重启策略。 - 在 cgroup v2 环境下内存控制文件名/行为可能与 v1 略有不同(检查
/sys/fs/cgroup结构)。
说明
- Docker 提供对块设备读写带宽与 IOPS 的限制选项(基于 cgroups 的 blkio 控制器)。
- 注意:在 cgroup v2 中,blkio 功能被 io 控制器取代,语义与文件名有所不同(如果你运行的是较新内核/系统,请参考对应 cgroup 版本文档)。
3.3.1 常用 Docker 参数(blkio)
--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
3.3.2 验证(用 dd 测试写速)
- 在容器内执行写入测试,使用 oflag=direct 跳过文件系统缓存:
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
输出示例说明:10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s → 写速被限为约 1
MB/s。
3.3.3 注意事项(blkio)
- 限制需要指定具体块设备路径(如 /dev/sda)。错误的设备路径不会生效。
- 在虚拟化环境或云盘(如 EBS、云盘快照)上,底层 IO 性能由云提供商或 hypervisor 决定,容器层设置可能受限。
- 在 cgroup v2 上,对 IO 的控制接口为 io.max 等,需要使用不同的工具/路径来配置验证。
3.4清理 Docker 占用的磁盘空间(补充)
- 清理未使用的数据(可释放磁盘空间):
docker system prune -a
- 该命令会删除停止的容器、未使用的镜像、未使用的网络和构建缓存(要谨慎使用,会删除很多资源)。
3.5常见命令速查(快速摘录)

-v /var/www:/data1:将宿主机上的/var/www目录挂载到容器中的/data1目录。这样容器内 /data1 的修改会同步到宿主机上的/var/www。--name web1:给容器指定一个名称web1。-it centos:7 /bin/bash:使用centos:7镜像启动容器并进入交互式 shell。
3.1.2 在数据卷中写入数据
进入容器后,可以在 /data1 目录下创建文件:
echo "this is web1" > /data1/abc.txt
此时,容器中的 /data1/abc.txt 文件与宿主机中的 /var/www/abc.txt 文件是同步的。即使容器退
出,宿主机上的数据依然存在。
3.1.3 查看宿主机的数据
退出容器后,返回宿主机查看数据是否已成功同步:
cat /var/www/abc.txt
你应该能看到容器中写入的数据内容:this is web1
3.2数据卷容器
数据卷容器是一种专门用于共享数据的容器,它不是用于运行应用程序的容器,而是仅仅提供一个数据
卷,供其他容器挂载并使用。这种方式常用于多个容器共享数据,避免数据丢失或重复管理。
3.2.1 创建数据卷容器
首先,创建一个数据卷容器 web2,并挂载多个数据卷:
docker run --name web2 -v /data1 -v /data2 -it centos:7 /bin/bash
--name web2: 给容器命名为 web2。
-v /data1 -v /data2: 在容器内部挂载了两个数据卷 /data1 和 /data2。这些数据卷不依赖于
宿主机,而是仅仅存在于容器内。
3.2.2 在数据卷容器中写入数据
进入 web2 容器后,可以在 /data1 和 /data2 目录下写入数据:
echo "this is web2" > /data1/abc.txt
echo "THIS IS WEB2" > /data2/ABC.txt
现在,web2 容器内的 /data1/abc.txt 和 /data2/ABC.txt 文件已经被创建。
3.2.4 在新容器中查看数据
进入 web3 容器后,查看 web2 容器中的数据:
cat /data1/abc.txt
cat /data2/ABC.txt
你应该能看到如下输出:
this is web2
THIS IS WEB2
这表明 web3 容器成功挂载了 web2 容器中的数据卷,并能够访问其中的文件。
3.3 总结
- **数据卷 (Data Volumes)**是容器中的特殊目录,用于持久化存储数据。它可以通过宿主机的目录进行挂载,实现容器与宿主机之间的数据共享。
- 数据卷容器 (Data Volumes Containers) 允许容器之间共享数据卷,避免每个容器都需要挂载宿主机目录。使用 --volumes-from 可以让多个容器共享同一数据卷。
四、端口映射
在 Docker 中,容器内部运行的服务默认是不能被外部网络访问的。如果需要让外部网络能够访问容器
中的服务,就需要使用端口映射机制。端口映射将宿主机的端口映射到容器内的端口,从而使得外部网
络能够通过访问宿主机的端口,进而访问容器内的服务。
4.1 随机端口映射
如果不指定端口,Docker 会自动为容器的服务分配一个随机端口(通常从 32768 开始)。这种方式适
用于无需指定端口号的场景。
命令示例:
docker run -d --name test1 -P nginx
-P: 自动将容器内部暴露的端口映射到宿主机上的随机端口。nginx:使用nginx镜像启动容器。
运行后,可以通过 docker ps -a 查看容器的状态,特别是端口映射信息:
docker ps -a

此时,test1 容器内部的端口 80 被映射到宿主机的端口 49170。你可以通过浏览器访问:
4.2 指定端口映射
如果你希望容器内的服务映射到宿主机上的指定端口,可以使用 -p 选项手动指定端口映射。
命令示例:
docker run -d --name test2 -p 43000:80 nginx
- -p 43000:80: 将宿主机的端口 43000 映射到容器内的端口 80。这意味着你可以通过访问宿主机的 43000 端口来访问容器中的 Nginx 服务。
运行后,通过 docker ps -a 查看容器的状态,特别是端口映射信息:
docker ps -a

此时,test2 容器内部的端口 80 被映射到宿主机的端口 43000。你可以通过浏览器访问:
4.3 总结
- 随机端口映射:使用 -P 选项,Docker 会自动为容器暴露的端口分配一个随机的宿主机端口,适用于无需手动指定端口的情况。
- 指定端口映射:使用 -p <宿主机端口>:<容器端口> 的格式,手动指定宿主机和容器之间的端口映射关系,适用于需要明确指定端口的场景。
通过端口映射,容器内的服务可以轻松暴露给外部网络,供外界访问。
首先,创建并运行源容器 web1,它将作为通信的源容器。使用 CentOS 镜像启动容器,并让容器在后
台运行:
docker run -itd -P --name web1 centos:7 /bin/bash
-itd: 启动容器并使其在后台运行。-P: 随机映射容器的端口到宿主机。--name web1: 给容器指定一个名称 web1。centos:7: 使用 CentOS 7 镜像启动容器。/bin/bash: 启动后进入容器的 bash shell。
五、容器互联(使用 CentOS 镜像)
容器互联是一种让容器之间能够通过网络相互通信的机制。通过在容器间建立网络通信隧道,源容器和接收容器可以互相看到对方的指定信息。Docker 提供了 --link 选项来实现容器互联,在一个容器中可以通过另一个容器的名称来访问它。
5.1 创建并运行源容器 web1
首先,创建并运行源容器 web1,它将作为通信的源容器。使用 CentOS 镜像启动容器,并让容器在后台运行:
docker run -itd -P --name web1 centos:7 /bin/bash
-itd: 启动容器并使其在后台运行。-P: 随机映射容器的端口到宿主机。--name web1: 给容器指定一个名称 web1。centos:7: 使用 CentOS 7 镜像启动容器。/bin/bash: 启动后进入容器的 bash shell。
5.2 创建并运行接收容器 web2
接下来,创建并运行接收容器 web2,并使用 --link 选项来连接容器 web1,从而实现容器间的通信。
docker run -itd -P --name web2 --link web1:web1 centos:7 /bin/bash
- --link web1:web1: 通过 --link 选项连接 web1 容器,将 web1 容器暴露给 web2 容器,并在web2 中将 web1 显示为别名 web1。这样 web2 容器就可以通过 web1 访问源容器的信息。
5.3 在接收容器 web2 中测试连接
进入容器 web2,然后尝试 ping web1 容器,验证是否可以与 web1 容器通信:
docker exec -it web2 bash
ping web1
- docker exec -it web2 bash: 进入 web2 容器的 bash 环境。
- ping web1: 测试 web2 是否能与 web1 通信。
如果连接成功,说明容器互联配置正确。
5.4总结
- **源容器:**通过 docker run 启动,并通过 --name 指定一个唯一名称,例如 web1。
- **接收容器:**通过 docker run 启动,并通过 --link 选项将其与源容器 web1 连接。--link 会将源容器暴露为别名,接收容器可以通过该别名与源容器进行通信。
- **容器间通信:**接收容器可以通过源容器的名称进行通信,如在 web2 中通过 ping web1 测试与 web1 的连通性。
这种容器互联的方式适用于简单的容器间网络通信,但在较复杂的场景中,建议使用 Docker 网络(如桥接网络或自定义网络)来管理容器间的通信。