Docker 安装部署全流程使用指南(Linux 通用版)
整合 Docker 安装、配置、核心使用(含日志管理)、路径修改、Dockerfile 构建镜像等全维度内容,适配 Debian/Ubuntu(apt)、CentOS/RHEL(yum/dnf)等主流 Linux 发行版,无特定系统适配内容。
一、Linux 通用版 Docker 安装
1. 前置准备:卸载旧版本
# 通用卸载命令(适配apt/yum/dnf) sudo apt remove -y docker docker-engine docker.io containerd runc # Debian/Ubuntu # 或 sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine containerd runc # CentOS/RHEL 2. 分体系安装(apt/yum)
方式 1:Debian/Ubuntu(apt 体系)
# 1. 安装依赖 sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release # 2. 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg # 3. 配置Docker源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 4. 安装Docker核心组件 sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 5. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 方式 2:CentOS/RHEL(yum/dnf 体系)
# 1. 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 2. 配置Docker源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 3. 安装Docker核心组件 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 4. 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 3. 验证安装成功
# 查看Docker版本 docker --version # 运行测试容器 sudo docker run hello-world # 输出“Hello from Docker!”即为安装成功 二、镜像加速配置(通用版)
默认从 Docker 官方仓库拉取镜像速度慢,配置国内镜像源是必做优化:
# 1. 创建Docker配置目录 sudo mkdir -p /etc/docker # 2. 写入国内镜像加速源(通用高效源) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://dockerhub.azk8s.cn", "https://mirror.baidubce.com/docker-registry/" ] } EOF # 3. 重启Docker使配置生效 sudo systemctl daemon-reload sudo systemctl restart docker # 验证加速配置 docker info | grep "Registry Mirrors" # 输出配置的镜像源即为生效 三、Docker 核心使用详解
1. 镜像 / 容器 / 卷的默认存储路径
Docker 的镜像、容器、卷共享同一个根存储目录,不同类型数据为该目录下的子文件夹:
| 数据类型 | 通用默认路径 | 说明 |
|---|---|---|
| 镜像 | /var/lib/docker/image/ | 镜像分层存储,不同存储驱动(如 overlay2)对应子目录 |
| 容器 | /var/lib/docker/containers/ | 每个容器对应一个目录,包含日志、配置、容器运行时数据 |
| 卷(Volume) | /var/lib/docker/volumes/ | 自定义卷的默认存储位置,推荐优先使用卷而非直接挂载本地目录 |
| 容器日志 | /var/lib/docker/containers/<容器ID>/<容器ID>-json.log | 默认日志文件(json-file 驱动),按容器 ID 存储 |
查看路径的通用方法:
# 1. 查看Docker根存储目录(最核心) docker info | grep "Docker Root Dir" # 2. 查看存储目录结构 ls -lh /var/lib/docker/ # 3. 查看镜像/容器/卷占用空间 docker system df # 4. 查看指定容器的日志文件路径(示例:容器名为demo-app) docker inspect --format='{{.LogPath}}' demo-app 2. 容器文件映射(本地 ↔ 容器)
核心分 2 种方式,优先使用卷挂载(生产环境),绑定挂载适合开发调试:
方式 1:绑定挂载(直接映射本地目录)
语法:docker run -v 本地绝对路径:容器内路径 [镜像名]
# 示例1:将本地/opt/nginx/html映射到容器nginx默认页面目录 sudo docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html nginx # 示例2:持久化容器日志到本地 sudo docker run -d -p 80:80 -v /var/log/nginx-container:/var/log/nginx nginx ⚠️ 注意:本地路径必须写绝对路径,容器内路径需匹配应用实际路径。
方式 2:卷挂载(Docker 管理的存储卷,推荐)
语法:先创建卷 → 挂载到容器
# 1. 创建自定义卷 sudo docker volume create nginx-data # 2. 挂载卷到容器 sudo docker run -d -p 80:80 -v nginx-data:/usr/share/nginx/html nginx # 3. 查看卷详情(含实际存储路径) sudo docker volume inspect nginx-data 两种挂载方式对比
| 特性 | 绑定挂载 | 卷挂载 |
|---|---|---|
| 路径管理 | 手动管理本地路径 | Docker 自动管理 |
| 跨平台 / 迁移 | 差(依赖本地路径) | 优(可直接备份 / 迁移卷) |
| 权限 / 稳定性 | 易出权限问题 | 适配 Docker 权限,更稳定 |
| 适用场景 | 开发调试、实时同步 | 生产环境、数据持久化 |
3. Docker 日志管理(核心)
3.1 日志默认机制
Docker 默认使用json-file日志驱动,将容器日志以 JSON 格式存储在本地文件(路径见 1. 存储路径),核心特点:
- 日志按容器独立存储,无集中管理;
- 默认无大小 / 数量限制,易导致磁盘占满(需手动配置轮转);
- 支持通过
docker logs命令便捷查看。
3.2 查看容器日志的常用命令
docker logs是查看容器日志的核心命令,支持多种筛选方式:
# 基础用法:查看指定容器的所有日志(容器名/容器ID均可) docker logs demo-app # 1. 实时查看日志(类似tail -f) docker logs -f demo-app # 2. 查看最后N行日志(示例:最后100行) docker logs --tail=100 demo-app # 3. 查看指定时间后的日志(支持绝对时间/相对时间) docker logs --since="2024-01-01 08:00:00" demo-app # 绝对时间 docker logs --since=1h demo-app # 1小时内的日志 # 4. 查看指定时间范围的日志 docker logs --since="2024-01-01 08:00:00" --until="2024-01-01 09:00:00" demo-app # 5. 显示日志时间戳 docker logs -t demo-app # 6. 组合用法:实时查看最后50行带时间戳的日志 docker logs -f -t --tail=50 demo-app 3.3 配置日志驱动(全局 / 容器级)
日志驱动决定 Docker 如何存储 / 输出容器日志,常用驱动及场景:
| 驱动类型 | 核心特点 | 适用场景 |
|---|---|---|
json-file | 本地 JSON 文件存储,默认驱动 | 单机、小规模部署 |
local | 本地日志轮转存储(自动切割),性能优于 json-file | 单机、需日志轮转的场景 |
journald | 集成系统 journald 日志服务,支持系统级日志管理 | 基于 systemd 的 Linux 系统 |
syslog | 输出到 syslog 服务器,支持集中日志管理 | 多机、集中日志收集 |
none | 禁用日志存储 | 无需日志的临时容器 |
配置方式 1:全局配置(所有容器生效)
修改daemon.json,重启 Docker 后生效:
# 示例:全局使用local驱动,并配置日志轮转 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "local", # 全局日志驱动 "log-opts": { "max-size": "100m", # 单个日志文件最大100MB "max-file": "5", # 最多保留5个日志文件 "compress": "true" # 压缩旧日志文件 } } EOF # 重启生效 sudo systemctl daemon-reload sudo systemctl restart docker 配置方式 2:容器级配置(覆盖全局,仅当前容器生效)
运行容器时通过--log-driver和--log-opt指定:
# 示例:运行nginx容器,单独配置日志轮转(json-file驱动) docker run -d -p 80:80 \ --name nginx-app \ --log-driver=json-file \ --log-opt max-size=50m \ --log-opt max-file=3 \ nginx 3.4 日志持久化与清理
方式 1:日志文件绑定挂载(持久化到本地指定目录)
# 示例:将nginx容器的日志同时输出到本地/var/log/nginx-docker目录 docker run -d -p 80:80 \ --name nginx-app \ -v /var/log/nginx-docker:/var/log/nginx \ # 容器内日志目录映射到本地 nginx 方式 2:清理无用日志(释放磁盘空间)
# 1. 清理单个容器的日志文件(需先停止容器) docker stop demo-app sudo rm -rf $(docker inspect --format='{{.LogPath}}' demo-app) docker start demo-app # 2. 批量清理所有容器的日志(谨慎执行) sudo find /var/lib/docker/containers/ -name "*.log" -type f -delete # 3. 使用Docker系统清理命令(清理未运行容器、无用镜像、日志等) docker system prune -a # 加-f可免确认,谨慎执行 3.5 日志常见问题解决
- 日志文件过大占满磁盘:配置
max-size/max-file日志轮转(推荐local驱动); - 日志乱码:容器内程序输出编码与终端不一致,运行容器时添加
-e LANG=C.UTF-8; - 日志实时查看卡顿:日志文件过大导致,先清理旧日志,配置轮转;
- 日志丢失:容器重启后日志消失→检查日志驱动(
json-file/local不会丢失,none会禁用日志)。
4. 使用 Dockerfile 构建自定义镜像(完整流程)
4.1 Dockerfile 核心认知
Dockerfile 是一个纯文本配置文件,包含一系列按顺序执行的指令,Docker 通过读取这些指令自动构建镜像。核心特点:
- 每一条指令对应镜像的一个 “分层”,分层存储是 Docker 镜像的核心特性(可复用、减少冗余);
- 构建镜像时,Docker 会从 Docker Hub 拉取基础镜像(若本地没有),再逐层执行指令;
- 构建结果是一个可直接运行的自定义镜像,可推送到仓库或本地运行。
4.2 Dockerfile 核心指令(必掌握)
| 指令 | 核心作用 | 示例 | 注意事项 |
|---|---|---|---|
FROM | 指定基础镜像(必填,所有镜像都基于某个基础镜像构建) | FROM nginx:1.24-alpine | 优先选择轻量镜像(如 alpine 版本),减少镜像体积;scratch表示空镜像(仅用于编译后的二进制程序) |
WORKDIR | 设置容器的工作目录(后续指令均在此目录执行) | WORKDIR /usr/app | 推荐用绝对路径,多次使用会切换目录;若目录不存在,Docker 会自动创建 |
COPY | 复制本地文件 / 目录到容器中(最常用) | COPY ./app.py /usr/app/ | 第一个参数是 “构建上下文” 内的路径,第二个是容器内路径;仅复制文件,不解压 |
ADD | 复制文件 / 目录,支持解压压缩包、拉取远程文件(慎用) | ADD ./app.tar.gz /usr/app/ | 会自动解压.tar/.gz等压缩包;远程文件建议用RUN wget替代,更可控 |
RUN | 构建镜像时执行命令(如安装依赖、创建目录) | RUN pip install flask | 多行RUN建议用&&合并,减少镜像分层(如RUN yum install -y nginx && yum clean all) |
ENV | 设置环境变量(容器运行时也生效) | ENV PYTHONPATH=/usr/app PORT=8080 | 可通过docker run -e覆盖;建议集中定义,便于维护 |
EXPOSE | 声明容器暴露的端口(仅 “声明”,不实际映射) | EXPOSE 8080 | 仅用于说明镜像的端口用途,实际映射需靠docker run -p |
CMD | 容器启动时执行的命令(可被docker run后的参数覆盖) | CMD ["python", "app.py"] | 推荐用 JSON 数组格式;一个 Dockerfile 仅最后一个CMD生效 |
ENTRYPOINT | 容器启动的 “入口命令”(不可被覆盖,仅可追加参数) | ENTRYPOINT ["python", "app.py"] | 结合CMD可实现 “默认参数”(如ENTRYPOINT ["nginx"] + CMD ["-g", "daemon off;"]) |
VOLUME | 声明容器的匿名卷(避免容器数据丢失) | VOLUME ["/usr/app/logs"] | 运行时可通过-v绑定本地目录 / 卷,覆盖匿名卷 |
4.3 完整构建步骤(实战示例:Python Web 应用)
步骤 1:准备构建环境(构建上下文)
创建专属目录存放 Dockerfile 和应用文件,构建上下文是 Docker 构建时可访问的文件目录(不能引用外部文件):
# 1. 创建构建目录并进入 mkdir -p /opt/python-demo && cd /opt/python-demo # 2. 编写简单的Python应用文件(app.py) tee app.py <<-'EOF' from flask import Flask import os app = Flask(__name__) port = int(os.getenv("PORT", 8080)) @app.route('/') def hello(): return "Hello Docker! This is a custom image built by Dockerfile." if __name__ == '__main__': app.run(host='0.0.0.0', port=port) EOF # 3. (可选)创建.dockerignore文件,精简构建上下文 tee .dockerignore <<-'EOF' # 排除无关文件,减少构建体积 __pycache__/ *.pyc .git/ .venv/ EOF 步骤 2:编写 Dockerfile
在构建目录下创建Dockerfile文件(文件名必须是Dockerfile,无后缀):
# 步骤1:指定基础镜像(Python 3.9轻量版) FROM python:3.9-alpine # 步骤2:设置工作目录 WORKDIR /usr/app # 步骤3:设置环境变量(避免Python输出缓冲,解决日志乱码) ENV PYTHONUNBUFFERED=1 PORT=8080 LANG=C.UTF-8 # 步骤4:安装依赖(Alpine系统用apk,合并RUN减少分层) RUN pip install flask --no-cache-dir # 步骤5:复制本地app.py到容器工作目录 COPY app.py . # 步骤6:声明暴露端口 EXPOSE 8080 # 步骤7:容器启动命令 CMD ["python", "app.py"] 步骤 3:执行构建命令
核心语法:docker build [选项] <构建上下文路径>
# -t:给镜像打标签(格式:镜像名:版本),. 表示构建上下文为当前目录 docker build -t python-demo:v1 . 构建成功会输出:
Successfully built xxxxxxxx(镜像ID) Successfully tagged python-demo:v1 步骤 4:验证镜像并运行容器
# 1. 查看构建好的镜像 docker images | grep python-demo # 2. 运行镜像,映射8080端口,配置日志轮转 docker run -d -p 8080:8080 \ --name demo-app \ --log-opt max-size=50m \ --log-opt max-file=3 \ python-demo:v1 # 3. 验证容器运行结果 curl http://localhost:8080 # 预期输出:Hello Docker! This is a custom image built by Dockerfile. # 4. 查看容器日志(带时间戳) docker logs -t demo-app 4.4 Dockerfile 构建优化技巧
新手易写出体积大、分层多的镜像,掌握以下技巧可大幅优化:
- 合并 RUN 指令:将多个
RUN用&&合并,减少镜像分层(如RUN apt update && apt install -y nginx && apt clean all); - 使用轻量基础镜像:优先选择
alpine、slim版本(如nginx:alpine比nginx体积小 90%); - 清理缓存文件:安装依赖后清理包管理器缓存(如
yum clean all、apt clean、pip --no-cache-dir); - 精简构建上下文:通过
.dockerignore排除无关文件(如日志、缓存、源码管理目录);
多阶段构建(进阶):用于编译型语言(如 Go、Java),编译阶段用完整镜像,运行阶段用轻量镜像,示例:dockerfile
# 阶段1:编译Go程序 FROM golang:1.21 as builder WORKDIR /app COPY main.go . RUN go build -o myapp main.go # 阶段2:运行程序(仅复制编译结果) FROM alpine:3.18 COPY --from=builder /app/myapp /usr/bin/ CMD ["/usr/bin/myapp"] 4.5 常见问题与解决
- 构建时报 “找不到文件”:检查
COPY/ADD的源路径是否在构建上下文内(不能用../引用上下文外的文件); - 镜像体积过大:检查是否未清理缓存、是否用了过重的基础镜像、是否复制了无关文件;
- 容器启动后立即退出:检查
CMD/ENTRYPOINT指令是否正确(如命令执行完就退出,需确保进程前台运行,如nginx -g daemon off;); - 权限问题:容器内文件权限不足时,可通过
RUN chmod/RUN chown调整(如RUN chmod 755 /usr/app/app.py); - 日志乱码:Dockerfile 中添加
ENV LANG=C.UTF-8,统一编码。
四、查看 / 修改镜像 / 容器 / 卷默认路径(通用版)
Docker 的镜像、容器、卷共享同一个根存储目录,修改根目录即可统一调整所有数据的存储位置(包括日志文件)。
1. 查看默认路径(通用)
# 核心命令:查看Docker根存储目录 docker info | grep "Docker Root Dir" # 默认输出:Docker Root Dir: /var/lib/docker 2. 修改默认路径(通用安全步骤)
步骤 1:停止 Docker 及相关服务
sudo systemctl stop docker sudo systemctl stop containerd 步骤 2:迁移原有数据到新路径
# 示例:将默认路径/var/lib/docker迁移到新路径/data/docker # 1. 创建新目录(按需修改路径) sudo mkdir -p /data/docker # 2. 迁移数据(rsync保留权限和符号链接,避免Docker启动失败) sudo rsync -avz /var/lib/docker/ /data/docker/ 步骤 3:配置新存储路径
# 编辑daemon.json,添加data-root参数(保留日志驱动配置) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "log-driver": "local", "log-opts": { "max-size": "100m", "max-file": "5" }, "data-root": "/data/docker" # 核心:指定新的存储根目录 } EOF 步骤 4:重启验证
# 重新加载配置并启动Docker sudo systemctl daemon-reload sudo systemctl start docker # 验证路径是否生效 docker info | grep "Docker Root Dir" # 预期输出:Docker Root Dir: /data/docker # 运行测试容器,确认新路径生成日志文件 docker run -d --name test-log hello-world ls -lh /data/docker/containers/ # 有新容器日志目录即为生效 步骤 5:(可选)删除旧数据
确认新路径正常后,删除旧路径释放空间:
sudo rm -rf /var/lib/docker/ 3. 注意事项(通用)
- 数据迁移必须用
rsync(而非cp),保留文件权限和符号链接; - 新路径的属主必须为
root,权限为700(sudo chmod 700 /data/docker); - 若修改后 Docker 无法启动,删除
daemon.json中的data-root行,恢复数据后重启即可; - 日志文件会随根目录迁移,无需单独配置。
五、Docker 核心命令速查(通用)
| 操作类型 | 核心命令 |
|---|---|
| 镜像操作 | 拉取:docker pull 镜像名:标签 查看:docker images 删除:docker rmi 镜像ID |
| 容器操作 | 运行:docker run -d -p 端口映射 镜像名 查看运行中:docker ps 查看所有:docker ps -a 停止:docker stop 容器ID 删除:docker rm 容器ID |
| 卷操作 | 创建:docker volume create 卷名 查看:docker volume ls 删除:docker volume rm 卷名 |
| 日志操作 | 查看:docker logs [容器名/ID] 实时查看:docker logs -f [容器名/ID] 查看日志路径:docker inspect --format='{{.LogPath}}' [容器名/ID] |
| 镜像构建 / 推送 | 构建:docker build -t 镜像名:标签 . 推送:docker push 镜像名:标签(需先登录仓库) |
| 系统清理 | 清理无用镜像 / 容器:docker system prune -a(谨慎执行,删除未使用资源) 清理日志:sudo find /var/lib/docker/containers/ -name "*.log" -type f -delete |
总结
- 通用安装:分 apt/yum 体系,核心是安装
docker-ce及配套组件,启动并设置开机自启; - 镜像加速:通过
daemon.json配置国内源,是提升拉取速度的核心优化; - 核心使用:
- 镜像 / 容器 / 卷 / 日志默认存储在
/var/lib/docker,文件映射优先用卷挂载; - 日志管理核心是
docker logs命令,生产环境需配置max-size/max-file避免磁盘占满,推荐local日志驱动; - Dockerfile 构建镜像的核心是
FROM为必填,指令按 “准备环境→安装依赖→复制文件→启动配置” 编写,优化重点是减少分层、精简体积,添加编码环境变量解决日志乱码;
- 镜像 / 容器 / 卷 / 日志默认存储在
- 路径修改:通过
daemon.json的data-root统一修改根存储目录,迁移数据需用rsync保留权限; - 命令速查:掌握镜像、容器、卷、日志的基础操作命令,可高效管理 Docker 资源。