资讯动态

从会用 Docker 到会造 Docker:从零到企业级部署

发布时间:2026/8/10 17:29:17 来源:尧图企业网站定制
第六章Dockerfile从会用 Docker 到会造 Dockerdocker基础到这里你已经掌握Image 镜像 ↓ Container 容器 ↓ Volume 数据 ↓ Network 网络但是现在你还是主要在用别人做好的镜像docker pull nginx docker pull mysql docker pull redis真正开发工作中公司自己的项目怎么办比如你的项目商城系统 ├── Java代码 ├── 配置文件 ├── 依赖 └── 启动脚本怎么变成company-shop:v1然后服务器docker run company-shop:v1直接运行答案Dockerfile。1. Dockerfile 是什么一句话Dockerfile 是制作 Docker 镜像的说明书。比如做蛋糕普通人买蛋糕Docker自己写配方 ↓ 制作蛋糕Dockerfile就是配方。例如DockerfileFROM ubuntu RUN apt update RUN apt install nginx COPY index.html /var/www/html/ CMD [nginx,-g,daemon off;]意思从 Ubuntu 开始 安装 nginx 复制网页 启动 nginx然后生成镜像my-web:v12. Dockerfile 工作流程完整流程代码 | | ↓ Dockerfile | | ↓ docker build | | ↓ Image 镜像 | | ↓ docker run | | ↓ Container3. 创建第一个 Dockerfile准备目录my-nginx/ ├── Dockerfile └── index.htmlindex.htmlh1Hello Docker/h1DockerfileFROM nginx COPY index.html /usr/share/nginx/html/解释FROM基础镜像。格式FROM 镜像名例如FROM nginx意思基于 nginx 制作。类似站在别人肩膀上开发COPY复制文件。格式COPY 本地文件 容器路径例如COPY index.html /usr/share/nginx/html/结果容器里面/usr/share/nginx/html/index.html4. 构建镜像进入目录cd my-nginx执行docker build -t my-nginx:v1 .解释build创建镜像。-ttag。例如-t my-nginx:v1名字my-nginx 版本 v1.当前目录。Docker 会寻找./Dockerfile构建过程你会看到Step 1/2 FROM nginx Step 2/2 COPY index.html成功Successfully built abc123查看docker images出现my-nginx v15. 运行自己制作的镜像启动docker run \ -d \ -p 8080:80 \ my-nginx:v1访问localhost:8080看到Hello Docker成功。你第一次造出了自己的镜像。6. Dockerfile 常用指令大全Dockerfile 最重要的几个FROM RUN COPY ADD WORKDIR ENV EXPOSE CMD ENTRYPOINT下面逐个讲。7. FROM基础镜像。必须第一行。例如PythonFROM python:3.12JavaFROM openjdk:17NodeFROM node:20选择基础镜像开发ubuntu debian生产alpine slim例如推荐FROM python:3.12-slim不要FROM ubuntu然后自己安装 Python。浪费空间。8. RUN执行 Linux 命令。例如RUN apt update安装RUN apt install -y nginx例如FROM ubuntu RUN apt update RUN apt install -y curl构建时执行。不是运行容器时执行。9. RUN 合并优化错误RUN apt update RUN apt install nginx RUN apt clean会产生很多层。优化RUN apt update \ apt install -y nginx \ apt clean减少镜像大小。10. COPY复制文件。例如项目app/ ├── Dockerfile └── app.pyDockerfileCOPY app.py /app/结果容器/app/app.py11. WORKDIR设置工作目录。例如WORKDIR /app之后COPY app.py .等于COPY app.py /app/推荐不要RUN cd /app因为下一层失效。使用WORKDIR /app12. ENV设置环境变量。例如ENV PORT8080容器里面echo $PORT输出8080常见数据库MYSQL_ROOT_PASSWORD程序JAVA_OPTS13. EXPOSE声明端口。例如EXPOSE 8080注意它不会真正打开端口。真正需要-p例如docker run -p 8080:8080 app14. CMD非常重要指定容器启动后执行什么。例如CMD [python,app.py]容器启动自动python app.py例如Python项目DockerfileFROM python:3.12 WORKDIR /app COPY app.py . CMD [python,app.py]运行docker run my-python自动python app.py15. ENTRYPOINT和 CMD 很像。区别CMD容易被覆盖。ENTRYPOINT固定执行。例如ENTRYPOINT [python] CMD [app.py]运行docker run image执行python app.py运行docker run image test.py执行python test.py16. CMD 和 ENTRYPOINT 区别记忆ENTRYPOINT 主程序 CMD 默认参数例如ENTRYPOINT python CMD app.py组合python app.py17. 一个真实 Python 项目 Dockerfile项目my-api ├── app.py ├── requirements.txt └── Dockerfilerequirementsflask requestsDockerfileFROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY app.py . EXPOSE 5000 CMD [python,app.py]构建docker build -t my-api:v1 .运行docker run \ -d \ -p 5000:5000 \ my-api:v118. 镜像分层和缓存高手必须懂DockerfileFROM python COPY requirements.txt . RUN pip install -r requirements.txt COPY code .为什么这样写因为Docker缓存。第一次安装依赖 复制代码第二次改代码Docker发现requirements没变。所以不用重新安装。速度快。错误写法COPY . . RUN pip install -r requirements.txt每次代码变化重新安装依赖。慢。19. 多阶段构建高级生产非常常见。例如Java项目第一阶段编译JDK 源码 jar第二阶段运行JRE jar结构阶段1 maven ↓ 生成 jar 阶段2 jdk小镜像 ↓ 运行jar优势镜像巨大减少。20. 企业 Dockerfile 标准思路通常1. 选择小基础镜像 2. 固定版本 3. 设置WORKDIR 4. 先复制依赖 5. 安装依赖 6. 再复制代码 7. 设置启动命令 8. 不使用root用户21. 常见错误错误1Dockerfile名字错误dockerfile应该Dockerfile大小写敏感。错误2COPY路径错误例如COPY app.py /app但是文件不在当前目录。错误3容器启动马上退出原因CMD执行完结束。例如错误CMD [echo,hello]输出hello然后容器退出。本章核心命令功能命令构建镜像docker build查看镜像docker images查看构建历史docker history删除镜像docker rmi运行镜像docker run第七章Docker Compose多容器项目管理神器到现在你已经会✅ 拉镜像✅ 创建容器✅ 数据持久化✅ 容器网络✅ 制作自己的镜像但是你会发现一个问题真实项目不是一个容器。例如一个电商网站用户 | ↓ Nginx容器 | ↓ Java后端容器 | ----------------- | | ↓ ↓ MySQL容器 Redis容器如果不用 Compose你可能需要docker run nginx ... docker run java ... docker run mysql ... docker run redis ...几十个参数。非常痛苦。Docker Compose 解决用一个配置文件管理整个应用。1. Docker Compose 是什么一句话Docker Compose 是用 YAML 文件描述多个 Docker 容器然后一键启动、停止、管理整个系统。以前docker run ... docker run ... docker run ...现在docker compose up全部启动。2. Compose 的核心文件名字docker-compose.yml例如services: nginx: mysql: redis:它描述有哪些服务使用什么镜像端口网络数据卷环境变量3. 第一个 Compose 示例创建目录my-project/ └── docker-compose.yml内容services: nginx: image: nginx ports: - 8080:80解释services服务列表services:下面每个就是一个容器。nginx服务名字nginx:你自己定义。image使用哪个镜像image: nginx等价docker run nginxports端口ports: - 8080:80等价-p 8080:804. 启动 Compose进入目录cd my-project执行docker compose upDocker自动创建网络拉镜像创建容器启动服务后台启动docker compose up -d查看docker compose ps类似NAME my-project-nginx-1 STATUS running停止docker compose down5. Compose 自动创建网络以前我们需要docker network create app-netCompose自动创建。例如services: mysql: image: mysql backend: image: my-app自动network: my-project_default两个容器自动加入。6. Compose 实战MySQL Redis完整例子services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 ports: - 3306:3306 redis: image: redis ports: - 6379:6379启动docker compose up -d现在两个服务一起运行。7. 数据卷 Volume Compose生产数据库必须保存数据。修改services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:重点下面volumes: mysql_data:表示创建 Docker Volume。等价docker volume create mysql_data8. 环境变量管理不要直接写密码MYSQL_ROOT_PASSWORD: 123456生产使用.env例如项目project/ ├── docker-compose.yml └── .env.env:MYSQL_PASSWORD123456compose:environment: MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}启动时自动读取。9. 完整项目案例现在模拟真实网站结构shop/ ├── docker-compose.yml ├── backend/ │ └── Dockerfile └── nginx/ └── nginx.conf包含Nginx后端MySQLRedisdocker-compose.ymlservices: nginx: image: nginx ports: - 80:80 depends_on: - backend backend: build: ./backend depends_on: - mysql - redis mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - mysql_data:/var/lib/mysql redis: image: redis volumes: mysql_data:启动docker compose up -d一次启动nginx | backend | mysql redis10. depends_on 是什么例如backend: depends_on: - mysql意思启动 backend 前先启动 mysql。但是注意它不代表mysql 已经完全准备好。例如MySQL启动需要10秒。backend可能马上连接失败。生产需要healthcheck。11. healthcheck生产技巧例如MySQLmysql: image: mysql:8.0 healthcheck: test: [ CMD, mysqladmin, ping ] interval: 10s意思Docker 检查MySQL 是否真的可用。12. build 自己的镜像Compose 不只是 image。可以backend: build: context: ./backend意思读取backend/Dockerfile自动构建。等价docker build13. image 和 build 区别image使用别人已有镜像image: mysql类似docker pull mysqlbuild自己制作build: ./app类似docker build .14. 查看日志所有服务docker compose logs实时docker compose logs -f指定docker compose logs nginx15. 重启服务全部docker compose restart指定docker compose restart backend16. 进入 Compose 容器例如进入 backenddocker compose exec backend bash类似docker exec -it backend bash17. 更新代码后的流程开发修改代码。重新构建docker compose build重新启动docker compose up -d18. Compose 文件版本思维以前version: 3现在新版 Docker Compose通常可以省略。推荐services:直接开始。19. 企业真实部署流程开发代码 | Dockerfile | 镜像 | docker-compose.yml服务器git clone 项目 cd 项目 docker compose up -d整个系统上线。20. Compose 常用命令总结功能命令启动docker compose up后台启动docker compose up -d停止删除docker compose down查看状态docker compose ps查看日志docker compose logs进入容器docker compose exec重新构建docker compose build重启docker compose restart第八章Docker 部署真实项目从开发到上线前面你已经掌握 Docker 的核心技术镜像 Image ↓ 容器 Container ↓ 数据 Volume ↓ 网络 Network ↓ Dockerfile ↓ Compose现在进入真正工作场景一个项目如何从代码变成线上运行的网站我们模拟一个真实互联网项目。1. 一个真实网站的结构假设我们开发一个商城技术栈前端Vue后端Spring Boot数据库MySQL缓存Redis入口Nginx最终结构用户浏览器 | | ↓ Nginx容器 (80/443端口) | ---------------------- | | ↓ ↓ Vue静态文件 Spring Boot | ------------------ | ↓ MySQL | ↓ Redis2. 服务器准备一般公司服务器Linux例如Ubuntu 22.04安装DockerDocker Compose检查docker version查看docker compose version3. 项目目录设计企业常见例如shop-system/ ├── docker-compose.yml ├── nginx/ │ └── nginx.conf ├── backend/ │ ├── Dockerfile │ └── app.jar ├── frontend/ │ ├── Dockerfile │ └── dist/ └── mysql/ └── init.sql4. 部署后端 Spring Boot假设已经打包app.jar目录backend/ ├── Dockerfile └── app.jarDockerfileFROM eclipse-temurin:17-jdk WORKDIR /app COPY app.jar . EXPOSE 8080 CMD [java,-jar,app.jar]解释FROMJava环境FROM eclipse-temurin:17-jdk提供JDK17。COPY复制COPY app.jar .进入/app/app.jarCMD启动CMD [java,-jar,app.jar]构建docker build -t shop-backend:v1 .测试docker run \ -p 8080:8080 \ shop-backend:v1访问localhost:80805. 部署 Vue 前端Vue 项目开发npm run build生成dist/里面index.html assets/DockerfileFROM nginx COPY dist/ /usr/share/nginx/html/ EXPOSE 80构建docker build \ -t shop-frontend:v1 .运行docker run \ -d \ -p 80:80 \ shop-frontend:v1访问http://服务器IP看到网页。6. 为什么需要 Nginx很多新人疑惑Vue 可以直接运行为什么还需要 Nginx因为 Vue 打包后本质HTML CSS JS 图片只是静态文件。Nginx 擅长提供静态文件反向代理HTTPS负载均衡7. Nginx 反向代理后端用户访问/api/user希望转给Spring Boot:8080配置nginx.confserver { listen 80; location / { root /usr/share/nginx/html; index index.html; } location /api/ { proxy_pass http://backend:8080; } }重点proxy_pass代理。8. 使用 Compose 管理整个系统最终docker-compose.ymlservices: nginx: image: nginx ports: - 80:80 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf depends_on: - backend backend: build: ./backend environment: DB_HOST: mysql REDIS_HOST: redis depends_on: - mysql - redis mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123456 volumes: - mysql_data:/var/lib/mysql redis: image: redis volumes: mysql_data:启动docker compose up -d结果CONTAINER nginx backend mysql redis全部启动。9. 数据库连接为什么写 mysql注意Spring 配置以前spring.datasource.url jdbc:mysql://127.0.0.1:3306/shopDocker错误。应该jdbc:mysql://mysql:3306/shop原因Docker 网络 DNS。backend 查询 mysql ↓ Docker DNS ↓ MySQL容器10. 环境变量管理生产不要写死密码。错误MYSQL_ROOT_PASSWORD:123456推荐.env文件MYSQL_PASSWORDxxxxxx MYSQL_DATABASEshopcomposeenvironment: MYSQL_ROOT_PASSWORD:${MYSQL_PASSWORD}11. 自动重启服务器重启怎么办添加restart: always例如backend: restart: always效果服务器重启Docker自动启动服务。12. 查看线上日志网站打不开第一件事看日志。Nginxdocker compose logs nginx后端docker compose logs backend实时docker compose logs -f backend13. 进入线上容器排查例如后端docker compose exec backend bash检查ls环境env网络ping mysql14. 更新版本怎么做比如代码修改。流程1. 拉代码git pull2. 重新构建docker compose build3. 重启docker compose up -d完成升级。15. 零停机部署进阶大公司不会直接停止旧版本 启动新版本因为会中断。使用蓝绿部署Nginx | ---------------- | | v1容器 v2容器 旧版本 新版本测试 v2成功切换流量。16. Docker 日志管理默认日志存在/var/lib/docker/containers/长期运行会爆。配置限制大小{ log-driver:json-file, log-opts:{ max-size:10m, max-file:3 } }生产必须做。17. Docker 安全基础不要直接 root。Dockerfile错误USER root推荐创建用户RUN useradd app USER app不要随便暴露端口。例如数据库3306不应该开放公网。18. Docker 生产检查清单上线前镜像✅ 固定版本不要latest数据✅ Volume数据库必须持久化。网络✅ 自定义 network密码✅ 环境变量日志✅ 限制大小重启✅ restart安全✅ 非 root19. 一个真实服务器上线流程公司常见开发电脑 ↓ 提交 Git ↓ CI/CD 自动构建 ↓ Docker build ↓ 推送镜像仓库 ↓ 服务器 pull 镜像 ↓ docker compose up -d ↓ 上线

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价