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/containerd

4.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-plugin

CentOS/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-plugin

4.3 启动 Docker 服务

# 启动 Docker 服务 sudo systemctl start docker # 设置开机自启 sudo systemctl enable docker # 验证安装 docker --version docker compose version

4.4 配置非 root 用户权限

# 将当前用户添加到 docker 组 sudo usermod -aG docker $USER # 重新登录或执行以下命令生效 newgrp docker # 验证非 root 用户权限 docker ps

5. 配置镜像加速器

由于网络原因,从 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 docker

6. Docker 基础操作验证

6.1 运行测试容器

# 拉取 Hello World 测试镜像 docker pull hello-world:latest # 运行测试容器 docker run hello-world # 验证容器运行状态 docker ps -a

6.2 实际应用部署示例

部署 Nginx Web 服务器:

# 拉取 Nginx 镜像 docker pull nginx:latest # 运行 Nginx 容器 docker run -d --name my-nginx -p 8080:80 nginx:latest # 验证服务访问 curl http://localhost:8080

7. 从手工操作到自动化构建

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.0

7.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-compose

8.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: bridge

8.3 使用 Compose 管理服务

# 启动所有服务 docker compose up -d # 查看服务状态 docker compose ps # 查看服务日志 docker compose logs # 停止服务 docker compose down # 停止并清理数据 docker compose down -v

9. 自动化构建与 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_Store

11.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 1

13. 安全最佳实践

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:latest

14. 常见问题与排查方法

问题现象可能原因排查方式解决方案
无法连接 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 dev

15.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 自动化构建的真正价值在于为团队提供一致、可靠的应用交付流水线。