Docker 部署与基础命令详解:从安装到容器管理全流程指南
摘要:本文详细介绍了 Docker 的核心概念、在 CentOS 环境下的安装部署流程(含镜像加速配置),以及镜像和容器的常用管理命令。适合作为 Docker 入门及日常运维的速查手册。
1. 容器技术与 Docker 简介
1.1 核心概念
- 容器 (Container):一种轻量级、可移植的虚拟化技术,将应用及其依赖打包在一起,实现"一次构建,到处运行"。
- 内核技术 :容器依赖于 Linux 内核的 Namespace (资源隔离)和 Cgroups(资源限制)技术。
- Docker:目前最主流的容器引擎,提供了标准化的容器运行时环境和丰富的生态工具。
2. Docker 安装与部署
2.1 卸载旧版 Docker
如果系统中存在旧版本 Docker,建议先彻底卸载以避免冲突:
bash
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.2 环境准备与依赖安装
bash
# 开启防火墙(根据实际安全策略决定)
systemctl enable --now firewalld.service
# 临时关闭 SELinux(避免权限问题)
setenforce 0
# 安装必要依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2.3 配置仓库并安装 Docker
bash
# 添加阿里云 Docker CE 仓库
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 Docker CE、CLI 及 Containerd
yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
systemctl enable --now docker.service
2.4 配置镜像加速器
由于网络原因,直接拉取 Docker Hub 镜像可能较慢,建议配置国内加速器。
方法一:使用阿里云专属加速器(推荐)
访问 阿里云容器镜像服务控制台 获取您的专属加速地址。
bash
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<您的专属ID>.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
方法二:使用公共加速源
⚠️ 注意:公共加速地址可能随时失效,建议优先使用方法一。
bash
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
EOF
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
🐳 Docker 核心指令速查
一、镜像管理 (Image)
镜像是容器的基础,掌握镜像的高效管理是第一步。
1. 搜索与获取
- 搜索镜像 :
docker search [选项] <关键词>--filter "is-official=true":仅过滤出官方提供的镜像。--limit <数字>:限制搜索结果的数量。
- 拉取镜像 :
docker pull <镜像名[:标签]>- 若省略标签,默认拉取
latest版本。 - 支持从私有仓库拉取:
docker pull registry.example.com/myapp:v1.0。
- 若省略标签,默认拉取
2. 构建镜像
- 基本构建 :
docker build [选项] <上下文路径>-t, --tag <名称:标签>:为构建出的镜像命名并打标签(可多次使用)。-f, --file <文件路径>:指定非默认名称或路径的 Dockerfile。--no-cache:完全忽略缓存,从头逐层构建(用于排查构建问题)。--build-arg <变量名>=<值>:向 Dockerfile 中的ARG指令传递构建时变量。--network host:构建时使用宿主机网络(解决构建时无法下载依赖的问题)。
3. 查看与管理
- 查看本地镜像 :
docker images [选项]-a, --all:显示所有中间层镜像(包括悬空镜像)。-q, --quiet:仅输出镜像 ID,常用于批量操作组合。--format:自定义输出格式。
- 删除镜像 :
docker rmi [选项] <镜像ID或名称:标签>-f, --force:强制删除(即使有容器依赖该镜像也会尝试删除)。--no-prune:不删除未标记的父镜像。
- 清理未使用镜像 :
docker image prune [选项]-a:删除所有未被任何容器引用的镜像(不仅是悬空镜像)。-f:跳过确认提示。
4. 导出与导入(离线传输)
- 导出镜像 :
docker save [选项] <镜像名:标签>-o, --output <文件名>:指定导出的 tar 文件路径。- 支持管道压缩:
docker save myapp:v1 | gzip > myapp.tar.gz。
- 导入镜像 :
docker load [选项]-i, --input <文件名>:从指定的 tar 文件加载镜像。- 支持管道解压:
gunzip -c myapp.tar.gz | docker load。
二、容器管理 (Container)
容器是镜像的运行实例,是业务运行的载体。
1. 创建与运行
- 基本运行 :
docker run [选项] <镜像> [命令]-d, --detach:后台运行容器。-p, --publish <主机端口>:<容器端口>:端口映射。-v, --volume <主机路径>:<容器路径>:挂载数据卷或目录。-e, --env <键=值>:设置环境变量。--name <名称>:指定容器名称。--rm:容器退出后自动删除(适合一次性任务)。-it:交互式终端(-i保持输入开放,-t分配伪终端)。--restart always:设置重启策略(no, on-failure, always, unless-stopped)。--memory <限制>:限制内存使用(如512m)。--cpus <限制>:限制 CPU 使用(如0.5)。
2. 状态查看
- 查看容器列表 :
docker ps:查看正在运行的容器。docker ps -a:查看所有容器(包括已停止)。docker ps -q:仅显示容器 ID。docker ps --filter "status=exited":筛选特定状态的容器。
- 查看容器详情 :
docker inspect <容器名/ID>- 返回 JSON 格式的详细信息(IP、挂载点、环境变量等)。
- 格式化输出:
docker inspect -f '{``{.NetworkSettings.IPAddress}}' <容器>。
3. 生命周期控制
- 启动/停止 :
docker start <容器>:启动已停止的容器。docker stop <容器>:优雅停止(发送 SIGTERM,等待超时后 SIGKILL)。docker kill <容器>:强制停止(直接发送 SIGKILL)。docker restart <容器>:重启容器。
- 暂停/恢复 :
docker pause <容器>:暂停容器内所有进程。docker unpause <容器>:恢复容器运行。
- 删除容器 :
docker rm [选项] <容器>-f:强制删除运行中的容器。-v:同时删除关联的匿名卷。$(docker ps -aq):配合命令替换删除所有容器。
4. 交互与调试
- 进入容器 :
docker exec [选项] <容器> <命令>-it bash或-it sh:进入交互式 Shell。- 注意:
exec是在运行中的容器内执行新进程,不会重启容器。
- 查看日志 :
docker logs [选项] <容器>-f:实时跟踪日志输出。--tail <数字>:显示最后 N 行。-t:显示时间戳。--since <时间>:显示从指定时间开始的日志。
- 文件拷贝 :
docker cp <容器>:<路径> <主机路径>或反向操作。 - 资源监控 :
docker stats:实时显示 CPU、内存、网络 I/O 使用情况。
三、数据卷管理 (Volume)
数据卷用于持久化存储,避免容器删除导致数据丢失。
- 创建卷 :
docker volume create <卷名> - 查看卷 :
docker volume ls:列出所有卷。docker volume inspect <卷名>:查看卷的挂载点等详情。
- 删除卷 :
docker volume rm <卷名>:删除指定卷。docker volume prune:删除所有未被容器使用的匿名卷。
四、网络管理 (Network)
Docker 网络实现了容器间的隔离与通信。
- 创建网络 :
docker network create [选项] <网络名>--driver bridge:桥接网络(默认)。--subnet <网段>:指定子网。
- 连接/断开 :
docker network connect <网络> <容器>:将容器接入网络。docker network disconnect <网络> <容器>:将容器移出网络。
- 查看网络 :
docker network ls:列出网络。docker network inspect <网络>:查看网络详情(包含接入的容器 IP)。
- 删除网络 :
docker network rm <网络>。
五、Docker Compose (多容器编排)
适用于微服务或多组件应用的统一管理。
- 常用命令 :
docker-compose up -d:后台启动所有服务。docker-compose up -d --build:重新构建镜像并启动。docker-compose down:停止并移除容器、网络。docker-compose down -v:停止并移除容器、网络、数据卷。docker-compose ps:查看服务状态。docker-compose logs -f <服务名>:实时查看指定服务日志。docker-compose exec <服务名> bash:进入指定服务容器。
- 注意事项 :
- 必须在
docker-compose.yml所在目录下执行。 down默认保留数据卷,需加-v才会彻底清理数据。
- 必须在
六、系统清理与维护
定期清理无用资源,释放磁盘空间。
- 查看磁盘占用 :
docker system df:显示镜像、容器、卷的空间使用情况。 - 一键清理 :
docker system prune:清理停止的容器、悬空镜像、未使用的网络。docker system prune -a:清理所有未使用的镜像(不仅仅是悬空)。docker system prune -a --volumes:彻底清理所有未使用的镜像、容器、网络和卷(慎用!)。
七、Dockerfile 核心指令详解
Dockerfile 是构建镜像的脚本文件,每一行指令都会创建一个新的镜像层。
1. 基础指令
- FROM :指定基础镜像(必须是第一行,除非在 ARG 之后)。
- 示例:
FROM ubuntu:20.04或FROM scratch(从零构建)。
- 示例:
- LABEL :为镜像添加元数据(作者、版本、描述等)。
- 示例:
LABEL maintainer="user@example.com" version="1.0"。
- 示例:
- WORKDIR :设置工作目录(后续 RUN/CMD/ENTRYPOINT 都在此目录下执行)。
- 建议:始终使用绝对路径,避免相对路径带来的不确定性。
2. 文件操作
- COPY :将宿主机文件复制到镜像中。
- 语法:
COPY <源路径> <目标路径>。 - 特点:仅支持本地复制,不解压 tar 包。
- 语法:
- ADD :功能类似 COPY,但支持自动解压 tar 包和远程 URL 下载。
- 建议:优先使用 COPY,仅在需要解压 tar 包时使用 ADD。
- .dockerignore :在构建上下文根目录创建此文件,排除不需要复制到镜像的文件(如
.git,node_modules),减小镜像体积并加速构建。
3. 执行指令
- RUN :在构建过程中执行命令(每行 RUN 产生一个新层)。
- 建议:使用
&&合并多条命令,减少层数;安装完依赖后清理缓存(如apt-get clean)。
- 建议:使用
- CMD :指定容器启动时的默认命令(可被
docker run覆盖)。- 格式:推荐 Exec 格式
["executable", "param1"],避免 Shell 格式导致的信号传递问题。
- 格式:推荐 Exec 格式
- ENTRYPOINT :指定容器启动时的入口程序(不可被覆盖,除非用
--entrypoint)。- 场景:常用于制作可执行工具镜像,CMD 作为默认参数传入 ENTRYPOINT。
4. 环境与暴露
- ENV :设置环境变量(构建时和运行时均有效)。
- 示例:
ENV APP_HOME=/app。
- 示例:
- EXPOSE :声明容器运行时监听的端口(仅文档作用,不实际映射端口)。
- 示例:
EXPOSE 80 443。
- 示例:
- VOLUME :声明匿名卷挂载点(防止数据写入容器层)。
- 示例:
VOLUME /data。
- 示例:
5. 用户与安全
- USER :指定运行后续指令及容器启动时的用户。
- 建议:避免使用 root 用户,创建专用用户以提高安全性。
- HEALTHCHECK :定义健康检查命令。
- 示例:
HEALTHCHECK --interval=30s CMD curl -f http://localhost/ || exit 1。
- 示例:
💡 Dockerfile 最佳实践
- 精简基础镜像 :优先使用
alpine或slim版本的基础镜像。 - 减少层数:合并 RUN 指令,及时清理包管理器缓存。
- 利用构建缓存:将变化频率低的指令(如安装依赖)放在前面,变化频繁的代码复制放在后面。
- 多阶段构建 :使用
FROM ... AS builder分离编译环境和运行环境,显著减小最终镜像体积。 - 不使用 latest 标签:始终指定明确的基础镜像版本,确保构建的可复现性。