Docker 作为现代应用部署的标准工具,已经从最初的手工安装阶段发展到如今的自动化构建和编排时代。这次我们重点梳理从基础安装到高级自动化构建的完整技术路径,帮助开发者建立系统的 Docker 应用能力。
对于需要快速部署多环境应用的团队来说,Docker 的核心价值在于标准化和可移植性。无论是个人开发测试还是企业级生产环境,掌握从手工安装到自动化构建的完整流程,都能显著提升部署效率和系统稳定性。本文将从最基础的手工安装开始,逐步深入到 Docker Compose 多服务编排和自动化构建最佳实践。
1. Docker 核心能力速览
| 能力项 | 说明 |
|---|---|
| 容器化技术 | 应用及依赖打包成可移植容器,实现环境标准化 |
| 跨平台支持 | 支持 Linux、Windows、macOS 等多平台部署 |
| 资源隔离 | 进程、网络、文件系统层面的隔离保障安全性 |
| 快速部署 | 秒级启动,快速扩展和缩容 |
| 镜像管理 | 分层存储机制,节省磁盘空间和传输时间 |
| 编排能力 | Docker Compose 支持多服务统一管理 |
| 集群部署 | 支持 Swarm、Kubernetes 等集群方案 |
Docker 的核心优势在于将应用与环境解耦,解决了"在我这里能跑,在你那里不能跑"的经典问题。通过容器化技术,开发、测试、生产环境保持一致,大幅减少部署过程中的兼容性问题。
2. 适用场景与使用边界
Docker 主要适用于以下场景:
开发环境标准化:新成员加入团队时,无需花费数小时配置开发环境,直接运行 Docker 容器即可获得一致的开发环境。不同项目可能依赖不同版本的运行时(如 Node.js 12.x 与 16.x),通过 Docker 可以轻松管理多版本共存。
微服务架构部署:当应用拆分为多个微服务时,每个服务可以独立容器化,通过 Docker Compose 统一编排。服务间的网络通信、依赖关系、启动顺序都能得到有效管理。
CI/CD 流水线集成:在持续集成环境中,Docker 确保每次构建都在纯净的环境中进行,避免因环境差异导致的构建失败。构建成功的镜像可以直接推送到镜像仓库,用于后续部署。
混合云部署:应用打包为 Docker 镜像后,可以在本地数据中心、公有云、边缘节点等不同环境中无缝迁移,实现真正的跨平台部署。
使用边界方面需要注意:Docker 不适合需要极高性能计算的应用场景,容器化的开销虽然很小,但对于性能极其敏感的应用仍需谨慎评估。对于需要特定内核模块或硬件直通的场景,也需要考虑兼容性问题。
3. 环境准备与前置条件
在开始 Docker 安装前,需要确认系统环境满足基本要求:
操作系统要求:
- Linux:内核版本 3.10 或以上,推荐使用 Ubuntu、CentOS、Linux 等主流发行版
- Windows:Windows 10 或 Windows Server 2016 以上,需要开启 Hyper-V
- macOS:macOS 10.13 或以上版本
硬件资源要求:
- 内存:至少 2GB RAM,建议 4GB 以上
- 磁盘空间:至少 20GB 可用空间
- CPU:支持虚拟化技术(Intel VT-x 或 AMD-V)
系统权限要求:
- Linux 系统需要 root 权限或 sudo 权限
- Windows 需要管理员权限
- 确保网络连接正常,能够访问 Docker Hub 或镜像加速器
端口占用检查:
- Docker 默认使用 2375/2376 端口(守护进程)
- Docker Compose 服务可能占用 80、443、3306、5432 等常用端口
- 使用
netstat -tulpn命令检查端口占用情况
4. Linux 系统手工安装详解
4.1 卸载旧版本 Docker
在安装新版本前,彻底清理旧版本避免冲突:
# 删除 Docker 相关软件源 sudo rm -f /etc/yum.repos.d/docker*.repo sudo rm -f /etc/apt/sources.list.d/*docker*.list # 卸载 Docker 及相关软件包(根据发行版选择对应命令) # 对于 yum/dnf 系系统: sudo dnf -y remove docker moby docker-ce containerd.io docker-ce-rootless-extras docker-buildx-plugin docker-ce-cli docker-compose-plugin # 对于 apt 系系统: for pkg in docker.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg done # 清理残留数据(谨慎操作,会删除所有容器、镜像、卷) sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd4.2 Ubuntu/Debian 系统安装
Ubuntu 系统推荐使用官方仓库安装:
# 更新包管理工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # 添加 Docker 官方 GPG 密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # 添加 Docker 软件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装 Docker 引擎 sudo apt-get update sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin4.3 CentOS/RHEL 系统安装
CentOS 系统使用 yum/dnf 安装:
# 安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 软件源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker 引擎 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 或者使用 dnf(CentOS 8+) sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin4.4 启动 Docker 服务
安装完成后启动并验证 Docker:
# 启动 Docker 服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 验证安装 docker --version docker compose version # 测试运行 hello-world 容器 sudo docker run hello-world4.5 配置非 root 用户权限
避免每次使用 sudo 执行 docker 命令:
# 将当前用户添加到 docker 组 sudo usermod -aG docker $USER # 重新登录或执行以下命令立即生效 newgrp docker # 验证无需 sudo 即可运行 docker 命令 docker ps5. Docker 镜像加速器配置
由于网络原因,从 Docker Hub 拉取镜像可能较慢,配置国内镜像加速器:
# 创建 Docker 配置目录 sudo mkdir -p /etc/docker # 配置镜像加速器(以阿里云为例) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF # 重启 Docker 服务 sudo systemctl daemon-reload sudo systemctl restart docker # 验证配置是否生效 docker info | grep -A 10 "Registry Mirrors"常用镜像加速器地址:
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 中科大:https://docker.mirrors.ustc.edu.cn
- 网易:https://hub-mirror.c.163.com
- 腾讯云:https://mirror.ccs.tencentyun.com
6. Docker 基础操作实战
6.1 镜像管理操作
# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images # 删除镜像 docker rmi nginx:latest # 导出镜像 docker save -o nginx.tar nginx:latest # 导入镜像 docker load -i nginx.tar6.2 容器生命周期管理
# 运行容器(前台模式) docker run -it ubuntu:20.04 /bin/bash # 运行容器(后台模式) docker run -d --name my-nginx -p 80:80 nginx:latest # 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 停止容器 docker stop my-nginx # 启动已停止的容器 docker start my-nginx # 重启容器 docker restart my-nginx # 进入运行中的容器 docker exec -it my-nginx /bin/bash # 查看容器日志 docker logs my-nginx # 删除容器 docker rm my-nginx6.3 端口映射与数据持久化
# 端口映射示例 docker run -d --name webapp -p 8080:80 -p 8443:443 nginx:latest # 数据卷挂载 docker run -d --name mysql-db \ -p 3306:3306 \ -v /host/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:8.0 # 创建命名卷 docker volume create mydata docker run -d -v mydata:/app/data myapp:latest7. Dockerfile 自动化构建
7.1 基础 Dockerfile 编写
创建简单的 Web 应用 Dockerfile:
# 使用官方 Python 运行时作为基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 复制应用代码 COPY . . # 暴露端口 EXPOSE 8000 # 定义环境变量 ENV NAME World # 设置启动命令 CMD ["python", "app.py"]7.2 多阶段构建优化
对于需要编译的应用,使用多阶段构建减小镜像体积:
# 构建阶段 FROM node:16 as builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]7.3 构建和运行自定义镜像
# 构建镜像 docker build -t my-python-app:latest . # 运行自定义镜像 docker run -d -p 8000:8000 --name myapp my-python-app:latest # 推送到镜像仓库 docker tag my-python-app:latest username/my-python-app:latest docker push username/my-python-app:latest8. Docker Compose 多服务编排
8.1 安装 Docker Compose
现代 Docker 版本已包含 Compose 插件:
# 验证是否已安装 docker compose version # 如未安装,单独安装 sudo apt-get update sudo apt-get -y install docker-compose-plugin8.2 编写 docker-compose.yml
创建 WordPress 项目的编排文件:
version: '3.8' services: wordpress: image: wordpress:latest restart: always ports: - "80:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: - wordpress_data:/var/www/html depends_on: - db db: image: mysql:8.0 restart: always environment: MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - db_data:/var/lib/mysql volumes: wordpress_data: db_data:8.3 Compose 服务管理
# 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps # 查看服务日志 docker compose logs docker compose logs wordpress # 停止服务 docker compose down # 停止并删除数据卷 docker compose down -v # 重新构建并启动 docker compose up -d --build # 扩展服务实例数 docker compose up -d --scale wordpress=38.4 复杂应用编排示例
微服务架构的完整编排示例:
version: '3.8' services: frontend: build: ./frontend ports: - "3000:3000" environment: - REACT_APP_API_URL=http://backend:8000/api depends_on: - backend backend: build: ./backend ports: - "8000:8000" environment: - DATABASE_URL=postgresql://user:pass@db:5432/app - REDIS_URL=redis://redis:6379 depends_on: - db - redis db: image: postgres:13 environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: app volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:6-alpine volumes: - redis_data:/data nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf depends_on: - frontend - backend volumes: postgres_data: redis_data:9. 生产环境最佳实践
9.1 安全配置
# 使用非 root 用户运行容器 FROM node:16-alpine RUN addgroup -g 1001 -S nodejs RUN adduser -S nextjs -u 1001 USER nextjs # 限制容器资源 docker run -d \ --name myapp \ --memory=512m \ --cpus=1.0 \ --pids-limit=100 \ myapp:latest # 只读文件系统 docker run -d \ --read-only \ --tmpfs /tmp \ myapp:latest9.2 健康检查配置
在 Dockerfile 或 Compose 文件中配置健康检查:
# Dockerfile 中的健康检查 FROM nginx:alpine HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/ || exit 1# Compose 文件中的健康检查 services: web: image: nginx:alpine healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3 start_period: 40s9.3 日志管理
配置日志轮转和外部收集:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3", "labels": "production" } }10. 常见问题与排查方法
10.1 安装问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Cannot connect to the Docker daemon | Docker 服务未启动 | sudo systemctl start docker |
| Permission denied while trying to connect | 用户不在 docker 组 | sudo usermod -aG docker $USER |
| Unable to find image | 镜像不存在或网络问题 | 检查镜像名,配置镜像加速器 |
| Port is already allocated | 端口被占用 | 更换端口或停止占用进程 |
10.2 运行时问题排查
# 查看容器详细配置 docker inspect container_name # 查看资源使用情况 docker stats # 查看容器进程 docker top container_name # 分析容器文件系统 docker diff container_name # 导出容器日志 docker logs container_name > container.log10.3 网络问题排查
# 查看网络配置 docker network ls docker network inspect network_name # 测试容器间连通性 docker exec -it container1 ping container2 # 查看端口映射 docker port container_name11. 从手工到自动化的演进路径
11.1 手工部署阶段
初期适合手动操作熟悉 Docker 基本概念:
- 手工运行
docker run命令 - 手动管理容器生命周期
- 直接操作镜像和容器
11.2 脚本化阶段
通过 Shell 脚本实现半自动化:
#!/bin/bash # deploy.sh docker build -t myapp:latest . docker stop myapp || true docker rm myapp || true docker run -d --name myapp -p 8080:80 myapp:latest11.3 Docker Compose 编排阶段
使用 YAML 文件定义多服务应用:
- 服务依赖关系自动管理
- 环境变量集中配置
- 一键启动/停止整个应用栈
11.4 CI/CD 集成阶段
与 Jenkins、GitLab CI、GitHub Actions 等工具集成:
# GitHub Actions 示例 name: Build and Deploy on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker image run: docker build -t myapp:latest . - name: Deploy to server run: | docker-compose -f docker-compose.prod.yml up -d11.5 容器编排平台阶段
进阶到 Kubernetes、Docker Swarm 等编排平台:
- 自动扩缩容
- 服务发现和负载均衡
- 滚动更新和回滚
- 自我修复能力
12. 实战案例:全栈应用自动化部署
12.1 项目结构规划
my-app/ ├── frontend/ │ ├── Dockerfile │ └── ...(前端代码) ├── backend/ │ ├── Dockerfile │ └── ...(后端代码) ├── nginx/ │ └── nginx.conf ├── docker-compose.yml ├── docker-compose.prod.yml └── .env.example12.2 多环境配置管理
开发环境配置(docker-compose.yml):
version: '3.8' services: frontend: build: ./frontend ports: ["3000:3000"] volumes: ["./frontend:/app"] environment: - NODE_ENV=development backend: build: ./backend ports: ["8000:8000"] volumes: ["./backend:/app"] environment: - DEBUG=true生产环境配置(docker-compose.prod.yml):
version: '3.8' services: frontend: build: ./frontend ports: ["80:80"] environment: - NODE_ENV=production backend: build: ./backend environment: - NODE_ENV=production deploy: replicas: 312.3 自动化部署脚本
#!/bin/bash # deploy-prod.sh set -e echo "开始生产环境部署..." # 拉取最新代码 git pull origin main # 构建镜像 docker-compose -f docker-compose.prod.yml build # 停止现有服务 docker-compose -f docker-compose.prod.yml down # 启动新服务 docker-compose -f docker-compose.prod.yml up -d # 执行数据库迁移 docker-compose -f docker-compose.prod.yml exec backend npm run migrate # 清理无用镜像 docker image prune -f echo "部署完成!"从手工安装到自动化构建的完整路径,体现了 Docker 技术在应用部署领域的成熟演进。通过系统掌握 Docker 核心概念和工具链,开发者能够构建出高效、可靠、可扩展的现代化应用部署体系。建议在实际项目中从简单应用开始,逐步实践各项技术,最终形成适合自己团队的自动化部署方案。