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 日志常见问题解决
  1. 日志文件过大占满磁盘 :配置max-size/max-file日志轮转(推荐local驱动);
  2. 日志乱码 :容器内程序输出编码与终端不一致,运行容器时添加-e LANG=C.UTF-8
  3. 日志实时查看卡顿:日志文件过大导致,先清理旧日志,配置轮转;
  4. 日志丢失 :容器重启后日志消失→检查日志驱动(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 构建优化技巧

新手易写出体积大、分层多的镜像,掌握以下技巧可大幅优化:

  1. 合并 RUN 指令 :将多个RUN&&合并,减少镜像分层(如RUN apt update && apt install -y nginx && apt clean all);

  2. 使用轻量基础镜像 :优先选择alpineslim版本(如nginx:alpinenginx体积小 90%);

  3. 清理缓存文件 :安装依赖后清理包管理器缓存(如yum clean allapt cleanpip --no-cache-dir);

  4. 精简构建上下文 :通过.dockerignore排除无关文件(如日志、缓存、源码管理目录);

  5. 多阶段构建 (进阶):用于编译型语言(如 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 常见问题与解决
  1. 构建时报 "找不到文件" :检查COPY/ADD的源路径是否在构建上下文内(不能用../引用上下文外的文件);
  2. 镜像体积过大:检查是否未清理缓存、是否用了过重的基础镜像、是否复制了无关文件;
  3. 容器启动后立即退出 :检查CMD/ENTRYPOINT指令是否正确(如命令执行完就退出,需确保进程前台运行,如nginx -g daemon off;);
  4. 权限问题 :容器内文件权限不足时,可通过RUN chmod/RUN chown调整(如RUN chmod 755 /usr/app/app.py);
  5. 日志乱码 :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. 注意事项(通用)

  1. 数据迁移必须用rsync(而非cp),保留文件权限和符号链接;
  2. 新路径的属主必须为root,权限为700sudo chmod 700 /data/docker);
  3. 若修改后 Docker 无法启动,删除daemon.json中的data-root行,恢复数据后重启即可;
  4. 日志文件会随根目录迁移,无需单独配置。

五、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

总结

  1. 通用安装 :分 apt/yum 体系,核心是安装docker-ce及配套组件,启动并设置开机自启;
  2. 镜像加速 :通过daemon.json配置国内源,是提升拉取速度的核心优化;
  3. 核心使用
    • 镜像 / 容器 / 卷 / 日志默认存储在/var/lib/docker,文件映射优先用卷挂载;
    • 日志管理核心是docker logs命令,生产环境需配置max-size/max-file避免磁盘占满,推荐local日志驱动;
    • Dockerfile 构建镜像的核心是FROM为必填,指令按 "准备环境→安装依赖→复制文件→启动配置" 编写,优化重点是减少分层、精简体积,添加编码环境变量解决日志乱码;
  4. 路径修改 :通过daemon.jsondata-root统一修改根存储目录,迁移数据需用rsync保留权限;
  5. 命令速查:掌握镜像、容器、卷、日志的基础操作命令,可高效管理 Docker 资源。
相关推荐
小猪佩奇TONY2 小时前
Linux 内核学习(16) --- linux x86-64 虚拟地址空间和区域
linux·运维·学习
杰克崔2 小时前
kprobe及kretprobe的基于例子来调试分析其原理
linux·运维·服务器·车载系统
Mr. Cao code2 小时前
MySQL数据卷实战:持久化存储秘籍
数据库·mysql·docker·容器
桂花树下的猫2 小时前
ubuntu20.04上docker部署
运维·docker·容器
`林中水滴`2 小时前
Linux系列:Ubuntu 防火墙命令
linux·ubuntu
自不量力的A同学2 小时前
Docker 29.1.4
运维·docker·容器
雾岛听蓝2 小时前
初识Linux
linux
听风吹雨yu2 小时前
YoloV11的pt模型转rknn模型适用于RK3588等系列
linux·python·yolo·开源·rknn
黯叶2 小时前
基于 Docker+Docker-Compose 的 SpringBoot 项目标准化部署(外置 application-prod.yml 配置方案)
java·spring boot·redis·docker