Docker 容器操作 【docker (二)】

目录

一、基础命令

1.创建容器

2.启动容器

3.停止容器

4.查看容器状态

5.创建并启动容器

[6.在后台持续运行 docker run 创建的容器](#6.在后台持续运行 docker run 创建的容器)

7.容器交互

8.容器复制

9.容器的导出与导入

10.删除容器

二、网络管理

[1.Docker 网络实现原理](#1.Docker 网络实现原理)

2.总结

3.资源限制

[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.5常见命令速查(快速摘录)

[3.1.2 在数据卷中写入数据](#3.1.2 在数据卷中写入数据)

[3.1.3 查看宿主机的数据](#3.1.3 查看宿主机的数据)

3.2数据卷容器

[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 中测试连接)

5.4总结


一、基础命令

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,在宿主机观察 topdocker 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。你可以通过浏览器访问:

http://192.168.80.10: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。你可以通过浏览器访问:

http://192.168.80.10: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 网络(如桥接网络或自定义网络)来管理容器间的通信。

相关推荐
C_心欲无痕11 小时前
Docker 的镜像与容器
运维·docker·容器
Mr. Cao code11 小时前
Docker匿名数据卷实战指南
运维·ubuntu·docker·容器
HehuaTang12 小时前
requests 调大并对齐 limits 提升POD高负载场景下性能
java·docker·kubernetes
星辰&与海12 小时前
Docker 资源调度限制
docker
座山雕~15 小时前
docker---部署与常用命令
运维·docker·容器
TroubleBoy丶17 小时前
麒麟V10-ARM架构Docker启动报错
运维·docker·容器·arm·麒麟v10
2301_7873284918 小时前
49.k8s集群部署
云原生·容器·kubernetes
陈平安Java and C20 小时前
Docker File部分镜像制作实操
docker
螺旋小蜗20 小时前
docker-compose文件属性(3)顶部元素networks
运维·docker·容器
ICT董老师21 小时前
Kubernetes从私有镜像仓库拉取容器镜像时的身份验证
ubuntu·docker·云原生·容器·kubernetes