1. Docker环境安装前的系统准备
在开始安装Docker之前,我们需要对操作系统环境进行充分准备。不同操作系统和硬件配置下的准备工作差异较大,特别是涉及GPU加速的场景需要特别注意。
1.1 系统要求检查
首先确认你的系统满足Docker的基本运行要求:
- 64位操作系统(x86_64或arm64架构)
- 内核版本不低于3.10(Linux)或对应Windows/macOS的等效版本
- 至少2GB可用内存(生产环境建议4GB以上)
- 管理员权限(sudo或root)
对于Linux系统,可以通过以下命令检查内核版本:
uname -r1.2 虚拟化支持验证
Docker依赖于硬件虚拟化技术,在BIOS中需要确保:
- Intel VT-x或AMD-V虚拟化技术已启用
- 对于Windows系统,需要启用Hyper-V和WSL2功能
可以通过以下方式检查虚拟化是否启用:
- Linux:
grep -E --color 'vmx|svm' /proc/cpuinfo - Windows: 任务管理器→性能选项卡查看"虚拟化"状态
提示:如果遇到"virtualization support not detected"错误,通常需要在BIOS中开启虚拟化选项,不同主板的设置位置可能不同,常见于"Advanced"或"Security"菜单下。
1.3 存储驱动选择
Docker支持多种存储驱动,默认会根据系统自动选择:
- overlay2(推荐用于现代Linux内核)
- aufs
- devicemapper
- btrfs
- zfs
可以通过修改/etc/docker/daemon.json配置文件指定存储驱动:
{ "storage-driver": "overlay2" }2. 主流操作系统下的Docker安装
不同操作系统安装Docker的方式有所差异,下面分别介绍Linux、Windows和macOS三大平台的具体安装步骤。
2.1 Linux系统安装
2.1.1 Ubuntu/Debian系安装
对于基于Debian的发行版,推荐使用官方仓库安装:
# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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 docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装 sudo docker run hello-world2.1.2 CentOS/RHEL系安装
对于基于RHEL的发行版,安装步骤如下:
# 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 安装依赖 sudo yum install -y yum-utils # 添加官方仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker引擎 sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动Docker服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker2.2 Windows系统安装
Windows系统安装Docker Desktop需要注意版本兼容性:
下载Docker Desktop安装包:
- 官网下载地址:https://www.docker.com/products/docker-desktop/
- 确保下载与Windows版本匹配的安装包
安装前准备:
- Windows 10 64位:专业版、企业版或教育版(版本1903或更高)
- 启用WSL2功能(适用于Windows 10 2004及更高版本)
- 启用Hyper-V虚拟化功能
安装步骤:
- 双击下载的Docker Desktop Installer.exe
- 按照向导完成安装
- 安装完成后可能需要重启系统
注意:如果遇到"win10版本低无法安装docker"错误,需要将Windows更新到支持的版本。对于无法升级的系统,可以考虑使用Docker Toolbox作为替代方案。
2.3 macOS系统安装
macOS下的Docker Desktop安装相对简单:
系统要求:
- macOS 10.15 Catalina或更高版本
- 至少4GB内存
- 建议使用Intel芯片或Apple Silicon芯片
安装步骤:
- 下载Docker.dmg安装包
- 双击打开并将Docker图标拖到Applications文件夹
- 首次运行时需要授权安装
- 安装完成后可以在菜单栏看到Docker图标
3. GPU加速环境配置
对于需要使用GPU加速的Docker容器(如深度学习训练),需要额外配置NVIDIA相关组件。
3.1 NVIDIA驱动安装
首先确保主机已安装正确版本的NVIDIA驱动:
# 检查NVIDIA驱动状态 nvidia-smi # Ubuntu下安装驱动 sudo apt-get update sudo apt-get install -y nvidia-driver-510 # 版本号根据需要调整 # CentOS下安装驱动 sudo yum install -y epel-release sudo yum install -y nvidia-driver3.2 NVIDIA Container Toolkit安装
安装NVIDIA Container Toolkit使Docker能够使用GPU:
# 添加仓库 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list # 安装工具包 sudo apt-get update sudo apt-get install -y nvidia-docker2 # 重启Docker服务 sudo systemctl restart docker # 验证安装 docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi3.3 常见GPU相关问题解决
权限问题:
# 将当前用户加入docker组 sudo usermod -aG docker $USER newgrp docker版本兼容性问题:
- 确保Docker版本、NVIDIA驱动版本和CUDA版本兼容
- 参考NVIDIA官方文档的版本匹配表
容器内无法识别GPU:
- 检查是否使用了
--gpus all参数 - 验证nvidia-container-toolkit是否正常运行
- 检查是否使用了
4. Docker配置优化与镜像加速
4.1 国内镜像源配置
为加速镜像拉取,可以配置国内镜像仓库:
// /etc/docker/daemon.json { "registry-mirrors": [ "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://docker.mirrors.ustc.edu.cn" ] }配置后需要重启Docker服务:
sudo systemctl daemon-reload sudo systemctl restart docker4.2 存储与日志配置
为防止Docker占用过多磁盘空间,建议配置日志轮转:
// /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }4.3 网络配置优化
对于需要自定义网络的场景:
# 创建自定义网络 docker network create --driver=bridge --subnet=172.28.0.0/16 my-net # 运行容器时指定网络 docker run --network=my-net -itd --name=container1 my-image5. Docker常用操作与验证
5.1 基础命令验证
安装完成后,可以通过以下命令验证Docker是否正常工作:
# 查看Docker版本信息 docker version # 查看系统信息 docker info # 运行测试容器 docker run hello-world # 查看运行中的容器 docker ps # 查看所有容器 docker ps -a5.2 容器生命周期管理
# 启动容器 docker start <container_id> # 停止容器 docker stop <container_id> # 重启容器 docker restart <container_id> # 删除容器 docker rm <container_id> # 进入运行中的容器 docker exec -it <container_id> /bin/bash5.3 镜像管理
# 拉取镜像 docker pull ubuntu:20.04 # 查看本地镜像 docker images # 删除镜像 docker rmi <image_id> # 构建镜像 docker build -t my-image .6. 常见问题排查
6.1 Docker服务启动失败
可能原因及解决方案:
存储驱动冲突:
# 清理旧的Docker数据 sudo rm -rf /var/lib/docker sudo systemctl restart docker防火墙冲突:
# 临时关闭防火墙 sudo systemctl stop firewalld # 或添加防火墙规则 sudo firewall-cmd --permanent --zone=public --add-port=2375/tcp sudo firewall-cmd --reloadSELinux阻止:
# 临时禁用SELinux sudo setenforce 0 # 或永久禁用(需重启) sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
6.2 容器网络问题
容器无法访问外网:
# 检查DNS配置 docker run --rm busybox nslookup google.com # 如DNS有问题,可以指定DNS服务器 docker run --dns 8.8.8.8 --rm busybox nslookup google.com端口映射失败:
- 确保主机端口未被占用
- 检查防火墙规则
- 验证
-p参数格式正确(主机端口:容器端口)
6.3 权限问题处理
Got permission denied错误:
# 将用户加入docker组 sudo usermod -aG docker $USER newgrp docker容器内权限限制:
# 以root用户运行容器 docker run -u root -it <image> /bin/bash # 或调整容器内文件权限 docker exec <container> chmod 777 /path/to/file
7. 生产环境最佳实践
7.1 安全加固建议
避免使用root用户:
FROM ubuntu RUN useradd -ms /bin/bash appuser USER appuser最小化镜像:
- 使用Alpine基础镜像
- 多阶段构建减少最终镜像大小
敏感信息管理:
# 使用Docker secret管理密码 echo "mysecret" | docker secret create db_password -
7.2 资源限制配置
# 运行容器时限制资源 docker run -it --cpus="1.5" --memory="512m" ubuntu # 查看资源使用情况 docker stats7.3 监控与日志
日志收集:
# 查看容器日志 docker logs <container_id> # 实时查看日志 docker logs -f <container_id>监控工具:
- cAdvisor:容器资源监控
- Prometheus:指标收集与告警
- Grafana:可视化监控数据
8. 进阶配置与工具集成
8.1 Docker Compose使用
# docker-compose.yml示例 version: '3' services: web: image: nginx:alpine ports: - "8080:80" db: image: postgres:13 environment: POSTGRES_PASSWORD: example常用命令:
# 启动服务 docker-compose up -d # 停止服务 docker-compose down # 查看服务状态 docker-compose ps8.2 容器编排工具
Kubernetes:
- 生产级容器编排平台
- 支持自动扩展、服务发现等功能
Swarm:
- Docker原生集群管理工具
- 比Kubernetes更轻量
8.3 CI/CD集成
# GitHub Actions示例 name: Docker Build on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t my-image . - name: Login to Docker Hub run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin - name: Push Docker image run: docker push my-image9. 特定场景下的Docker部署
9.1 数据库容器化
以PostgreSQL为例:
docker run --name some-postgres \ -e POSTGRES_PASSWORD=mysecretpassword \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -v /custom/mount:/var/lib/postgresql/data \ -p 5432:5432 \ -d postgres9.2 微服务部署
# docker-compose.yml version: '3' services: gateway: image: my-gateway ports: - "8080:8080" user-service: image: user-service order-service: image: order-service9.3 前端应用部署
# 多阶段构建示例 FROM node:14 as build WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]10. 维护与升级策略
10.1 定期维护任务
清理无用资源:
# 删除停止的容器 docker container prune # 删除悬空镜像 docker image prune # 删除所有未使用资源 docker system prune镜像更新策略:
- 定期拉取基础镜像更新
- 重建应用镜像应用安全补丁
10.2 Docker版本升级
# Ubuntu/Debian sudo apt-get update sudo apt-get upgrade docker-ce # CentOS/RHEL sudo yum update docker-ce # 验证新版本 docker version10.3 备份与恢复
容器备份:
# 导出容器 docker export <container> > container.tar # 导入为镜像 cat container.tar | docker import - my-image卷备份:
# 备份卷数据 docker run --rm --volumes-from <container> -v $(pwd):/backup ubuntu \ tar cvf /backup/backup.tar /volume/data
11. 性能调优技巧
11.1 容器启动优化
减少启动时间:
- 使用更小的基础镜像(如Alpine)
- 预加载依赖项
- 避免在启动时执行耗时操作
并行启动:
# 使用docker-compose并行启动 docker-compose up --scale service=3
11.2 资源利用率提升
CPU绑定:
# 将容器绑定到特定CPU核心 docker run --cpuset-cpus="0,1" my-image内存优化:
# 设置内存限制和交换空间 docker run -m 512m --memory-swap=1g my-image
11.3 网络性能优化
使用host网络模式:
# 直接使用主机网络栈 docker run --network=host my-image调整MTU值:
# 在daemon.json中配置 { "mtu": 1450 }
12. 安全审计与漏洞管理
12.1 镜像安全扫描
# 使用docker scan命令 docker scan my-image # 使用第三方工具 docker run -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image my-image12.2 运行时保护
只读文件系统:
docker run --read-only my-image能力限制:
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-image
12.3 网络隔离
# 创建自定义网络 docker network create --internal secure-net # 运行内部服务 docker run --network=secure-net internal-service13. 多架构支持与跨平台部署
13.1 多架构镜像构建
# 创建构建器实例 docker buildx create --name mybuilder --use # 构建多架构镜像 docker buildx build --platform linux/amd64,linux/arm64 -t my-image .13.2 跨平台开发技巧
开发环境一致性:
# 指定平台运行 docker run --platform linux/arm64 my-image构建参数传递:
ARG TARGETARCH RUN if [ "$TARGETARCH" = "amd64" ]; then \ echo "x86_64 specific commands"; \ else \ echo "ARM specific commands"; \ fi
14. 企业级部署考量
14.1 私有镜像仓库搭建
# 运行Registry容器 docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /data/registry:/var/lib/registry \ registry:2 # 推送镜像到私有仓库 docker tag my-image localhost:5000/my-image docker push localhost:5000/my-image14.2 访问控制与认证
# 使用htpasswd创建认证 docker run --entrypoint htpasswd httpd:2 -Bbn user password > auth/htpasswd # 运行带认证的Registry docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /data/registry:/var/lib/registry \ -v /data/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \ registry:214.3 高可用部署
Docker Swarm集群:
# 初始化Swarm docker swarm init # 加入工作节点 docker swarm join --token <token> <manager-ip>:2377服务部署:
# 创建服务 docker service create --replicas 3 --name web nginx
15. 新兴技术与Docker集成
15.1 WebAssembly与Docker
# 使用WasmEdge运行WASM应用 FROM wasmedge/slight COPY app.wasm / CMD ["/app.wasm"]15.2 eBPF监控集成
# 使用eBPF工具监控容器 docker run -it --rm \ --privileged \ -v /usr/src:/usr/src \ -v /lib/modules:/lib/modules \ -v /sys/kernel/debug:/sys/kernel/debug \ -v /etc/os-release:/etc/os-release \ aquasec/tracee:latest \ --containers15.3 机密计算支持
# 使用Intel SGX运行机密容器 docker run -it \ --device /dev/sgx/enclave \ --device /dev/sgx/provision \ my-sgx-app16. 实际案例:深度学习环境部署
16.1 TensorFlow GPU环境
FROM nvidia/cuda:11.0-base # 安装Python和TensorFlow RUN apt-get update && apt-get install -y \ python3 \ python3-pip RUN pip3 install tensorflow-gpu==2.4.0 # 设置工作目录 WORKDIR /app COPY . . # 运行训练脚本 CMD ["python3", "train.py"]16.2 PyTorch分布式训练
# docker-compose.yml version: '3' services: worker0: image: pytorch-gpu command: python train.py --rank 0 --world-size 2 deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] worker1: image: pytorch-gpu command: python train.py --rank 1 --world-size 2 deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]17. 实际案例:Web应用全栈部署
17.1 前端+后端+数据库
# docker-compose.yml version: '3' services: frontend: build: ./frontend ports: - "3000:3000" depends_on: - backend backend: build: ./backend environment: DB_HOST: db DB_PORT: 5432 depends_on: - db db: image: postgres:13 environment: POSTGRES_PASSWORD: example volumes: - db-data:/var/lib/postgresql/data volumes: db-data:17.2 负载均衡配置
services: nginx: image: nginx ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - web web: image: my-web-app deploy: replicas: 318. 实际案例:CI/CD流水线集成
18.1 GitLab Runner配置
# config.toml [[runners]] name = "docker-runner" url = "https://gitlab.com/" token = "TOKEN" executor = "docker" [runners.docker] tls_verify = false image = "alpine" privileged = true disable_cache = false volumes = ["/cache"] shm_size = 018.2 Jenkins Pipeline示例
pipeline { agent { docker { image 'maven:3.8.4-jdk-11' args '-v $HOME/.m2:/root/.m2' } } stages { stage('Build') { steps { sh 'mvn clean package' } } stage('Test') { steps { sh 'mvn test' } } stage('Docker Build') { steps { script { docker.build("my-app:${env.BUILD_ID}") } } } } }19. 监控与日志管理实战
19.1 Prometheus监控配置
# docker-compose.yml version: '3' services: prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml node-exporter: image: prom/node-exporter ports: - "9100:9100"19.2 ELK日志收集
services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0 environment: - discovery.type=single-node ports: - "9200:9200" kibana: image: docker.elastic.co/kibana/kibana:7.14.0 ports: - "5601:5601" depends_on: - elasticsearch logstash: image: docker.elastic.co/logstash/logstash:7.14.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf depends_on: - elasticsearch20. 容器化遗留系统迁移
20.1 传统应用容器化步骤
应用分析:
- 识别依赖项
- 确定配置管理方式
- 评估存储需求
Dockerfile编写:
FROM centos:7 # 安装依赖 RUN yum install -y java-1.8.0-openjdk # 复制应用 COPY legacy-app /opt/legacy-app # 暴露端口 EXPOSE 8080 # 启动命令 CMD ["java", "-jar", "/opt/legacy-app/app.jar"]数据迁移:
# 导出原有数据 mysqldump -u root -p database > backup.sql # 在容器中恢复 docker exec -i mysql-container mysql -u root -p database < backup.sql
20.2 渐进式迁移策略
前端先行:
- 先容器化前端组件
- 保持后端服务不变
数据库最后:
- 先迁移应用层
- 最后处理数据库层
流量切换:
- 使用反向代理逐步切换流量
- 监控新系统稳定性