整合 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 资源。