Docker的学习路线
0. 前置知识先确认这些基础知识要掌握到什么程度Linux 命令cd、ls、cat、vim、chmod、systemctl、journalctl网络基础端口、IP、域名、HTTP/HTTPS、反向代理Git拉代码、切分支、打 tag项目启动方式知道你的项目如何本地启动比如npm run start、java -jar、python app.py1. Docker 基础阶段目标知道容器、镜像、仓库、数据卷、网络分别是什么。重点学这些命令dockerversiondockerinfodockerpull nginxdockerimagesdockerpsdockerps-adockerrundockerstopdockerrestartdockerrmdockerrmidockerlogsdockerexec-it容器名bash必须理解dockerrun-d\--namemy-nginx\-p8080:80\nginx这行命令的含义参数作用-d后台运行--name指定容器名-p 8080:80服务器 8080 端口映射到容器 80 端口nginx使用的镜像练习任务dockerrun-d--namenginx-demo-p8080:80 nginxdockerlogs nginx-demodockerexec-itnginx-demobashdockerstop nginx-demodockerrmnginx-demo2. Dockerfile 阶段目标把你的项目打包成镜像。Dockerfile 是用来构建容器镜像的文本文件里面定义基础镜像、工作目录、依赖安装、文件复制和启动命令等。Docker 官方文档也把 Dockerfile 作为构建镜像的核心入口。(Docker Documentation)以 Node.js 项目为例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设置环境变量构建和运行dockerbuild-tmy-app:1.0.dockerrun-d--namemy-app-p3000:3000 my-app:1.0重点优化COPY package*.json ./ RUN npm install COPY . .不要一开始就COPY . .否则每次改代码都会导致依赖层缓存失效。Docker 官方镜像构建最佳实践也强调要合理利用缓存、选择更小的基础镜像并减少镜像引入的漏洞面。(Docker Documentation)3..dockerignore阶段目标避免把无用文件打进镜像。创建.dockerignorenode_modules .git .env dist logs *.log .DS_Store作用忽略内容原因.git不需要进镜像node_modules应在镜像内安装依赖.env避免泄露密钥logs日志不应打包进镜像dist看项目类型决定是否忽略4. Docker Volume 数据持久化目标容器删了数据不能丢。错误示例dockerrun-d--namemysql mysql:8容器删掉后数据库数据容易一起丢。正确示例dockervolume create mysql-datadockerrun-d\--namemysql\-eMYSQL_ROOT_PASSWORD123456\-vmysql-data:/var/lib/mysql\mysql:8常用命令dockervolumelsdockervolume inspect mysql-datadockervolumermmysql-data你需要重点理解类型示例适合场景volumemysql-data:/var/lib/mysql数据库、Redis、持久化数据bind mount/host/path:/container/path配置文件、日志目录、开发调试5. Docker Network 网络阶段目标多个容器之间可以互相访问。创建网络dockernetwork create app-network启动 MySQLdockerrun-d\--namemysql\--networkapp-network\-eMYSQL_ROOT_PASSWORD123456\mysql:8启动后端dockerrun-d\--namebackend\--networkapp-network\-p3000:3000\my-backend:1.0后端连接数据库时不要写DB_HOST127.0.0.1应该写DB_HOSTmysql因为在 Docker 网络中容器名可以当作域名使用。6. Docker Compose 阶段目标用一个文件管理多个服务。Docker Compose 用于定义和运行多容器应用可以统一管理服务启动、停止、重建、状态查看和日志输出。(Docker Documentation)典型项目结构project/ ├── backend/ │ └── Dockerfile ├── frontend/ │ └── Dockerfile ├── nginx/ │ └── nginx.conf ├── compose.yaml └── .env示例compose.yamlservices:backend:build:./backendcontainer_name:my-backendports:-3000:3000environment:-DB_HOSTmysql-DB_PORT3306-DB_USERroot-DB_PASSWORD123456depends_on:-mysqlnetworks:-app-networkmysql:image:mysql:8container_name:my-mysqlenvironment:-MYSQL_ROOT_PASSWORD123456-MYSQL_DATABASEmydbvolumes:-mysql-data:/var/lib/mysqlnetworks:-app-networkredis:image:redis:7-alpinecontainer_name:my-redisnetworks:-app-networkvolumes:mysql-data:networks:app-network:启动dockercompose up-d查看dockercomposepsdockercompose logs-fdockercompose logs-fbackend停止dockercompose down重新构建并启动dockercompose up-d--build7. 生产环境部署阶段目标在服务器上稳定运行。生产环境建议使用独立的 Compose 文件例如compose.yaml compose.production.yamlDocker 官方也建议生产环境可以使用额外的 Compose 文件覆盖开发配置例如compose.production.yaml再通过docker compose -f compose.yaml -f compose.production.yaml up -d启动。(Docker Documentation)示例dockercompose-fcompose.yaml-fcompose.production.yaml up-d生产环境重点项目建议镜像版本不要长期使用latest数据库必须挂载 volume密码不要硬编码在 compose 文件里日志配置日志轮转端口只暴露必要端口HTTPS用 Nginx / Caddy / Traefik备份数据库定时备份更新先构建新镜像再重启服务8. Nginx 反向代理阶段目标通过域名访问项目。例如https://api.example.com - backend:3000 https://example.com - frontendNginx 配置示例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 里增加 Nginxservices:nginx:image:nginx:alpinecontainer_name:my-nginxports:-80:80-443:443volumes:-./nginx/nginx.conf:/etc/nginx/conf.d/default.confdepends_on:-backendnetworks:-app-network9. 多阶段构建阶段目标减小镜像体积提高安全性。Docker 官方推荐使用 multi-stage builds多阶段构建可以把构建环境和运行环境分离从而显著减少镜像体积和攻击面。(Docker Documentation)例如前端项目FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:alpine COPY --frombuild /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 重启示例镜像 tagmy-app:2026-04-28 my-app:v1.2.0 my-app:commit-abc123不要只用my-app:latest11. 监控、日志、排错阶段目标项目出问题时能定位。常用命令dockerpsdockerlogs-fcontainer_namedockerinspect container_namedockerexec-itcontainer_nameshdockerstatsdockercomposepsdockercompose logs-f排查方向问题排查命令容器启动失败docker logs 容器名端口访问不了docker ps、安全组、防火墙数据库连不上检查网络、容器名、环境变量镜像太大检查 Dockerfile、多阶段构建磁盘爆了docker system df容器频繁重启docker logs、restart策略清理命令dockersystemdfdockerimage prunedockercontainer prunedockervolume 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