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 ar /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.cgroupdriversystemd], 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 maintaineryour-emailexample.com # 复制自定义网页文件到容器中 COPY index.html /usr/share/nginx/html/index.html # 暴露端口 EXPOSE 80 # 设置启动命令 CMD [nginx, -g, daemon off;]创建对应的 index.html 文件!DOCTYPE html html head titleMy Docker App/title /head body h1Hello from Docker!/h1 pThis is my first automated Docker build./p /body /html7.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 --onlyproduction COPY . . RUN npm run build # 生产阶段 FROM nginx:alpine COPY --frombuilder /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# 对于最新版本的 DockerCompose 已经包含在安装包中 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.ymlname: Docker Build and Push on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkoutv3 - name: Set up Docker Buildx uses: docker/setup-buildx-actionv2 - name: Log in to Docker Hub uses: docker/login-actionv2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push uses: docker/build-push-actionv4 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_NAMEmy-webapp VERSION1.0 REGISTRYmyregistry.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_BUILDKIT1 # 使用高级构建特性 docker build --progressplain --no-cache -t my-app .10.2 多架构镜像构建# 使用多架构基础镜像 FROM --platform$BUILDPLATFORM node:16 as builder # ... 构建步骤 FROM nginx:alpine COPY --frombuilder /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.2512. 监控与日志管理12.1 容器日志配置{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3, labels: production } }12.2 健康检查配置FROM nginx:alpine # 添加健康检查 HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ 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 --chownnodejs: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_ENVdevelopment command: npm run dev15.2 生产环境配置# docker-compose.prod.yml version: 3.8 services: app: image: my-registry/app:latest ports: - 80:3000 environment: - NODE_ENVproduction deploy: replicas: 3 resources: limits: memory: 512M cpus: 1.015.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 自动化构建的真正价值在于为团队提供一致、可靠的应用交付流水线。