Docker的学习路线

0. 前置知识

先确认这些基础:

知识 要掌握到什么程度
Linux 命令 cdlscatvimchmodsystemctljournalctl
网络基础 端口、IP、域名、HTTP/HTTPS、反向代理
Git 拉代码、切分支、打 tag
项目启动方式 知道你的项目如何本地启动,比如 npm run startjava -jarpython app.py

1. Docker 基础阶段

目标:知道容器、镜像、仓库、数据卷、网络分别是什么。

重点学这些命令:

bash 复制代码
docker version
docker info
docker pull nginx
docker images
docker ps
docker ps -a
docker run
docker stop
docker restart
docker rm
docker rmi
docker logs
docker exec -it 容器名 bash

必须理解:

bash 复制代码
docker run -d \
  --name my-nginx \
  -p 8080:80 \
  nginx

这行命令的含义:

参数 作用
-d 后台运行
--name 指定容器名
-p 8080:80 服务器 8080 端口映射到容器 80 端口
nginx 使用的镜像

练习任务:

bash 复制代码
docker run -d --name nginx-demo -p 8080:80 nginx
docker logs nginx-demo
docker exec -it nginx-demo bash
docker stop nginx-demo
docker rm nginx-demo

2. Dockerfile 阶段

目标:把你的项目打包成镜像。

Dockerfile 是用来构建容器镜像的文本文件,里面定义基础镜像、工作目录、依赖安装、文件复制和启动命令等。Docker 官方文档也把 Dockerfile 作为构建镜像的核心入口。(Docker Documentation)

以 Node.js 项目为例:

docker 复制代码
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "run", "start"]

常用指令:

指令 作用
FROM 指定基础镜像
WORKDIR 设置工作目录
COPY 复制文件
RUN 构建镜像时执行命令
EXPOSE 声明容器端口
CMD 容器启动命令
ENV 设置环境变量

构建和运行:

bash 复制代码
docker build -t my-app:1.0 .
docker run -d --name my-app -p 3000:3000 my-app:1.0

重点优化:

docker 复制代码
COPY package*.json ./
RUN npm install
COPY . .

不要一开始就 COPY . .,否则每次改代码都会导致依赖层缓存失效。Docker 官方镜像构建最佳实践也强调要合理利用缓存、选择更小的基础镜像,并减少镜像引入的漏洞面。(Docker Documentation)


3. .dockerignore 阶段

目标:避免把无用文件打进镜像。

创建 .dockerignore

复制代码
node_modules
.git
.env
dist
logs
*.log
.DS_Store

作用:

忽略内容 原因
.git 不需要进镜像
node_modules 应在镜像内安装依赖
.env 避免泄露密钥
logs 日志不应打包进镜像
dist 看项目类型决定是否忽略

4. Docker Volume 数据持久化

目标:容器删了,数据不能丢。

错误示例:

bash 复制代码
docker run -d --name mysql mysql:8

容器删掉后,数据库数据容易一起丢。

正确示例:

bash 复制代码
docker volume create mysql-data

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:8

常用命令:

bash 复制代码
docker volume ls
docker volume inspect mysql-data
docker volume rm mysql-data

你需要重点理解:

类型 示例 适合场景
volume mysql-data:/var/lib/mysql 数据库、Redis、持久化数据
bind mount /host/path:/container/path 配置文件、日志目录、开发调试

5. Docker Network 网络阶段

目标:多个容器之间可以互相访问。

创建网络:

bash 复制代码
docker network create app-network

启动 MySQL:

bash 复制代码
docker run -d \
  --name mysql \
  --network app-network \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8

启动后端:

bash 复制代码
docker run -d \
  --name backend \
  --network app-network \
  -p 3000:3000 \
  my-backend:1.0

后端连接数据库时,不要写:

复制代码
DB_HOST=127.0.0.1

应该写:

复制代码
DB_HOST=mysql

因为在 Docker 网络中,容器名可以当作域名使用。


6. Docker Compose 阶段

目标:用一个文件管理多个服务。

Docker Compose 用于定义和运行多容器应用,可以统一管理服务启动、停止、重建、状态查看和日志输出。(Docker Documentation)

典型项目结构:

复制代码
project/
├── backend/
│   └── Dockerfile
├── frontend/
│   └── Dockerfile
├── nginx/
│   └── nginx.conf
├── compose.yaml
└── .env

示例 compose.yaml

yaml 复制代码
services:
  backend:
    build: ./backend
    container_name: my-backend
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=123456
    depends_on:
      - mysql
    networks:
      - app-network

  mysql:
    image: mysql:8
    container_name: my-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=mydb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    container_name: my-redis
    networks:
      - app-network

volumes:
  mysql-data:

networks:
  app-network:

启动:

bash 复制代码
docker compose up -d

查看:

bash 复制代码
docker compose ps
docker compose logs -f
docker compose logs -f backend

停止:

bash 复制代码
docker compose down

重新构建并启动:

bash 复制代码
docker compose up -d --build

7. 生产环境部署阶段

目标:在服务器上稳定运行。

生产环境建议使用独立的 Compose 文件,例如:

复制代码
compose.yaml
compose.production.yaml

Docker 官方也建议生产环境可以使用额外的 Compose 文件覆盖开发配置,例如 compose.production.yaml,再通过 docker compose -f compose.yaml -f compose.production.yaml up -d 启动。(Docker Documentation)

示例:

bash 复制代码
docker compose -f compose.yaml -f compose.production.yaml up -d

生产环境重点:

项目 建议
镜像版本 不要长期使用 latest
数据库 必须挂载 volume
密码 不要硬编码在 compose 文件里
日志 配置日志轮转
端口 只暴露必要端口
HTTPS 用 Nginx / Caddy / Traefik
备份 数据库定时备份
更新 先构建新镜像,再重启服务

8. Nginx 反向代理阶段

目标:通过域名访问项目。

例如:

复制代码
https://api.example.com -> backend:3000
https://example.com -> frontend

Nginx 配置示例:

复制代码
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://backend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

在 Compose 里增加 Nginx:

yaml 复制代码
services:
  nginx:
    image: nginx:alpine
    container_name: my-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - backend
    networks:
      - app-network

9. 多阶段构建阶段

目标:减小镜像体积,提高安全性。

Docker 官方推荐使用 multi-stage builds,多阶段构建可以把构建环境和运行环境分离,从而显著减少镜像体积和攻击面。(Docker Documentation)

例如前端项目:

docker 复制代码
FROM node:20-alpine AS build

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

FROM nginx:alpine

COPY --from=build /app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

好处:

好处 说明
镜像更小 最终镜像不包含 Node.js 构建环境
更安全 减少运行时依赖
部署更快 镜像传输更小
结构更清晰 构建阶段和运行阶段分离

10. CI/CD 阶段

目标:代码提交后自动构建和部署。

推荐流程:

复制代码
GitHub Push
  ↓
GitHub Actions
  ↓
docker build
  ↓
push 到镜像仓库
  ↓
服务器 docker pull
  ↓
docker compose up -d

你需要掌握:

内容 作用
GitHub Actions 自动化流程
Docker Hub / GHCR 存放镜像
SSH 部署 远程登录服务器执行命令
镜像 tag 区分版本
回滚 使用旧 tag 重启

示例镜像 tag:

bash 复制代码
my-app:2026-04-28
my-app:v1.2.0
my-app:commit-abc123

不要只用:

bash 复制代码
my-app:latest

11. 监控、日志、排错阶段

目标:项目出问题时能定位。

常用命令:

bash 复制代码
docker ps
docker logs -f container_name
docker inspect container_name
docker exec -it container_name sh
docker stats
docker compose ps
docker compose logs -f

排查方向:

问题 排查命令
容器启动失败 docker logs 容器名
端口访问不了 docker ps、安全组、防火墙
数据库连不上 检查网络、容器名、环境变量
镜像太大 检查 Dockerfile、多阶段构建
磁盘爆了 docker system df
容器频繁重启 docker logsrestart 策略

清理命令:

bash 复制代码
docker system df
docker image prune
docker container prune
docker volume prune

注意:docker volume prune 可能删除未使用的数据卷,生产环境慎用。


12. 安全阶段

目标:避免低级安全问题。

重点规则:

规则 说明
不要把 .env 打进镜像 密钥泄露风险
不要在容器内跑 root 尽量使用非 root 用户
不要暴露数据库端口到公网 MySQL、Redis 只走内部网络
使用可信基础镜像 优先官方镜像
定期更新镜像 修复漏洞
限制容器权限 不滥用 --privileged
使用固定版本 tag 避免不可控变更

Docker 安全建议中也强调应使用可信镜像,例如 Docker Official Images,并避免从不可信来源构建镜像或使用不可信 Dockerfile。(Docker Documentation)


你最终要达到的能力

学完后你应该能做到:

复制代码
1. 写 Dockerfile
2. 构建自己的项目镜像
3. 用 Compose 管理多个服务
4. 在服务器上部署后端、前端、数据库、Redis、Nginx
5. 配置数据持久化
6. 配置域名和 HTTPS
7. 查看日志和排查问题
8. 安全更新和回滚版本
9. 接入 GitHub Actions 自动部署

对独立开发者来说,优先级最高的是:

复制代码
Dockerfile > Docker Compose > Volume > Network > Nginx > CI/CD
相关推荐
for_ever_love__1 小时前
UI学习:UITableViewCell的创建及复用机制
学习·ui·objective-c
随风,奔跑1 小时前
Mybatis-Plus学习笔记
java·笔记·学习·mybatis
疯狂成瘾者2 小时前
对比JAR 包部署 vs Docker 部署方式
java·docker·jar
我能坚持多久2 小时前
C++的Vector学习:从功能探索到底层实现
开发语言·c++·学习
Jackyzhe2 小时前
从零学习Kafka:生产者分区机制
分布式·学习·kafka
迷途之人不知返2 小时前
List的学习
数据结构·c++·学习·list
ℳ₯㎕ddzོꦿ࿐2 小时前
实战:在 Linux 系统用 Docker-Compose 优雅部署 GitLab 及防坑指南
linux·docker·gitlab
三克的油2 小时前
YOLOV5数据学习
人工智能·学习·yolo