跳到主要内容Docker 安装部署与核心使用指南(Linux 通用版) | 极客日志Shell / Bash
Docker 安装部署与核心使用指南(Linux 通用版)
本文介绍了 Docker 在 Linux 系统上的通用安装方法(涵盖 apt 与 yum/dnf),配置国内镜像加速源。详细讲解了容器、卷、日志的默认存储路径及修改方式,包括绑定挂载与卷挂载的区别。重点阐述了 Docker 日志管理策略(驱动配置、轮转设置、持久化与清理)。此外,提供了基于 Dockerfile 构建自定义镜像的完整流程与优化技巧,并汇总了常用核心命令速查表,适用于 Debian/Ubuntu 及 CentOS/RHEL 等主流发行版。
板砖工程师1 浏览 1. 前置准备:卸载旧版本
sudo apt remove -y docker docker-engine docker.io containerd runc
sudo yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine containerd runc
2. 分体系安装(apt/yum)
方式 1:Debian/Ubuntu(apt 体系)
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg
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
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
方式 2:CentOS/RHEL(yum/dnf 体系)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
3. 验证安装成功
docker --version
sudo docker run hello-world
二、镜像加速配置(通用版)
默认从 Docker 官方仓库拉取镜像速度慢,配置国内镜像源是必做优化:
sudo mkdir -p /etc/docker
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
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 存储 |
docker info | grep "Docker Root Dir"
ls -lh /var/lib/docker/
docker system df
docker inspect --format='{{.LogPath}}' demo-app
2. 容器文件映射(本地 ↔ 容器)
核心分 2 种方式,优先使用卷挂载(生产环境),绑定挂载适合开发调试:
方式 1:绑定挂载(直接映射本地目录)
语法:docker run -v 本地绝对路径:容器内路径 [镜像名]
sudo docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html nginx
sudo docker run -d -p 80:80 -v /var/log/nginx-container:/var/log/nginx nginx
⚠️ 注意:本地路径必须写绝对路径,容器内路径需匹配应用实际路径。
方式 2:卷挂载(Docker 管理的存储卷,推荐)
sudo docker volume create nginx-data
sudo docker run -d -p 80:80 -v nginx-data:/usr/share/nginx/html nginx
sudo docker volume inspect nginx-data
两种挂载方式对比
| 特性 | 绑定挂载 | 卷挂载 |
|---|
| 路径管理 | 手动管理本地路径 | Docker 自动管理 |
| 跨平台 / 迁移 | 差(依赖本地路径) | 优(可直接备份 / 迁移卷) |
| 权限 / 稳定性 | 易出权限问题 | 适配 Docker 权限,更稳定 |
| 适用场景 | 开发调试、实时同步 | 生产环境、数据持久化 |
3. Docker 日志管理(核心)
3.1 日志默认机制
Docker 默认使用 json-file 日志驱动,将容器日志以 JSON 格式存储在本地文件(路径见 1. 存储路径),核心特点:
- 日志按容器独立存储,无集中管理;
- 默认无大小 / 数量限制,易导致磁盘占满(需手动配置轮转);
- 支持通过
docker logs 命令便捷查看。
3.2 查看容器日志的常用命令
docker logs 是查看容器日志的核心命令,支持多种筛选方式:
docker logs demo-app
docker logs -f demo-app
docker logs --tail=100 demo-app
docker logs --since="2024-01-01 08:00:00" demo-app
docker logs --since=1h demo-app
docker logs --since="2024-01-01 08:00:00" --until="2024-01-01 09:00:00" demo-app
docker logs -t demo-app
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 后生效:
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",
"compress": "true"
}
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
配置方式 2:容器级配置(覆盖全局,仅当前容器生效)
运行容器时通过 --log-driver 和 --log-opt 指定:
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:日志文件绑定挂载(持久化到本地指定目录)
docker run -d -p 80:80 \
--name nginx-app \
-v /var/log/nginx-docker:/var/log/nginx \
nginx
方式 2:清理无用日志(释放磁盘空间)
docker stop demo-app
sudo rm -rf $(docker inspect --format='{{.LogPath}}' demo-app)
docker start demo-app
sudo find /var/lib/docker/containers/ -name "*.log" -type f -delete
docker system prune -a
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 构建时可访问的文件目录(不能引用外部文件):
mkdir -p /opt/python-demo && cd /opt/python-demo
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
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 [选项] <构建上下文路径>
docker build -t python-demo:v1 .
Successfully built xxxxxxxx(镜像 ID)
Successfully tagged python-demo:v1
步骤 4:验证镜像并运行容器
docker images | grep python-demo
docker run -d -p 8080:8080 \
--name demo-app \
--log-opt max-size=50m \
--log-opt max-file=3 \
python-demo:v1
curl http://localhost:8080
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),编译阶段用完整镜像,运行阶段用轻量镜像,示例:
# 阶段 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 info | grep "Docker Root Dir"
2. 修改默认路径(通用安全步骤)
步骤 1:停止 Docker 及相关服务
sudo systemctl stop docker
sudo systemctl stop containerd
步骤 2:迁移原有数据到新路径
sudo mkdir -p /data/docker
sudo rsync -avz /var/lib/docker/ /data/docker/
步骤 3:配置新存储路径
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:重启验证
sudo systemctl daemon-reload
sudo systemctl start docker
docker info | grep "Docker Root Dir"
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 资源。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown 转 HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
- HTML 转 Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online