### [Docker 容器化源码部署:Dockerfile 与 Compose 编排实战](https://8maoku.com/topic/2469) **Published:** 2026-09-02T10:39:12 **Author:** maoku **Excerpt:** 用 Docker 把源码打成镜像、一键启动,再用 docker-compose 编排多服务,实现环境隔离与跨机… 「在我机器上能跑」是部署中最头疼的问题。**Docker** 把应用和它的运行环境一起打包成镜像,到任何装了 Docker 的机器上都能一致运行,从根本上消灭环境差异。 ## 一、安装 Docker ``` curl -fsSL https://get.docker.com | bash systemctl enable --now docker ``` 再安装 Compose 插件(新版已内置为 `docker compose` 子命令)。 ## 二、编写 Dockerfile 以一个 Node 应用为例,在源码根目录创建 `Dockerfile`: ``` FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:20-alpine WORKDIR /app COPY --from=build /app/dist ./dist COPY --from=build /app/package*.json ./ RUN npm ci --omit=dev EXPOSE 3000046 CMD ["node", "dist/server.js"] ``` 要点:多阶段构建减小镜像体积;用 `alpine` 基础镜像;依赖层与源码层分离以利用构建缓存。 ## 三、构建与运行 ``` docker build -t myapp:1.0 . docker run -d --name myapp -p 3000:3000 --restart=always myapp:1.0 ``` `--restart=always` 实现开机自启与崩溃自动拉起。 ## 四、数据卷与配置 ``` docker run -d -v /data/myapp:/app/data -v /etc/myapp/config:/app/config myapp:1.0 ``` 把可变数据(数据库文件、上传目录、配置)挂载到宿主机,容器本身保持无状态,升级时直接换镜像即可。 ## 五、docker-compose 编排多服务 ``` services: app: build: . ports: - "3000:3000" environment: DB_URL: mysql://db:3306/app depends_on: - db db: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: secret volumes: - dbdata:/var/lib/mysql volumes: dbdata: ``` 一条命令拉起整套服务:`docker compose up -d`。 ## 六、常用运维命令 - 查看日志:`docker logs -f myapp` - 进入容器排查:`docker exec -it myapp sh` - 查看资源占用:`docker stats` - 清理无用镜像:`docker image prune` 容器化的最大收益是「一致性」和「可迁移」。配合 Compose 编排,多服务项目也能一条命令完成部署,非常适合团队协作和持续集成。 **Comments:** **微信用户:** 这个教程对于初学者来说非常友好,谢谢! **野生码农:** 关于数据卷的使用,有什么需要注意的吗? **秃头码农:** Docker Compose的使用很方便,能否详细介绍一下? **暴躁码农:** 请问Dockerfile中如何设置环境变量? **温柔码农:** 这个教程非常详细,学到了很多关于Dockerfile的知识。 ---