Docker容器化技术:从手工安装到自动化构建部署完整指南
Docker 容器化技术已经成为现代应用开发和部署的标准工具,但很多开发者在使用过程中仍然停留在手动安装和基础操作的阶段。本文将从手工安装 Docker 开始,逐步深入到自动化构建和部署,帮助读者掌握完整的 Docker 工作流。
1. Docker 核心能力速览
| 能力项 | 说明 |
|---|---|
| 容器化技术 | 应用及依赖打包成可移植容器,实现标准化部署 |
| 跨平台支持 | Linux、Windows、macOS 等多平台运行 |
| 镜像管理 | 分层镜像、版本控制、镜像仓库支持 |
| 编排工具 | Docker Compose 多服务管理,Kubernetes 集群部署 |
| 自动化构建 | Dockerfile 定义构建流程,CI/CD 集成 |
| 适合场景 | 开发测试环境、微服务架构、持续集成部署 |
2. Docker 适用场景与使用边界
Docker 最适合的应用场景包括开发环境标准化、微服务架构部署、持续集成流水线以及混合云环境下的应用迁移。通过容器化技术,开发团队可以确保从开发到生产环境的一致性,极大减少"在我本地是好的"这类问题。
使用边界方面需要注意,Docker 不适合需要直接访问硬件设备的场景,对于性能要求极高的计算密集型应用,直接裸机部署可能更合适。此外,有状态应用的数据持久化需要特别设计,不能简单依赖容器的临时存储。
3. 环境准备与前置条件
在开始 Docker 安装前,需要确认系统环境满足基本要求:
系统要求:
- Linux 内核版本 3.10 或更高
- 64 位操作系统
- 至少 2GB 可用磁盘空间
- 网络连接正常
权限要求:
- 需要使用具有 sudo 权限的用户账户
- 确保系统已更新到最新状态
网络要求:
- 能够访问 Docker 官方仓库或镜像加速器
- 防火墙配置允许 Docker 相关端口通信
4. 手工安装 Docker 详细步骤
4.1 卸载旧版本 Docker
在安装新版本前,先彻底清理系统中可能存在的旧版本 Docker:
# 删除 Docker 相关软件源 sudo rm -f /etc/yum.repos.d/docker*.repo sudo rm -f /etc/apt/sources.list.d/*docker*.list # 卸载 Docker 及相关软件包 # 对于基于 YUM 的系统(CentOS/RHEL/Fedora) sudo yum remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 对于基于 APT 的系统(Ubuntu/Debian) for pkg in docker.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin; do sudo apt-get remove -y $pkg done # 清理残留数据 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd4.2 安装 Docker 社区版
Ubuntu/Debian 系统安装:
# 更新包管理工具 sudo apt-get update sudo apt-get install -y 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 install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginCentOS/RHEL 系统安装:
# 安装依赖包 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-plugin4.3 启动 Docker 服务
# 启动 Docker 服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 验证安装 docker --version docker compose version4.4 配置非 root 用户权限
# 将当前用户添加到 docker 组 sudo usermod -aG docker $USER # 重新登录或执行以下命令生效 newgrp docker # 验证非 root 用户权限 docker ps5. 配置镜像加速器
由于网络原因,从 Docker Hub 直接拉取镜像可能较慢,配置国内镜像加速器可以显著提升下载速度:
# 创建 Docker 配置目录 sudo mkdir -p /etc/docker # 配置镜像加速器(使用阿里云镜像加速器) sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.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 docker6. Docker 基础操作验证
6.1 运行测试容器
# 拉取 Hello World 测试镜像 docker pull hello-world:latest # 运行测试容器 docker run hello-world # 验证容器运行状态 docker ps -a6.2 实际应用部署示例
部署 Nginx Web 服务器:
# 拉取 Nginx 镜像 docker pull nginx:latest # 运行 Nginx 容器 docker run -d --name my-nginx -p 8080:80 nginx:latest # 验证服务访问 curl http://localhost:80807. 从手工操作到自动化构建
7.1 创建第一个 Dockerfile
自动化构建的核心是 Dockerfile,下面创建一个简单的 Web 应用示例:
# 使用官方 Nginx 镜像作为基础镜像 FROM nginx:latest # 设置维护者信息 LABEL maintainer="your-email@example.com" # 复制自定义网页文件到容器中 COPY index.html /usr/share/nginx/html/index.html # 暴露端口 EXPOSE 80 # 设置启动命令 CMD ["nginx", "-g", "daemon off;"]创建对应的 index.html 文件:
<!DOCTYPE html> <html> <head> <title>My Docker App</title> </head> <body> <h1>Hello from Docker!</h1> <p>This is my first automated Docker build.</p> </body> </html>7.2 构建自定义镜像
# 构建镜像 docker build -t my-webapp:1.0 . # 查看构建的镜像 docker images # 运行自定义镜像 docker run -d --name my-app -p 8080:80 my-webapp:1.07.3 多阶段构建优化
对于复杂的应用,可以使用多阶段构建来优化镜像大小:
# 构建阶段 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;"]8. Docker Compose 多服务编排
8.1 安装 Docker Compose
# 对于最新版本的 Docker,Compose 已经包含在安装包中 docker compose version # 如果需要独立安装 sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose8.2 创建 Compose 文件
version: '3.8' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html networks: - app-network mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: appdb MYSQL_USER: appuser MYSQL_PASSWORD: apppass volumes: - db_data:/var/lib/mysql networks: - app-network redis: image: redis:alpine networks: - app-network volumes: db_data: networks: app-network: driver: bridge8.3 使用 Compose 管理服务
# 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps # 查看服务日志 docker compose logs # 停止服务 docker compose down # 停止并清理数据 docker compose down -v9. 自动化构建与 CI/CD 集成
9.1 使用 GitHub Actions 自动化构建
创建.github/workflows/docker-build.yml:
name: Docker Build and Push on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Log in to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-action@v4 with: context: . push: ${{ github.event_name != 'pull_request' }} tags: | ${{ secrets.DOCKER_USERNAME }}/my-app:latest ${{ secrets.DOCKER_USERNAME }}/my-app:${{ github.sha }}9.2 本地自动化构建脚本
创建build.sh自动化脚本:
#!/bin/bash # 设置变量 IMAGE_NAME="my-webapp" VERSION="1.0" REGISTRY="myregistry.com" # 构建镜像 echo "Building Docker image..." docker build -t $IMAGE_NAME:$VERSION . # 运行测试 echo "Running tests..." docker run --rm $IMAGE_NAME:$VERSION npm test # 标签镜像 docker tag $IMAGE_NAME:$VERSION $REGISTRY/$IMAGE_NAME:$VERSION docker tag $IMAGE_NAME:$VERSION $REGISTRY/$IMAGE_NAME:latest # 推送镜像 echo "Pushing images to registry..." docker push $REGISTRY/$IMAGE_NAME:$VERSION docker push $REGISTRY/$IMAGE_NAME:latest echo "Build and deployment completed!"10. 高级自动化技巧
10.1 使用 BuildKit 优化构建
# 启用 BuildKit export DOCKER_BUILDKIT=1 # 使用高级构建特性 docker build --progress=plain --no-cache -t my-app .10.2 多架构镜像构建
# 使用多架构基础镜像 FROM --platform=$BUILDPLATFORM node:16 as builder # ... 构建步骤 FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html构建多架构镜像:
# 创建构建器实例 docker buildx create --use --name multiarch-builder # 构建多架构镜像 docker buildx build --platform linux/amd64,linux/arm64 -t my-app:multiarch --push .11. 资源优化与性能调优
11.1 镜像大小优化策略
# 使用 Alpine 基础镜像 FROM node:16-alpine as builder # 多阶段构建减少最终镜像大小 FROM nginx:alpine # 清理不必要的文件 RUN rm -rf /var/cache/apk/* && \ rm -rf /tmp/* # 使用 .dockerignore 文件排除不必要的文件创建.dockerignore文件:
node_modules npm-debug.log .git .gitignore README.md .env .nyc_output coverage .DS_Store11.2 容器资源限制
version: '3.8' services: web: image: nginx:alpine deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M cpus: '0.25'12. 监控与日志管理
12.1 容器日志配置
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3", "labels": "production" } }12.2 健康检查配置
FROM nginx:alpine # 添加健康检查 HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost/ || exit 113. 安全最佳实践
13.1 非 root 用户运行
FROM node:16-alpine # 创建非 root 用户 RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 # 切换用户 USER nodejs # 复制文件并设置权限 COPY --chown=nodejs:nodejs . .13.2 安全扫描
# 使用 Docker Scout 进行安全扫描 docker scout quickview my-app:latest # 使用 Trivy 扫描漏洞 trivy image my-app:latest14. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 无法连接 Docker 守护进程 | Docker 服务未启动或权限不足 | systemctl status docker | 启动服务或添加用户到 docker 组 |
| 镜像拉取失败 | 网络问题或镜像不存在 | docker pull --help | 配置镜像加速器或检查镜像名称 |
| 端口被占用 | 宿主机端口已被其他进程占用 | netstat -tulpn | grep 端口号 | 更换端口或停止占用进程 |
| 容器启动后立即退出 | 启动命令错误或应用崩溃 | docker logs 容器名 | 检查应用日志和启动命令 |
| 磁盘空间不足 | 镜像和容器数据占用过多空间 | docker system df | 清理无用镜像和容器 |
15. 从开发到生产的完整流程
15.1 开发环境配置
# docker-compose.dev.yml version: '3.8' services: app: build: . volumes: - .:/app - /app/node_modules ports: - "3000:3000" environment: - NODE_ENV=development command: npm run dev15.2 生产环境配置
# docker-compose.prod.yml version: '3.8' services: app: image: my-registry/app:latest ports: - "80:3000" environment: - NODE_ENV=production deploy: replicas: 3 resources: limits: memory: 512M cpus: '1.0'15.3 部署脚本
#!/bin/bash # deploy.sh ENVIRONMENT=${1:-production} IMAGE_TAG=${2:-latest} echo "Deploying to $ENVIRONMENT with tag $IMAGE_TAG" # 拉取最新镜像 docker-compose -f docker-compose.$ENVIRONMENT.yml pull # 启动服务 docker-compose -f docker-compose.$ENVIRONMENT.yml up -d # 执行数据库迁移(如果需要) docker-compose -f docker-compose.$ENVIRONMENT.yml exec app npm run migrate echo "Deployment completed!"通过本文的完整流程,您已经掌握了从手工安装 Docker 到自动化构建部署的全套技能。在实际项目中,建议根据具体需求选择合适的自动化程度,平衡开发效率和系统稳定性。Docker 自动化构建的真正价值在于为团队提供一致、可靠的应用交付流水线。