引言
本指南以全链路视角拆解Docker技术栈,通过四大核心模块构建从入门到进阶的知识体系,助您系统性掌握容器化落地的关键能力。
容器生命周期管理(一)从创建、启停到资源清理,夯实容器操作的基础语法与核心场景;镜像管理(二)深入镜像的获取、构建与版本控制,打造标准化、轻量化的应用交付单元;网络与存储配置(三)破解容器间通信与数据持久化难题,搭建高可用服务架构的底层支撑;进阶操作技巧(四)则通过多容器编排、资源治理与高效调试,解锁复杂业务场景的规模化管控能力。
各章节以“场景驱动-工具解析-实践验证”为脉络,覆盖开发调试、生产部署与运维监控全流程。无论您是初探容器化的开发者,还是寻求效能突破的运维工程师,均可通过本指南构建清晰的Docker技术全景图,实现从单机实验到分布式集群的平滑过渡,最终达成敏捷交付、资源优化与系统稳定的终极目标。
最后,如果大家喜欢我的创作风格,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。
各位观众老爷,本文通俗易懂,快速熟悉Docker,收藏本文,关注up不迷路,后续将持续分享Docker纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~
文章目录
- 引言
- 一、Docker容器生命周期管理
- 1.1 容器创建与启动
- 1.1.1 `docker run` 参数详解
- 1.1.2 交互式容器与一次性任务容器
- 1.2 容器状态监控与操作
- 1.2.1 查看容器列表
- 1.2.2 容器操作命令
- 1.3 容器删除与清理
- 1.3.1 删除单个容器
- 1.3.2 批量清理停止的容器
- 二、Docker镜像管理
- 2.1 镜像的获取与存储
- 2.1.1 从Docker Hub拉取镜像 `docker pull`
- 2.1.2 导出与导入镜像 `docker save`/`docker load`
- 2.2 构建自定义镜像
- 2.2.1 `Dockerfile` 核心指令
- 2.2.2 多阶段构建优化镜像体积
- 2.3 镜像版本管理
- 2.3.1 镜像标签与版本控制 `docker tag`
- 2.3.2 删除无用镜像 `docker rmi`与`docker image prune`
- 2.4 综合示例
- 三、容器网络与存储配置
- 3.1 网络模式与通信
- 3.1.1 默认桥接网络(bridge)与主机网络(host)
- 3.1.2 自定义网络实现容器间互通
- 3.2 端口映射与数据卷
- 3.2.1 单端口映射与范围映射
- 3.2.2 持久化数据管理
- 3.3 跨容器数据共享
- 3.3.1 通过共享Volume实现数据同步
- 3.3.2 数据卷备份与迁移实践
- 四、Docker进阶操作技巧
- 4.1 多容器编排(Docker Compose)
- 4.1.1 编写 `docker-compose.yml` 定义服务
- 4.1.2 一键启动/停止多容器环境
- 4.2 资源限制与监控
- 4.2.1 限制容器内存与CPU
- 4.2.2 实时监控容器资源
- 4.3 日志与调试技巧
- 4.3.1 查看容器日志
- 4.3.2 进入容器调试
- 4.4 综合应用示例
- 往期回顾 --- 往期专栏 和 系列博文
一、Docker容器生命周期管理
容器作为Docker技术的核心载体,其生命周期的高效管理是保障应用稳定运行与资源合理调度的关键。本章将系统解析容器从创建到销毁的全流程管理,涵盖核心操作命令、状态监控技巧及资源清理策略,帮助开发者掌握容器动态管控的核心能力。
1.1 容器创建与启动
Docker 容器的核心操作是 docker run
,它用于创建并启动一个新容器。
1.1.1 docker run
参数详解
命令参数详解(完整表格总结)
参数 | 作用 | 用法示例 | 注意事项 |
---|---|---|---|
-d | 后台运行容器(守护进程模式) | docker run -d --name nginx nginx | 容器会在后台运行,需通过 docker logs 查看日志。 |
-it | 分配交互式终端(组合参数 -i + -t ) | docker run -it ubuntu /bin/bash | 退出终端默认会停止容器,按 Ctrl+P + Ctrl+Q 可退出并保持容器运行。 |
-p | 端口映射(宿主机端口:容器端口) | docker run -d -p 8080:80 nginx -p 192.168.1.100:8080:80 (指定IP) | 宿主机端口冲突会导致容器启动失败。支持 TCP/UDP(如 -p 8080:80/udp )。 |
-v | 数据卷/目录挂载(宿主机路径:容器路径) | docker run -v /宿主机/data:/容器/data nginx -v data_volume:/容器/data (命名卷) | 宿主机目录需存在,权限需与容器内一致。添加 :ro 设为只读(如 /data:ro )。 |
--name | 指定容器名称 | docker run --name my_nginx nginx | 名称需唯一,重复会报错。 |
--rm | 容器退出后自动删除 | docker run --rm alpine echo "Hello" | 适用于一次性任务,避免残留容器。 |
-e / --env | 设置环境变量 | docker run -e MYSQL_ROOT_PASSWORD=123 mysql --env-file .env (从文件读取) | 敏感信息建议通过文件传递(如 --env-file )。 |
--network | 指定容器网络模式 | docker run --network=host nginx --network=my_network (自定义网络) | host 模式直接使用宿主机网络栈,bridge 为默认桥接网络。 |
--restart | 容器退出时的重启策略 | --restart=always (总是重启) --restart=on-failure:3 (失败时最多重启3次) | 生产环境建议配置 always 或 on-failure 。 |
-m / --memory | 限制容器内存使用 | docker run -m 512m nginx (限制为512MB) | 单位支持 b 、k 、m 、g 。 |
--cpus | 限制容器使用的 CPU 核数 | docker run --cpus=1.5 nginx (使用1.5个CPU核) | 基于 Cgroups 实现,需宿主机支持。 |
--entrypoint | 覆盖镜像默认的入口命令 | docker run --entrypoint /bin/bash nginx | 优先级高于镜像的 ENTRYPOINT ,需在命令末尾指定参数。 |
--user | 指定容器内进程的运行用户 | docker run --user 1000 nginx (使用UID 1000) | 避免使用 root 用户,提升安全性。 |
--link | 连接其他容器(旧版网络互联,已不推荐) | docker run --link redis:redis_alias app | 建议使用自定义网络(如 docker network create )替代。 |
--expose | 暴露容器端口(不映射到宿主机) | docker run --expose 3306 mysql | 通常配合自定义网络使用,供其他容器访问。 |
--device | 将宿主机设备映射到容器 | docker run --device=/dev/sda:/dev/sda app | 慎用,直接访问硬件可能引发安全问题。 |
补充说明
-
组合使用示例
# 后台运行 + 端口映射 + 数据卷挂载 + 环境变量 docker run -d -p 3306:3306 \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123 \ --name mysql \ mysql:latest
-
资源限制优先级
- 若同时指定
-m
和--memory-swap
,--memory-swap
需大于-m
(如-m 500m --memory-swap=1g
)。
- 若同时指定
-
数据卷挂载类型
-
匿名卷:
-v /容器路径
(自动生成随机宿主机目录)。 -
命名卷:
-v 卷名:/容器路径
(需先通过docker volume create
创建)。
-
-
网络模式详解
-
bridge
:默认桥接网络,容器间通过 IP 通信。 -
host
:共享宿主机网络栈,性能更高但安全性降低。 -
none
:无网络,仅本地回环接口。
-
1.1.2 交互式容器与一次性任务容器
-
交互式容器(
-it
进入Shell)通过
-it
参数进入容器的交互式终端(常用于调试):docker run -it --name debug ubuntu /bin/bash
容器会启动并直接进入 Bash 终端,退出后容器会停止。
-
一次性任务容器
执行单次命令后自动退出(适合脚本任务):
docker run --rm alpine echo "Hello World"
--rm
参数表示容器执行完毕后自动删除。
1.2 容器状态监控与操作
1.2.1 查看容器列表
-
查看运行中的容器
docker ps
显示容器 ID、名称、状态、端口映射等信息。
-
查看所有容器(包括已停止的)
docker ps -a
1.2.2 容器操作命令
-
启动容器
docker start my_nginx
-
停止容器
docker stop my_nginx
(优雅停止,发送 SIGTERM 信号)
-
强制停止容器
docker kill my_nginx
(立即终止,发送 SIGKILL 信号)
-
重启容器
docker restart my_nginx
-
暂停/恢复容器
docker pause my_nginx # 暂停容器进程 docker unpause my_nginx # 恢复运行
1.3 容器删除与清理
1.3.1 删除单个容器
-
删除已停止的容器
docker rm my_nginx
-
强制删除运行中的容器
docker rm -f my_nginx
-f
参数会强制停止并删除容器。
1.3.2 批量清理停止的容器
-
清理所有已停止的容器
docker container prune
确认后会自动删除所有处于停止状态的容器。
二、Docker镜像管理
镜像是容器化技术的基石,其高效管理直接决定了应用交付的标准化程度与部署的敏捷性。本章将系统讲解镜像的全生命周期管理,涵盖镜像获取、自定义构建、版本控制及资源优化,助力开发者打造轻量化、可复用的镜像资产。
2.1 镜像的获取与存储
镜像是Docker容器的基础,管理和维护镜像是容器化开发的核心环节。
2.1.1 从Docker Hub拉取镜像 docker pull
-
作用:从镜像仓库(默认Docker Hub)下载镜像到本地。
-
语法:
docker pull [镜像名称]:[标签]
-
示例:
# 拉取Ubuntu最新版(默认标签为latest) docker pull ubuntu # 拉取指定版本(如Python 3.9) docker pull python:3.9 # 拉取Alpine轻量版Nginx docker pull nginx:alpine
-
关键点:
-
标签(Tag):标识镜像版本或变体(如
latest
、alpine
、1.23.4
)。 -
官方镜像:优先选择官方维护的镜像(如
nginx
、mysql
),而非第三方镜像。
-
2.1.2 导出与导入镜像 docker save
/docker load
-
导出镜像(保存为文件)
docker save -o [文件名.tar] [镜像名]:[标签] # 示例:导出nginx镜像 docker save -o nginx.tar nginx:alpine
- 用途:离线环境迁移或备份镜像。
-
导入镜像(从文件加载)
docker load -i [文件名.tar] # 示例:导入nginx.tar docker load -i nginx.tar
-
对比其他命令:
-
docker export
:导出容器文件系统(不包含元数据)。 -
docker import
:从容器快照创建镜像(可能丢失历史层)。
-
2.2 构建自定义镜像
注释: 关于 DockerFile 的内容,上一章节已经详细的进行讲解,请参照 Docker(三):超详细 “解剖” Dockerfile 和 多种创建容器方式,这里只进行关键步骤回忆,就不再过多进行赘述。
2.2.1 Dockerfile
核心指令
通过编写 Dockerfile
定义镜像构建步骤,常用指令如下:
指令 | 作用 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM ubuntu:20.04 |
COPY | 复制宿主机文件到镜像内 | COPY app.py /app/ |
RUN | 构建时执行命令(安装依赖、编译代码) | RUN apt-get update && apt-get install -y python3 |
CMD | 容器启动时执行的默认命令(可被覆盖) | CMD ["python3", "app.py"] |
WORKDIR | 设置工作目录(后续命令的默认路径) | WORKDIR /app |
ENV | 设置环境变量 | ENV PYTHONPATH=/app |
EXPOSE | 声明容器监听的端口(实际映射需通过 -p 参数) | EXPOSE 80 |
2.2.2 多阶段构建优化镜像体积
-
问题:直接构建可能导致镜像臃肿(包含编译工具和中间文件)。
-
方案:分阶段构建,最终仅保留运行所需文件。
-
示例:Go语言应用的多阶段构建
# 第一阶段:编译代码 FROM golang:1.18 AS builder WORKDIR /src COPY . . RUN go build -o /app # 第二阶段:仅保留二进制文件 FROM alpine:latest COPY --from=builder /app /app CMD ["/app"]
- 最终镜像仅包含Alpine和编译后的二进制文件,体积显著减小。
- 最终镜像仅包含Alpine和编译后的二进制文件,体积显著减小。
2.3 镜像版本管理
2.3.1 镜像标签与版本控制 docker tag
-
打标签
docker tag [原镜像ID] [新镜像名]:[新标签] # 示例:为镜像添加版本号 docker tag myapp:latest myapp:v1.2
-
语义化版本
latest
:默认标签(可能不稳定)。v1.2.3
:明确版本号(推荐生产环境使用)。dev
/test
:标识开发或测试版本。
2.3.2 删除无用镜像 docker rmi
与docker image prune
-
删除单个镜像
docker rmi [镜像名]:[标签] # 删除指定标签 docker rmi [镜像ID] # 强制删除(即使有容器依赖)
-
批量清理
# 删除所有悬空镜像(未被任何镜像引用的中间层) docker image prune # 删除未被使用的镜像(未被容器或标签引用) docker image prune -a
-
注意事项:
-
删除前确认镜像未被运行中的容器依赖。
-
定期清理可节省磁盘空间(尤其CI/CD环境)。
-
2.4 综合示例
# 拉取镜像、构建、打标签、清理全流程
docker pull node:16
docker build -t myapp:dev .
docker tag myapp:dev myapp:v1.0
docker image prune -f # 清理未使用的中间层镜像
三、容器网络与存储配置
网络与存储是容器化架构中连接服务与保障数据生命周期的两大支柱,直接影响应用的通信效率与数据可靠性。本章将系统解析容器网络模型的底层机制与存储方案的实践策略,打通容器间协作与数据持久化的核心链路。
3.1 网络模式与通信
3.1.1 默认桥接网络(bridge)与主机网络(host)
Docker 默认提供多种网络模式,直接影响容器的通信方式和性能。
-
桥接网络(bridge)
-
特点:
-
默认网络模式,每个容器分配独立 IP,通过虚拟网桥
docker0
连接。 -
容器间通过 IP 通信,默认隔离于宿主机网络(需端口映射才能对外暴露服务)。
-
-
适用场景:
多容器独立部署(如 Web 应用 + 数据库)。
-
操作示例:
# 默认桥接网络启动容器 docker run -d --name web nginx docker run -d --name db redis # 容器间需通过IP通信(需手动获取IP) docker exec web ping <db_container_ip>
-
-
主机网络(host)
-
特点:
-
容器直接共享宿主机的网络命名空间,使用宿主机 IP 和端口。
-
无需端口映射,性能更高,但牺牲了网络隔离性。
-
-
适用场景:
对网络性能要求极高的应用(如高频交易系统)。
-
操作示例:
docker run -d --network host --name nginx nginx # 直接访问宿主机IP的80端口 curl http://localhost:80
-
3.1.2 自定义网络实现容器间互通
通过自定义网络,可优化容器间通信(如 DNS 自动解析容器名称)。
-
创建自定义网络
docker network create --driver bridge my_network
-
启动容器并加入自定义网络
docker run -d --network my_network --name web nginx docker run -d --network my_network --name db redis
-
容器间直接通过名称通信
# 在web容器中直接ping db容器名称 docker exec web ping db
-
优势
- 自动 DNS 解析(无需手动管理 IP)。
- 支持网络隔离(不同网络间容器默认无法通信)。
3.2 端口映射与数据卷
3.2.1 单端口映射与范围映射
-
单端口映射
docker run -d -p 8080:80 nginx # 宿主机8080映射到容器80端口
- 用途:精确控制单个服务端口(如 Web 服务对外暴露)。
-
范围映射
docker run -d -p 8000-9000:8000-9000 my_app # 映射端口范围
- 用途:需要动态分配多个端口的应用(如 FTP 服务)。
- 用途:需要动态分配多个端口的应用(如 FTP 服务)。
3.2.2 持久化数据管理
-
Volume 挂载(Docker 管理的数据卷)
# 创建命名卷 docker volume create mysql_data # 挂载到容器 docker run -d -v mysql_data:/var/lib/mysql mysql
- 特点:数据完全由 Docker 管理,适合生产环境持久化存储。
-
Bind Mount 绑定目录(宿主机目录挂载)
docker run -d -v /宿主机/目录:/容器/目录 nginx
-
特点:直接操作宿主机文件,适合开发环境实时同步代码。
-
权限问题:若容器内进程无权限,需匹配宿主机目录权限(如
:ro
设为只读)。
-
3.3 跨容器数据共享
3.3.1 通过共享Volume实现数据同步
-
创建共享Volume并挂载到多个容器
# 创建共享卷 docker volume create shared_data # 容器A写入数据 docker run -d -v shared_data:/data --name writer alpine \ sh -c "echo 'Hello' > /data/file.txt" # 容器B读取数据 docker run -it -v shared_data:/data --name reader alpine \ cat /data/file.txt # 输出:Hello
- 应用场景:多容器共享配置文件、日志目录或数据库存储。
- 应用场景:多容器共享配置文件、日志目录或数据库存储。
3.3.2 数据卷备份与迁移实践
-
备份Volume数据
# 启动临时容器挂载Volume和备份目录 docker run --rm -v shared_data:/data -v /宿主机/备份目录:/backup alpine \ tar czvf /backup/data.tar.gz /data
- 恢复数据
docker run --rm -v shared_data:/data -v /宿主机/备份目录:/backup alpine \ tar xzvf /backup/data.tar.gz -C /
-
迁移Volume到其他主机
# 导出Volume内容 docker run --rm -v shared_data:/data alpine tar -czO /data > data.tar.gz # 目标主机导入 cat data.tar.gz | docker run -i -v shared_data:/data alpine tar -xzf - -C /data
四、Docker进阶操作技巧
容器化技术的进阶应用需要突破单容器管理的边界,转向复杂场景的规模化管控与精细化运维。本章聚焦多服务协同、资源治理与高效调试三大核心领域,解锁生产级容器化落地的关键能力。
4.1 多容器编排(Docker Compose)
Docker Compose 是简化多容器管理的核心工具,通过声明式 YAML 文件定义服务、网络和存储依赖。
4.1.1 编写 docker-compose.yml
定义服务
-
核心字段
version: "3.8" # Compose版本 services: web: # 服务名称 image: nginx:alpine # 镜像 ports: - "8080:80" # 端口映射 volumes: - ./html:/usr/share/nginx/html # 目录挂载 depends_on: # 服务依赖 - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: 123 volumes: - mysql_data:/var/lib/mysql # 命名卷 volumes: mysql_data: # 定义数据卷
-
关键指令
depends_on
:控制服务启动顺序(仅顺序,不等待服务就绪)。networks
:自定义网络(默认自动创建桥接网络)。restart
:定义容器重启策略(如always
、on-failure
)。
-
4.1.2 一键启动/停止多容器环境
-
启动所有服务
docker compose up -d # 后台启动 docker compose up --build # 重新构建镜像后启动
-
停止并清理资源
docker compose down # 停止并删除容器、网络 docker compose down -v # 同时删除关联的匿名卷
-
常用操作
docker compose logs -f web # 实时查看web服务日志 docker compose ps # 查看服务状态
4.2 资源限制与监控
4.2.1 限制容器内存与CPU
-
内存限制
docker run -d --memory=512m --memory-swap=1g --name app nginx
--memory
:最大可用内存(如512m
、2g
)。--memory-swap
:内存+交换分区总限制(需大于--memory
)。
-
CPU限制
docker run -d --cpus=1.5 --name cpu_app nginx # 使用1.5个CPU核 docker run -d --cpuset-cpus="0-2" --name pinned_app nginx # 绑定到0-2号CPU
4.2.2 实时监控容器资源
-
查看实时资源占用
docker stats # 显示所有容器资源使用情况 docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" # 自定义输出格式
-
输出字段
CPU %
:CPU 使用率。MEM USAGE/LIMIT
:内存使用量与限制值。NET I/O
:网络流量。
-
4.3 日志与调试技巧
4.3.1 查看容器日志
-
实时追踪日志
docker logs -f --tail=100 web_container # 持续输出最后100行日志
-
过滤特定时间日志
docker logs --since=2023-01-01T00:00:00 --until=2023-01-02T12:00:00 web_container
-
JSON格式日志解析
docker logs --details web_container | jq . # 需安装jq工具
4.3.2 进入容器调试
-
进入运行中的容器
docker exec -it web_container /bin/bash # 启动交互式Bash docker exec -it web_container sh # Alpine镜像使用sh
-
执行单次命令
docker exec web_container ls /app # 查看容器内目录 docker exec web_container cat /etc/os-release # 查看容器系统信息
-
调试工具增强
# 安装调试工具(如curl、ping) docker exec -it web_container apk add curl # Alpine docker exec -it web_container apt-get update && apt-get install iputils-ping # Debian/Ubuntu
4.4 综合应用示例
# 使用Compose启动多容器环境并限制资源
version: "3.8"
services:
web:
image: nginx
deploy:
resources:
limits:
cpus: "0.5"
memory: 256M
ports:
- "80:80"
# 启动后监控资源
docker compose up -d
docker stats
能够看到这里的观众老爷,无疑是对up的最大肯定和支持,在此恳求各位观众老爷能够多多点赞、收藏和关注。在这个合集中,未来将持续给大家分享关于Docker的多种常见开发实用操作。未来也将继续分享Docker、conda、ROS等等各种实用干货。感谢大家支持!
往期回顾 — 往期专栏 和 系列博文
往期专栏: Ubuntu系统教学系列
本期专栏: Docker
Docker系列(一):从依赖冲突到标准化交付!容器原理解析×SLAM跨平台实战×10分钟极速部署指南
Docker系列(二):从零构建容器环境|服务自启配置×镜像源加速×免sudo提权×避坑手册
Docker系列(三):深度剖析Dockerfile与图形化容器实战 — 3种容器构建方法对比与性能调优