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 资源。
相关推荐
maosheng114614 分钟前
RHCSA的第一次作业
linux·运维·服务器
wifi chicken1 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2911 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C1 小时前
CPU Cache
linux·cache
Hoshino.412 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
Lxinccode2 小时前
docker(28) : 别名配置
docker·容器·eureka·docker别名
播播资源4 小时前
CentOS系统 + 宝塔面板 部署 OpenClaw源码开发版完整教程
linux·运维·centos
源远流长jerry4 小时前
在 Ubuntu 22.04 上配置 Soft-RoCE 并运行 RDMA 测试程序
linux·服务器·网络·tcp/ip·ubuntu·架构·ip
学不完的4 小时前
Docker数据卷管理及优化
运维·docker·容器·eureka
lay_liu4 小时前
Linux安装redis
linux·运维·redis