Docker容器化部署全攻略:从零到企业级应用

释放双眼,带上耳机,听听看~!
摘要生成中
AI生成,仅供参考

前言

容器化技术已经成为现代应用部署的标准。随着微服务架构的普及和云原生技术的发展,Docker作为容器化的事实标准,已经深入到每个开发者的日常工作中。本文将带你从Docker基础概念开始,逐步构建企业级容器化部署方案,无论你是初学者还是有一定经验的开发者,都能从中获得实用的知识和技巧。

 

第一章:Docker基础概念与安装

1.1 什么是Docker?

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。

 

核心概念:

  • 镜像(Image):只读模板,包含运行应用程序所需的所有内容
  • 容器(Container):镜像的运行实例,可以启动、停止、删除
  • 仓库(Registry):存储和分发镜像的地方,如Docker Hub

 

1.2 Docker安装与配置

Ubuntu/Debian系统

Docker容器化部署全攻略:从零到企业级应用

         
    # 更新包索引    
    sudo apt update    
         
    # 安装必要依赖    
    sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release    
         
    # 添加Docker官方GPG密钥    
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg    
         
    # 设置稳定版仓库    
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null    
         
    # 安装Docker Engine    
    sudo apt update    
    sudo apt install docker-ce docker-ce-cli containerd.io    
         
    # 验证安装    
    sudo docker run hello-world    

 

CentOS/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    
         
    # 添加Docker仓库    
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo    
         
    # 安装Docker Engine    
    sudo yum install docker-ce docker-ce-cli containerd.io    
         
    # 启动并设置开机自启    
    sudo systemctl start docker    
    sudo systemctl enable docker    

 

Windows WSL2

         
    # 在PowerShell中以管理员身份运行    
    wsl --install    
    # 重启计算机后,安装Docker Desktop for Windows    
    # 确保WSL2后端已启用    

 

1.3 用户权限配置

为了避免每次使用Docker命令都需要sudo,将当前用户添加到docker组:

         
    sudo usermod -aG docker $USER    
    # 重新登录或执行以下命令    
    newgrp docker    

 

第二章:镜像构建最佳实践

2.1 Dockerfile编写规范

基础Dockerfile示例:

         
    # 使用官方Node.js运行时作为基础镜像    
    FROM node:18-alpine    
         
    # 设置工作目录    
    WORKDIR /app    
         
    # 复制package.json和package-lock.json(如果存在)    
    COPY package*.json ./    
         
    # 安装依赖    
    RUN npm ci --only=production && npm cache clean --force    
         
    # 复制应用源代码    
    COPY . .    
         
    # 暴露端口    
    EXPOSE 3000    
         
    # 定义环境变量    
    ENV NODE_ENV=production    
         
    # 运行应用    
    CMD ["node", "server.js"]    

 

2.2 多阶段构建(Multi-stage Builds)

多阶段构建可以显著减小最终镜像的大小:

 

         
    # 构建阶段    
    FROM node:18-alpine AS builder    
    WORKDIR /app    
    COPY package*.json ./    
    RUN npm ci --only=production && npm cache clean --force    
    COPY . .    
    RUN npm run build    
         
    # 运行阶段    
    FROM node:18-alpine AS runner    
    WORKDIR /app    
    COPY --from=builder /app/dist ./dist    
    COPY --from=builder /app/node_modules ./node_modules    
    COPY package*.json ./    
    EXPOSE 3000    
    CMD ["node", "dist/server.js"]    

 

2.3 镜像优化技巧

减少镜像层数:

         
    # 不好的做法 - 多个RUN指令    
    RUN apt-get update    
    RUN apt-get install -y curl    
    RUN apt-get install -y vim    
         
    # 好的做法 - 合并RUN指令    
    RUN apt-get update &&     
        apt-get install -y curl vim &&     
        rm -rf /var/lib/apt/lists/*    

 

使用.dockerignore文件:

node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.coverage
.vscode
 

第三章:Docker Compose编排多容器应用

3.1 Docker Compose基础

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。

 

docker-compose.yml示例:

         
    version: '3.8'    
         
    services:    
      web:    
        build: .    
        ports:    
          - "3000:3000"    
        environment:    
          - NODE_ENV=production    
          - DATABASE_URL=postgresql://user:password@db:5432/myapp    
        depends_on:    
          - db    
          - redis    
        volumes:    
          - ./logs:/app/logs    
         
      db:    
        image: postgres:13    
        environment:    
          POSTGRES_DB: myapp    
          POSTGRES_USER: user    
          POSTGRES_PASSWORD: password    
        volumes:    
          - postgres_data:/var/lib/postgresql/data    
        restart: unless-stopped    
         
      redis:    
        image: redis:6-alpine    
        command: redis-server --appendonly yes    
        volumes:    
          - redis_data:/data    
        restart: unless-stopped    
         
    volumes:    
      postgres_data:    
      redis_data:    

 

3.2 环境配置管理

多环境配置:

         
    # docker-compose.prod.yml    
    version: '3.8'    
    services:    
      web:    
        build:    
          context: .    
          dockerfile: Dockerfile.prod    
        ports:    
          - "80:3000"    
        environment:    
          - NODE_ENV=production    
        restart: unless-stopped    
         
    # docker-compose.dev.yml      
    version: '3.8'    
    services:    
      web:    
        build:    
          context: .    
          dockerfile: Dockerfile.dev    
        ports:    
          - "3000:3000"    
        environment:    
          - NODE_ENV=development    
        volumes:    
          - .:/app    
          - /app/node_modules    

 

使用命令:

         
    # 开发环境    
    docker-compose -f docker-compose.yml -f docker-compose.dev.yml up    
         
    # 生产环境    
    docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d    

 

第四章:网络配置与数据持久化

4.1 Docker网络模式

四种网络模式:

  1. bridge(默认):容器间通过虚拟网桥通信
  2. host:容器直接使用主机网络
  3. none:容器无网络
  4. overlay:跨主机容器通信

 

自定义网络:

         
    # 创建自定义网络    
    docker network create --driver bridge my-network    
         
    # 运行容器时指定网络    
    docker run --network my-network --name web-app nginx    

 

4.2 数据持久化策略

三种数据持久化方式:

 

  1. Volumes(推荐)
         
    # 创建命名卷    
    docker volume create my-vol    
         
    # 挂载卷到容器    
    docker run -d --name web-app -v my-vol:/app/data nginx    

 

  1. Bind Mounts
         
    # 挂载主机目录    
    docker run -d --name web-app -v /host/path:/container/path nginx    

 

  1. tmpfs Mounts
         
    # 临时文件系统挂载(仅Linux)    
    docker run -d --name web-app --tmpfs /app/cache nginx    

 

第五章:安全加固与资源限制

5.1 安全最佳实践

使用非root用户:

         
    FROM node:18-alpine    
    RUN addgroup -g 1001 -S nodejs    
    RUN adduser -S nextjs -u 1001    
    USER nextjs    

 

扫描镜像漏洞:

         
    # 使用Docker Scout    
    docker scout quickview your-image:tag    
         
    # 使用Trivy    
    trivy image your-image:tag    

 

最小化基础镜像:

  • 优先使用alpine版本
  • 使用distroless镜像
  • 定期更新基础镜像

 

5.2 资源限制

CPU和内存限制:

         
    # docker-compose.yml    
    services:    
      web:    
        image: nginx    
        deploy:    
          resources:    
            limits:    
              cpus: '0.5'    
              memory: 512M    
            reservations:    
              cpus: '0.25'    
              memory: 256M    

 

单独容器的资源限制:

         
    docker run -d     
      --name web-app     
      --memory=512m     
      --cpus=0.5     
      nginx    

 

第六章:CI/CD集成方案

6.1 GitHub Actions集成

.github/workflows/docker-build.yml:

         
    name: Build and Push Docker Image    
         
    on:    
      push:    
        branches: [ main ]    
         
    jobs:    
      build:    
        runs-on: ubuntu-latest    
            
        steps:    
        - uses: actions/checkout@v3    
            
        - name: Set up Docker Buildx    
          uses: docker/setup-buildx-action@v2    
              
        - name: Login to Docker Hub    
          uses: docker/login-action@v2    
          with:    
            username: ${{ secrets.DOCKERHUB_USERNAME }}    
            password: ${{ secrets.DOCKERHUB_TOKEN }}    
                
        - name: Build and push    
          uses: docker/build-push-action@v4    
          with:    
            context: .    
            push: true    
            tags: your-username/your-app:latest    

 

6.2 GitLab CI/CD集成

.gitlab-ci.yml:

         
    stages:    
      - build    
      - test    
      - deploy    
         
    build-image:    
      stage: build    
      script:    
        - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .    
        - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA    
         
    deploy-production:    
      stage: deploy    
      script:    
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY    
        - docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA    
        - docker stop my-app || true    
        - docker rm my-app || true    
        - docker run -d --name my-app -p 80:3000 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA    
      only:    
        - main    

 

第七章:实战案例 – 完整Web应用部署

7.1 应用架构

我们将部署一个完整的Web应用,包含以下组件:

  • Nginx:反向代理和静态文件服务
  • PHP-FPM:PHP应用服务器
  • MySQL:数据库
  • Redis:缓存和会话存储

 

7.2 目录结构

my-web-app/
├── docker-compose.yml
├── nginx/
│   └── default.conf
├── php/
│   └── Dockerfile
├── src/
│   └── index.php
└── .env
 

7.3 配置文件

docker-compose.yml:

         
    version: '3.8'    
         
    services:    
      nginx:    
        image: nginx:alpine    
        ports:    
          - "80:80"    
        volumes:    
          - ./src:/var/www/html    
          - ./nginx/default.conf:/etc/nginx/conf.d/default.conf    
        depends_on:    
          - php    
        restart: unless-stopped    
         
      php:    
        build: ./php    
        volumes:    
          - ./src:/var/www/html    
        environment:    
          - DB_HOST=mysql    
          - DB_NAME=myapp    
          - DB_USER=user    
          - DB_PASS=password    
        depends_on:    
          - mysql    
          - redis    
        restart: unless-stopped    
         
      mysql:    
        image: mysql:8.0    
        environment:    
          MYSQL_DATABASE: myapp    
          MYSQL_USER: user    
          MYSQL_PASSWORD: password    
          MYSQL_ROOT_PASSWORD: rootpassword    
        volumes:    
          - mysql_data:/var/lib/mysql    
        restart: unless-stopped    
         
      redis:    
        image: redis:6-alpine    
        volumes:    
          - redis_data:/data    
        restart: unless-stopped    
         
    volumes:    
      mysql_data:    
      redis_data:    

 

nginx/default.conf:

         
    server {    
        listen 80;    
        server_name localhost;    
        root /var/www/html;    
        index index.php;    
         
        location / {    
            try_files $uri $uri/ /index.php?$query_string;    
        }    
         
        location ~ .php$ {    
            fastcgi_pass php:9000;    
            fastcgi_index index.php;    
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;    
            include fastcgi_params;    
        }    
    }    

 

php/Dockerfile:

         
    FROM php:8.1-fpm-alpine    
         
    # 安装扩展    
    RUN docker-php-ext-install mysqli pdo pdo_mysql    
         
    # 安装Redis扩展    
    RUN pecl install redis && docker-php-ext-enable redis    
         
    # 清理    
    RUN rm -rf /tmp/* /var/tmp/*    
         
    WORKDIR /var/www/html    

 

src/index.php:

         
    <?php    
    echo "<h1>欢迎使用Docker容器化部署!</h1>";    
         
    // 测试数据库连接    
    try {    
        $pdo = new PDO(    
            "mysql:host=mysql;dbname=myapp",    
            "user",    
            "password"    
        );    
        echo "<p>✅ 数据库连接成功!</p>";    
    } catch (PDOException $e) {    
        echo "<p>❌ 数据库连接失败: " . $e->getMessage() . "</p>";    
    }    
         
    // 测试Redis连接    
    try {    
        $redis = new Redis();    
        $redis->connect('redis', 6379);    
        $redis->set('test', 'Hello Redis!');    
        echo "<p>✅ Redis连接成功!</p>";    
        echo "<p>Redis测试值: " . $redis->get('test') . "</p>";    
    } catch (Exception $e) {    
        echo "<p>❌ Redis连接失败: " . $e->getMessage() . "</p>";    
    }    
    ?>    

 

7.4 部署步骤

         
    # 1. 克隆项目    
    git clone your-repo-url    
    cd my-web-app    
         
    # 2. 构建并启动服务    
    docker-compose up -d    
         
    # 3. 验证服务状态    
    docker-compose ps    
         
    # 4. 查看日志    
    docker-compose logs -f    
         
    # 5. 访问应用    
    # 打开浏览器访问 http://localhost    

 

第八章:监控与维护

8.1 日志管理

查看容器日志:

         
    # 查看特定服务日志    
    docker-compose logs web    
         
    # 实时跟踪日志    
    docker-compose logs -f web    
         
    # 查看最近100行日志    
    docker-compose logs --tail=100 web    

 

8.2 性能监控

使用cAdvisor监控容器性能:

         
    # docker-compose.monitoring.yml    
    version: '3.8'    
    services:    
      cadvisor:    
        image: gcr.io/cadvisor/cadvisor:v0.47.0    
        volumes:    
          - /:/rootfs:ro    
          - /var/run:/var/run:rw    
          - /sys:/sys:ro    
          - /var/lib/docker/:/var/lib/docker:ro    
        ports:    
          - "8080:8080"    
        privileged: true    
        devices:    
          - /dev/kmsg    

 

8.3 定期维护任务

清理未使用的资源:

         
    # 清理停止的容器    
    docker container prune    
         
    # 清理未使用的镜像    
    docker image prune -a    
         
    # 清理未使用的卷    
    docker volume prune    
         
    # 清理未使用的网络    
    docker network prune    
         
    # 一键清理所有未使用资源    
    docker system prune -a    

 

结语

Docker容器化部署不仅简化了应用的部署流程,还提高了环境的一致性和可移植性。通过本文的学习,你应该已经掌握了从基础概念到企业级应用部署的完整知识体系。

 

记住,容器化不是终点,而是现代化应用开发和运维的新起点。随着Kubernetes、Service Mesh等技术的发展,容器化生态还在不断演进。保持学习,持续优化你的容器化实践!

 

附录:常用Docker命令速查

命令 说明
docker ps 列出运行中的容器
docker ps -a 列出所有容器
docker images 列出本地镜像
docker build -t name:tag . 构建镜像
docker run -d –name container-name image 运行容器
docker exec -it container-name bash 进入容器
docker logs container-name 查看容器日志
docker-compose up -d 启动所有服务
docker-compose down 停止并删除所有服务
docker system df 查看Docker磁盘使用情况
声明:本站所有文章,如无特殊说明或标注,均来自于互联网,下载的软件和资源请在24小时之内删除,本站提供的资源只可作为下载、学习交流使用,其版权归原作者所有,其产生的任何后果均自己承担,本站不作任何责任承担,具体可查看本站免责声明。如已声明或标注原创,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理,客服链接:点此前往,投诉邮箱:nc08wlkj@163.com

给TA赞赏
共{{data.count}}人
人已赞赏
技术教程

AI编程革命:GitHub Copilot vs 通义灵码 vs CodeWhisperer 全面对比

2026-2-15 14:28:29

技术教程网络安全

企业级防火墙配置指南:保护你的网络边界

2026-2-15 14:34:07

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索