如何用 Docker 打包部署你的应用?一篇文章搞定 Docker 的所有核心概念

深入讲解 Docker 的核心概念、Dockerfile 编写、镜像构建、容器运行、容器编排等内容,帮助你快速掌握容器化部署。

如何用 Docker 打包部署你的应用?一篇文章搞定 Docker 的所有核心概念
目录

如何用 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 日

相关文章

技术 · 2026-03-21GitHub Actions 自动部署里的 SSH Key 是什么?公钥私钥怎么用?一篇讲透技术 · 2026-03-21FastAPI 后端 Docker + GHCR + GitHub Actions 自动部署实践技术 · 2026-03-16深入理解 Kubernetes:从容器编排到微服务架构的完整学习路线