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

相关推荐
懒人村杂货铺2 小时前
前端步入全栈第一步
前端·docker·fastapi
小白电脑技术2 小时前
简单点!异地访问Docker的方式简单点!
docker·容器·电脑
Zhen (Evan) Wang2 小时前
Docker 完整安装 Redis
redis·docker·容器
小趴菜不能喝3 小时前
Docker Swarm
运维·docker·容器
FOREVER-Q3 小时前
《Docker Compose 部署前后端分离项目实战:Nginx + Spring Boot(含完整踩坑记录)》
运维·docker·容器
科学熊3 小时前
kubekey安装工具快速安装k8s集群
云原生·容器·kubernetes
新手村-小钻风3 小时前
Windows 环境下安装 Docker 的详细教程(超详细图文)
windows·docker·容器
黑客-小千3 小时前
【Docker】初识docker 基本概念及安装使用(巨详细版),网络安全零基础入门到精通实战教程!
网络协议·tcp/ip·web安全·网络安全·docker·容器·eureka
2501_925866163 小时前
Docker搭建HomeAssistant平台
运维·docker·容器