Docker 入门到实践

从零开始学习 Docker,掌握容器化部署的核心概念和常用命令。

Docker 入门到实践

Docker 是现代应用部署的标准工具。本文带你快速入门。

核心概念

镜像 (Image)

镜像是一个只读模板,包含运行应用所需的所有内容。

# 拉取镜像
docker pull node:20-alpine

# 查看本地镜像
docker images

# 删除镜像
docker rmi node:20-alpine

容器 (Container)

容器是镜像的运行实例。

# 运行容器
docker run -d --name my-app -p 3000:3000 node:20-alpine

# 查看运行中的容器
docker ps

# 查看所有容器
docker ps -a

# 停止容器
docker stop my-app

# 删除容器
docker rm my-app

Dockerfile

Dockerfile 定义如何构建镜像:

# 基础镜像
FROM node:20-alpine

# 设置工作目录
WORKDIR /app

# 复制 package 文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY . .

# 构建应用
RUN npm run build

# 暴露端口
EXPOSE 3000

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

多阶段构建

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

# 生产阶段
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/main.js"]

Docker Compose

管理多容器应用:

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/myapp
    depends_on:
      - db
      - redis

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

常用命令

# 启动所有服务
docker-compose up -d

# 查看日志
docker-compose logs -f app

# 停止所有服务
docker-compose down

# 重新构建
docker-compose build --no-cache

# 查看服务状态
docker-compose ps

最佳实践

1. 使用 .dockerignore

node_modules
npm-debug.log
.git
.env
*.md

2. 最小化镜像大小

# 使用 alpine 基础镜像
FROM node:20-alpine

# 只安装生产依赖
RUN npm ci --only=production

# 清理缓存
RUN npm cache clean --force

3. 不要以 root 运行

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001

# 切换用户
USER nextjs

4. 健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

常见问题

容器内访问宿主机

# Linux
docker run --add-host=host.docker.internal:host-gateway ...

# macOS/Windows 自动支持 host.docker.internal

查看容器日志

# 实时日志
docker logs -f container_name

# 最近 100 行
docker logs --tail 100 container_name

进入容器 Shell

docker exec -it container_name sh

总结

Docker 核心命令速查:

命令用途
docker build构建镜像
docker run运行容器
docker ps查看容器
docker logs查看日志
docker exec执行命令
docker-compose up启动服务

掌握这些基础,你就可以开始容器化之旅了!

$cat./comments.md
加载评论中...