从零开始玩转 Docker:一站式入门指南 (附带生产级别)

从零开始玩转 Docker:一站式入门指南(附带生产级别)

本文从零开始讲解 Docker 的核心概念、安装部署和生产环境最佳实践,包含可直接用于生产的示例代码

一、Docker 核心概念解析

1.1 Docker 架构图解

用户
Docker Client
Docker Daemon
Images
镜像仓库
Containers
运行容器
Networks
虚拟网络
Volumes
数据卷

1.2 核心概念对比

概念说明类比生产环境重要性
镜像(Image)只读模板程序安装包⭐⭐⭐⭐⭐
容器(Container)镜像的运行实例正在运行的程序⭐⭐⭐⭐⭐
数据卷(Volume)持久化存储移动硬盘⭐⭐⭐⭐⭐
网络(Network)容器间通信网络交换机⭐⭐⭐⭐
仓库(Registry)镜像存储分发中心应用商店⭐⭐⭐⭐

二、生产环境 Docker 安装

2.1 Ubuntu 20.04 安装脚本

#!/bin/bash

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

# 配置生产环境参数
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "10"
  },
  "storage-driver": "overlay2",
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
EOF

# 启动并设置开机自启
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 验证安装
sudo docker run hello-world

# 添加用户到docker组(避免每次sudo)
sudo usermod -aG docker $USER

2.2 生产环境优化配置

# 修改内核参数
cat <<EOF | sudo tee /etc/sysctl.d/docker.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness = 0
vm.overcommit_memory = 1
kernel.panic = 10
kernel.panic_on_oops = 1
EOF

sudo sysctl -p /etc/sysctl.d/docker.conf

# 配置日志轮转
cat <<EOF | sudo tee /etc/logrotate.d/docker
/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  delaycompress
  missingok
  copytruncate
}
EOF

三、Docker 核心命令实战

3.1 容器生命周期管理

# 启动Nginx容器(生产推荐写法)
docker run -d \
  --name web-server \
  --restart=always \
  --cpus 1.0 \
  --memory 512m \
  --publish 80:80 \
  --volume /app/nginx:/etc/nginx \
  nginx:1.21-alpine

# 查看运行容器
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"

# 进入容器排查问题
docker exec -it web-server sh

# 容器状态管理
docker stop web-server    # 停止
docker start web-server   # 启动
docker restart web-server # 重启
docker rm -f web-server   # 强制删除

3.2 镜像管理技巧

# 拉取镜像(指定版本)
docker pull mysql:8.0.27

# 查看镜像详情
docker image inspect mysql:8.0.27

# 清理无用镜像
docker image prune -a --filter "until=24h"

# 导出/导入镜像
docker save -o mysql.tar mysql:8.0.27
docker load -i mysql.tar

四、构建生产级 Docker 镜像

4.1 最佳实践 Dockerfile

# 使用官方最小化镜像
FROM node:16-alpine AS builder

# 设置生产环境变量
ENV NODE_ENV=production \
    PORT=3000

# 安装构建依赖
RUN apk add --no-cache python3 make g++

# 设置工作目录
WORKDIR /app

# 先安装依赖(利用Docker缓存层)
COPY package*.json ./
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 构建应用
RUN npm run build

# ----------------------------------
# 生产运行阶段
FROM node:16-alpine

# 安全加固:使用非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# 从构建阶段复制产物
COPY --from=builder --chown=appuser:appgroup /app /app

WORKDIR /app

# 暴露端口
EXPOSE 3000

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:3000/health || exit 1

# 容器启动命令
CMD ["node", "dist/main.js"]

4.2 镜像构建与扫描

# 构建镜像(带标签)
docker build -t my-app:1.0.0 -t my-app:latest .

# 安全扫描
docker scan my-app:1.0.0

# 推送到私有仓库
docker tag my-app:1.0.0 registry.mycompany.com/app/web:1.0.0
docker push registry.mycompany.com/app/web:1.0.0

五、生产环境容器编排

5.1 Docker Compose 部署示例

version: '3.8'

services:
  web:
    image: registry.mycompany.com/app/web:1.0.0
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    ports:
      - "8080:3000"
    networks:
      - app-net
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  db:
    image: mysql:8.0.27
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
      MYSQL_DATABASE: app_db
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-net
    deploy:
      placement:
        constraints:
          - node.role == manager

  redis:
    image: redis:6-alpine
    command: redis-server --requirepass myredispass
    volumes:
      - redis-data:/data
    networks:
      - app-net

volumes:
  db-data:
    driver: local
    driver_opts:
      type: nfs
      o: addr=nas.mycompany.com,rw
      device: ":/export/dbdata"
  redis-data:

networks:
  app-net:
    driver: overlay
    attachable: true

5.2 部署与管理命令

# 启动整个应用栈
docker stack deploy -c docker-compose.yml myapp

# 查看服务状态
docker service ls

# 扩展web服务实例
docker service scale myapp_web=5

# 滚动更新服务
docker service update \
  --image registry.mycompany.com/app/web:1.1.0 \
  --update-parallelism 2 \
  --update-delay 10s \
  myapp_web

# 查看服务日志
docker service logs -f myapp_web

六、生产环境最佳实践

6.1 安全加固措施

# 容器运行时安全
docker run --security-opt no-new-privileges:true \
  --cap-drop all \
  --cap-add NET_BIND_SERVICE \
  nginx:alpine

# 使用只读文件系统
docker run --read-only \
  --tmpfs /tmp:rw,size=50M \
  my-app:latest

# 配置用户命名空间
echo "dockremap:165536:65536" | sudo tee -a /etc/subuid
echo "dockremap:165536:65536" | sudo tee -a /etc/subgid

6.2 监控与日志

# 使用Prometheus监控
docker run -d \
  --name=prometheus \
  -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

# ELK日志收集
docker run -d \
  --name logstash \
  -v ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
  docker.elastic.co/logstash/logstash:7.14.0

# 容器资源使用统计
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

6.3 备份与恢复

# 备份MySQL数据库容器
docker exec mysql-container sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql

# 备份数据卷
docker run --rm \
  -v db-data:/source \
  -v /backup:/backup \
  alpine \
  tar czf /backup/db-data-$(date +%Y%m%d).tar.gz -C /source .

# 灾难恢复流程
# 1. 恢复数据卷
docker run --rm \
  -v db-data:/target \
  -v /backup:/backup \
  alpine \
  tar xzf /backup/db-data-latest.tar.gz -C /target

# 2. 启动容器
docker run -d \
  --name mysql \
  -v db-data:/var/lib/mysql \
  mysql:8.0

七、生产环境问题排查

7.1 常见问题速查表

问题现象可能原因解决方案
容器启动后立即退出启动命令错误docker logs
端口无法访问防火墙/端口映射错误docker port
磁盘空间不足日志/镜像堆积docker system prune -af
容器间网络不通网络配置错误docker network inspect
容器内存溢出被杀内存限制过小调整–memory参数

7.2 高级诊断工具

# 检查容器内部进程
docker top <container>

# 分析容器文件系统
docker diff <container>

# 容器性能分析
docker run -it --rm --pid=container:<container> \
  busybox top

# 导出容器核心转储
docker inspect --format='{{.State.Pid}}' <container> # 获取PID
gdb -p <PID> -ex "generate-core-file" -ex "quit"

附录:生产环境检查清单

  • 使用非root用户运行容器

  • 设置容器资源限制(CPU/内存)

  • 配置容器重启策略(restart=always)

  • 使用只读根文件系统

  • 配置日志轮转和大小限制

  • 启用容器健康检查

  • 使用私有镜像仓库

  • 定期更新基础镜像

  • 实现持续集成/持续部署(CI/CD)

  • 建立监控告警系统

最终部署架构:

推送代码
触发
构建镜像
部署
开发者
GitLab
Jenkins CI
私有镜像仓库
Kubernetes集群
自动扩缩容
负载均衡
持久化存储
监控系统
日志系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值