从零开始玩转 Docker:一站式入门指南(附带生产级别)
本文从零开始讲解 Docker 的核心概念、安装部署和生产环境最佳实践,包含可直接用于生产的示例代码
一、Docker 核心概念解析
1.1 Docker 架构图解
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)
-
建立监控告警系统
最终部署架构: