温馨提示×

Docker在Debian中的自动化部署方案

小樊
52
2025-10-02 05:20:34
栏目: 智能运维

1. 准备Debian环境
在开始自动化部署前,需确保Debian系统为最新状态,以避免依赖冲突。执行以下命令更新系统:

sudo apt update && sudo apt upgrade -y

这是后续安装Docker及自动化工具的基础。

2. 安装Docker CE(社区版)
Docker是容器化部署的核心,需先通过官方源安装:

  • 添加Docker GPG密钥:验证软件包完整性。
    curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
    
  • 添加Docker APT源:指定Debian版本(如bookworm)的稳定仓库。
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
    
  • 安装Docker组件:更新包索引并安装Docker CE、CLI及containerd。
    sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
    
  • 启用开机自启:确保Docker服务随系统重启自动启动。
    sudo systemctl enable --now docker
    

安装完成后,通过docker run hello-world验证Docker是否正常运行。

3. 编写Shell自动化部署脚本
Shell脚本可实现基础的Docker容器自动化管理(如拉取镜像、启动容器、检查状态)。以下是一个示例脚本(deploy_docker.sh):

#!/bin/bash
# 定义容器与镜像名称
CONTAINER_NAME="my_nginx"
IMAGE_NAME="nginx:latest"
PORT="80"

# 检查容器是否已运行,若未运行则启动
if ! docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
  echo "Container ${CONTAINER_NAME} not found. Starting new container..."
  docker run -d --name ${CONTAINER_NAME} -p ${PORT}:80 ${IMAGE_NAME}
  echo "Container ${CONTAINER_NAME} started successfully."
else
  echo "Container ${CONTAINER_NAME} is already running."
fi
  • 使用说明:将脚本保存为deploy_docker.sh,赋予执行权限(chmod +x deploy_docker.sh),运行即可自动部署Nginx容器。

4. 结合CI/CD工具实现全流程自动化
CI/CD工具(如GitHub Actions、GitLab CI/CD)可将代码提交、构建、测试、部署串联成自动化流水线,适用于团队协作或生产环境。

4.1 使用GitHub Actions实现自动化

  • 创建Workflow文件:在项目根目录的.github/workflows目录下新建deploy-docker.yml,定义触发条件(如pushmain分支)及步骤:
    name: Deploy Docker to Debian Server
    on:
      push:
        branches:
          - main
    jobs:
      build-and-deploy:
        runs-on: ubuntu-latest
        steps:
          # 1. 拉取代码
          - name: Checkout code
            uses: actions/checkout@v4
          
          # 2. 登录Docker Hub(替换为你的用户名/令牌)
          - name: Log in to Docker Hub
            uses: docker/login-action@v3
            with:
              username: ${{ secrets.DOCKERHUB_USERNAME }}
              password: ${{ secrets.DOCKERHUB_TOKEN }}
          
          # 3. 构建并推送镜像
          - name: Build and push Docker image
            uses: docker/build-push-action@v5
            with:
              context: .
              push: true
              tags: your-dockerhub-username/your-image:latest
          
          # 4. 部署到Debian服务器(通过SSH执行远程脚本)
          - name: Deploy to Debian server
            run: |
              ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} 'bash -s' < ./deploy_on_server.sh
    
  • 创建远程部署脚本:在项目根目录创建deploy_on_server.sh,用于在Debian服务器上拉取最新镜像并重启容器:
    #!/bin/bash
    CONTAINER_NAME="my_nginx"
    IMAGE_NAME="your-dockerhub-username/your-image:latest"
    
    # 拉取最新镜像
    docker pull ${IMAGE_NAME}
    
    # 重启容器(若容器存在则停止后重新启动)
    if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
      docker stop ${CONTAINER_NAME} && docker rm ${CONTAINER_NAME}
    fi
    docker run -d --name ${CONTAINER_NAME} -p 80:80 ${IMAGE_NAME}
    
  • 配置Secrets:在GitHub仓库的Settings > Secrets中添加DOCKERHUB_USERNAMEDOCKERHUB_TOKEN(Docker Hub个人访问令牌)、SERVER_USER(Debian服务器用户名)、SERVER_HOST(服务器IP/域名)。

4.2 使用Ansible实现配置管理自动化

Ansible是无代理的配置管理工具,可通过Playbook自动化Docker安装与部署:

  • 安装Ansible:在控制节点(如本地电脑)上安装Ansible:
    sudo apt update && sudo apt install -y ansible
    
  • 配置Inventory文件:创建inventory.ini,指定Debian服务器的IP地址:
    [debian_servers]
    your_server_ip ansible_user=your_username ansible_ssh_private_key_file=~/.ssh/id_rsa
    
  • 编写Playbook:创建docker_deploy.yml,定义Docker安装与容器部署任务:
    - hosts: debian_servers
      become: yes
      tasks:
        # 1. 安装Docker依赖
        - name: Install required packages
          apt:
            name: "{{ item }}"
            state: present
            update_cache: yes
          loop:
            - apt-transport-https
            - ca-certificates
            - curl
            - software-properties-common
        
        # 2. 添加Docker GPG密钥
        - name: Add Docker GPG key
          apt_key:
            url: https://download.docker.com/linux/debian/gpg
            state: present
        
        # 3. 添加Docker APT源
        - name: Add Docker APT repository
          apt_repository:
            repo: "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
            state: present
        
        # 4. 安装Docker CE
        - name: Install Docker CE
          apt:
            name: "{{ item }}"
            state: present
            update_cache: yes
          loop:
            - docker-ce
            - docker-ce-cli
            - containerd.io
        
        # 5. 启动Docker服务
        - name: Start Docker service
          service:
            name: docker
            state: started
            enabled: yes
        
        # 6. 部署Docker容器
        - name: Deploy Docker container
          docker_container:
            name: my_nginx
            image: nginx:latest
            ports:
              - "80:80"
            state: started
            recreate: yes
    
  • 运行Playbook:执行以下命令,将Playbook应用到Debian服务器:
    ansible-playbook -i inventory.ini docker_deploy.yml
    

Ansible的优势在于无需在目标服务器上安装额外代理,通过SSH即可完成管理,适合大规模服务器集群。

注意事项

  • 安全性:CI/CD中的Secrets(如Docker Hub令牌、服务器密码)需妥善保管,避免泄露。
  • 脚本维护:定期更新Shell脚本与CI/CD配置,适配Docker镜像版本变化。
  • 日志监控:通过docker logs命令或日志工具(如ELK)监控容器运行状态,及时排查问题。

0