一、Docker核心概念與架構
1.1 Docker技術棧
1.2 容器與虛擬機對比
特性 | 容器 | 虛擬機 |
---|---|---|
啟動速度 | 秒級 | 分鐘級 |
資源占用 | MB級 | GB級 |
隔離性 | 進程級 | 系統級 |
鏡像大小 | 10-100MB | 1-10GB |
運行性能 | 接近原生 | 有損耗 |
二、Docker全生命周期管理
2.1 容器操作核心命令
# 容器全生命周期管理
docker create # 創建容器但不啟動
docker start # 啟動已停止的容器
docker stop # 優雅停止容器(發送SIGTERM)
docker kill # 強制停止容器(發送SIGKILL)
docker pause # 凍結容器進程
docker unpause # 恢復容器運行# 高級日志管理(支持JSON日志驅動)
docker logs --tail 100 -f --since 10m container_id# 容器資源監控
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
2.2 鏡像深度管理
# 鏡像構建全流程
docker build -t myapp:v1 --build-arg ENV=prod --no-cache .# 多階段構建示例(減少最終鏡像大小)
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myappFROM alpine:latest
COPY --from=builder /app/myapp .
CMD ["./myapp"]# 鏡像安全掃描
docker scan myapp:v1
2.3 存儲與卷管理
# 創建持久化卷
docker volume create db_data# 卷深度檢查
docker volume inspect db_data | grep Mountpoint# 綁定掛載與卷掛載對比
docker run -v /host/path:/container/path # 綁定掛載
docker run -v db_data:/container/path # 卷掛載(推薦)
三、生產級容器部署指南
3.1 Redis高可用部署
# 使用自定義配置文件(重要安全配置)
docker run -d --name redis \-p 6379:6379 \-v /data/redis/redis.conf:/usr/local/etc/redis/redis.conf \-v redis_data:/data \--sysctl net.core.somaxconn=1024 \--memory 1g \--cpus 2 \redis:7.0 redis-server /usr/local/etc/redis/redis.conf# redis.conf關鍵配置:
requirepass YourStrongPassword
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
3.2 MySQL生產配置
# 帶性能調優參數的啟動
docker run -d --name mysql \-p 3306:3306 \-v mysql_data:/var/lib/mysql \-v /etc/mysql/conf.d:/etc/mysql/conf.d \-e MYSQL_ROOT_PASSWORD=ComplexPassw0rd! \-e MYSQL_DATABASE=app_db \-e MYSQL_USER=app_user \-e MYSQL_PASSWORD=UserPassword123 \--innodb_buffer_pool_size=1G \--innodb_log_file_size=256M \mysql:8.0.23 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_unicode_ci
3.3 Elasticsearch集群部署
# docker-compose-cluster.yml
version: '3.8'
services:es01:image: elasticsearch:7.14.0container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms4g -Xmx4g"ulimits:memlock:soft: -1hard: -1volumes:- es_data01:/usr/share/elasticsearch/dataports:- 9200:9200networks:- elastic# es02, es03配置類似...
volumes:es_data01, es_data02, es_data03
networks:elastic:driver: bridge
四、高級網絡與安全
4.1 網絡模式對比
網絡模式 | 特點 | 適用場景 |
---|---|---|
bridge | 默認NAT網絡 | 單機多容器通信 |
host | 直接使用宿主機網絡 | 高性能網絡應用 |
overlay | 跨主機容器網絡 | Swarm/K8s集群 |
macvlan | 容器具有MAC地址 | 傳統網絡集成 |
none | 無網絡 | 特殊安全場景 |
4.2 安全加固實踐
# 1. 使用非root用戶運行容器
docker run -u 1000:1000 myapp# 2. 啟用AppArmor配置文件
docker run --security-opt apparmor=my_profile# 3. 只讀文件系統(除必要目錄)
docker run --read-only -v /tmp:/tmp# 4. 禁用特權模式
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE# 5. 定期更新鏡像
docker pull official_image:latest
五、容器編排基礎
5.1 Docker Compose全棧部署
# docker-compose-fullstack.yml
version: '3.8'
services:frontend:image: nginx:1.22.0ports:- "80:80"volumes:- ./frontend:/usr/share/nginx/htmldepends_on:- backendbackend:build: ./backendenvironment:- DB_HOST=db- REDIS_HOST=redisdeploy:resources:limits:cpus: '0.5'memory: 512Mdb:image: postgres:13volumes:- pg_data:/var/lib/postgresql/dataenvironment:POSTGRES_PASSWORD: dbpasswordredis:image: redis:7.0command: redis-server --requirepass redispassvolumes:pg_data:
六、企業級應用部署
6.1 Nexus私有倉庫集群
# 啟動Nexus主節點
docker run -d -p 8081:8081 \--name nexus-primary \-v nexus-data:/nexus-data \-e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g" \sonatype/nexus3# 配置集群節點
docker run -d -p 8082:8081 \--name nexus-replica \-v nexus-data-replica:/nexus-data \-e NEXUS_CLUSTER_NODE_ID=replica01 \-e NEXUS_CLUSTER_PRIMARY_NODE_URL=http://primary-ip:8081 \sonatype/nexus3
6.2 Jenkins CI/CD流水線容器
# Jenkins Dockerfile with pre-installed tools
FROM jenkins/jenkins:lts-jdk11USER root
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - && \apt-get install -y nodejs python3 docker-ce-cliUSER jenkins
COPY plugins.txt /usr/share/jenkins/ref/
RUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
七、監控與排錯體系
7.1 容器監控方案
# Prometheus + cAdvisor + Grafana 部署
docker run -d \--name=cadvisor \--volume=/:/rootfs:ro \--volume=/var/run:/var/run:ro \--volume=/sys:/sys:ro \--publish=8080:8080 \google/cadvisor# 日志集中管理
docker run -d \--name logspout \--volume=/var/run/docker.sock:/var/run/docker.sock \gliderlabs/logspout \syslog+tls://logs.example.com:514
7.2 故障診斷工具箱
工具 | 用途 | 安裝方式 |
---|---|---|
nsenter | 進入容器命名空間 | apt-get install util-linux |
weave scope | 容器拓撲可視化 | docker run -d --name scope |
ctop | 容器資源監控 | docker run --rm -ti quay.io/vektorlab/ctop |
dive | 鏡像層分析 | docker run --rm -ti wagoodman/dive |
八、容器安全合規
8.1 Docker安全掃描
# 使用Trivy進行漏洞掃描
docker run --rm \-v /var/run/docker.sock:/var/run/docker.sock \aquasec/trivy image myapp:latest# CIS基準檢測
docker run -it --net host --pid host \--cap-add audit_control \-v /var/lib:/var/lib \-v /var/run/docker.sock:/var/run/docker.sock \docker/docker-bench-security
8.2 合規性配置
-
禁止特權容器
docker run --privileged
→ 禁止使用 -
文件系統保護
docker run \--read-only \--tmpfs /tmp:rw,size=50m \myapp
-
網絡隔離
docker network create --internal private_net docker run --net private_net --rm alpine
九、附錄:企業級最佳實踐
9.1 鏡像構建原則
-
最小化基礎鏡像
Alpine (5MB) > Distroless > Ubuntu (72MB) -
多階段構建
分離編譯環境和運行環境 -
單進程原則
每個容器只運行一個主進程
9.2 資源配額管理
# 內存限制(含OOM優先級)
docker run -m 512m --oom-kill-disable --oom-score-adj 500# CPU限制(CFS調度器)
docker run --cpus=1.5 --cpu-shares=512# 塊I/O限制
docker run --device-read-bps /dev/sda:1mb
9.3 零信任網絡策略
# 默認拒絕所有流量
docker network create --driver bridge \--opt com.docker.network.bridge.enable_icc=false \isolated_net# 按需開放端口
docker run -p 8080:8080/tcp --publish 53:53/udp
更新日期:2025年7月8日
適用版本:Docker CE 25.0+ / Engine 26.0+
如需PDF版本或容器安全自查清單,請聯系作者獲取。