后端与运维

Docker 快速入门:从零到部署

一篇搞定 Docker 核心概念和常用命令,学会用容器化方式部署应用。

站长 13 分钟阅读

Docker 快速入门:从零到部署

Docker 让应用的打包、分发和部署变得简单一致。本文带你从零开始掌握 Docker。

一、核心概念

三个基本概念

概念类比说明
镜像 (Image)程序只读模板,包含运行应用所需的一切
容器 (Container)进程镜像的运行实例
仓库 (Registry)应用商店存储和分发镜像(如 Docker Hub)

Docker 架构

开发者 → 构建镜像 → 推送到仓库 → 服务器拉取 → 运行容器

二、安装与配置

安装 Docker

# macOS / Windows:下载 Docker Desktop
# https://www.docker.com/products/docker-desktop

# Linux (Ubuntu)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER  # 当前用户加入 docker 组

验证安装

docker --version
docker run hello-world

配置镜像加速

// ~/.docker/daemon.json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com"
  ]
}

三、常用命令

镜像操作

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 构建镜像
docker build -t myapp:1.0 .

容器操作

# 运行容器
docker run -d --name web -p 8080:80 nginx:latest

# 查看运行中的容器
docker ps

# 查看所有容器(包括停止的)
docker ps -a

# 停止/启动/重启容器
docker stop web
docker start web
docker restart web

# 查看容器日志
docker logs -f web

# 进入容器
docker exec -it web bash

# 删除容器
docker rm web

# 删除所有停止的容器
docker container prune

run 命令参数详解

docker run \
  -d                    # 后台运行 \
  --name myapp          # 容器名称 \
  -p 3000:3000          # 端口映射 主机:容器 \
  -v $(pwd)/data:/data  # 挂载卷 主机:容器 \
  -e NODE_ENV=production # 环境变量 \
  --memory=512m         # 内存限制 \
  --cpus=1.0            # CPU 限制 \
  myapp:latest

四、编写 Dockerfile

Node.js 应用示例

# 基础镜像
FROM node:20-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件(利用缓存层)
COPY package*.json ./

# 安装依赖
RUN npm ci --production

# 复制源代码
COPY . .

# 构建应用
RUN npm run build

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["npm", "start"]

多阶段构建

# 阶段1:构建
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 阶段2:运行(更小的镜像)
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Dockerfile 最佳实践

  1. 使用小镜像 — 优先 alpine 版本
  2. 利用缓存 — 先 COPY 依赖文件,再 COPY 源码
  3. 多阶段构建 — 构建和运行分离
  4. 不要运行 root — 添加非特权用户
  5. .dockerignore — 排除不需要的文件
# .dockerignore
node_modules
dist
.git
*.md
.env

五、Docker Compose

多容器编排工具,用一个 YAML 文件定义所有服务:

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
    depends_on:
      - db
    restart: always

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:

Compose 常用命令

# 启动所有服务(后台)
docker compose up -d

# 查看日志
docker compose logs -f

# 停止并删除容器
docker compose down

# 重新构建并启动
docker compose up -d --build

# 查看服务状态
docker compose ps

六、数据管理

Volume(推荐)

# 创建卷
docker volume create mydata

# 挂载卷
docker run -v mydata:/data myapp

# 查看卷
docker volume ls
docker volume inspect mydata

Bind Mount(开发用)

# 挂载主机目录
docker run -v /host/path:/container/path myapp

# 只读挂载
docker run -v /host/path:/container/path:ro myapp

七、网络

# 创建网络
docker network create mynet

# 容器加入网络
docker run --network mynet --name app myapp

# 同一网络内容器可通过名称互访
docker run --network mynet --name db postgres
# app 容器内可以用 db:5432 访问数据库

总结

Docker 的学习曲线虽然一开始有些陡峭,但掌握后的效率提升是巨大的:

  • 一致性 — 开发、测试、生产环境完全相同
  • 隔离性 — 每个应用独立运行,互不干扰
  • 可移植 — 一处构建,处处运行
  • 版本管理 — 镜像可以打标签,方便回滚

开始你的容器化之旅吧!🐳