「在我机器上能跑」是部署中最头疼的问题。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 编排,多服务项目也能一条命令完成部署,非常适合团队协作和持续集成。
这个教程对于初学者来说非常友好,谢谢!
关于数据卷的使用,有什么需要注意的吗?
Docker Compose的使用很方便,能否详细介绍一下?
请问Dockerfile中如何设置环境变量?
这个教程非常详细,学到了很多关于Dockerfile的知识。