目录
如何用 Docker 打包部署你的应用?Docker 完全指南
作者:文文
什么是 Docker?
Docker 是一个容器化平台,允许你将应用及其依赖打包成一个轻量级的、可移植的容器,在任何环境中运行。
Docker vs 虚拟机
| 特性 | Docker | 虚拟机 |
|---|---|---|
| 启动时间 | 秒级 | 分钟级 |
| 内存占用 | 数十 MB | 数 GB |
| 隔离级别 | 进程级 | 系统级 |
| 可移植性 | 极高 | 一般 |
核心概念
镜像(Image)
镜像是一个只读的模板,包含应用和所有依赖。
容器(Container)
容器是镜像的运行实例。
仓库(Repository)
Docker Hub 等仓库存储和分享镜像。
Dockerfile 编写
基础示例:Node.js 应用
# 使用官方 Node.js 镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package 文件
COPY package*.json ./
# 安装依赖
RUN npm ci --only=production
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["node", "index.js"]
Python Flask 应用
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]
构建镜像
# 构建镜像
docker build -t myapp:1.0 .
# 给镜像打标签
docker tag myapp:1.0 registry.example.com/myapp:latest
# 查看镜像列表
docker images
运行容器
# 基础运行
docker run myapp:1.0
# 后台运行,暴露端口
docker run -d -p 3000:3000 --name myapp-container myapp:1.0
# 进入容器
docker exec -it myapp-container /bin/bash
# 查看日志
docker logs -f myapp-container
# 停止和删除容器
docker stop myapp-container
docker rm myapp-container
Docker Compose 编排多个容器
完整示例:Web + Database
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/myapp
depends_on:
- db
networks:
- app-network
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- app-network
volumes:
postgres-data:
networks:
app-network:
driver: bridge
运行 Docker Compose
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
最佳实践
1. 使用轻量级基础镜像
# 好
FROM python:3.11-slim
# 不好
FROM python:3.11
2. 多阶段构建
# 编译阶段
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
3. 合并 RUN 命令
# 不好:每条 RUN 都创建一层
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get clean
# 好:合并成一条
RUN apt-get update && apt-get install -y curl && apt-get clean
4. 使用 .dockerignore
node_modules
.git
.env
.DS_Store
推送到仓库
# 登录 Docker Hub
docker login
# 推送镜像
docker push username/myapp:1.0
# 从仓库拉取
docker pull username/myapp:1.0
常用命令速查表
# 镜像相关
docker images # 列表镜像
docker build -t tag . # 构建镜像
docker push image:tag # 推送镜像
docker rmi image:tag # 删除镜像
# 容器相关
docker run [options] image # 运行容器
docker ps # 列出运行中的容器
docker ps -a # 列出所有容器
docker stop container # 停止容器
docker rm container # 删除容器
docker logs container # 查看日志
# 网络相关
docker network ls # 列出网络
docker network create # 创建网络
总结
Docker 让应用部署变得简单、一致、可重复。掌握 Docker 是现代开发者的必备技能。
文文,2026 年 3 月 16 日
