温馨提示×

Debian Docker自动化如何配置

小樊
37
2026-01-05 11:54:18
栏目: 智能运维

Debian Docker自动化配置

一 目标与总体思路

  • Debian 上把 Docker 的安装、配置、服务自启与容器自启做成可重复、可无人值守的流程,覆盖三类场景:
    1. 本机一键安装与初始化;2) 多机批量编排(配置管理工具);3) 代码变更触发的 CI/CD 自动构建与部署。
  • 关键关注点:安装源与 GPG、服务自启、容器重启策略、可选镜像加速、非 root 使用与权限、可重复脚本化与幂等性。

二 本机一键安装与初始化脚本

  • 使用官方仓库安装(推荐,便于后续升级与维护),脚本具备幂等检查与基础验证:
#!/usr/bin/env bash
set -Eeuo pipefail

# 0) 参数与常量
: "${DOCKER_GPG_URL:=https://download.docker.com/linux/debian/gpg}"
: "${DOCKER_REPO:=https://download.docker.com/linux/debian}"
: "${DOCKER_PKG:=docker-ce docker-ce-cli containerd.io}"
: "${DOCKER_GROUP:=docker}"

# 1) 仅 root 执行
if [ "$(id -u)" -ne 0 ]; then
  echo "请使用 root 或 sudo 执行此脚本。" >&2
  exit 1
fi

# 2) 安装依赖
apt-get update -qq
apt-get install -y --no-install-recommends \
  apt-transport-https ca-certificates curl gnupg lsb-release

# 3) 添加 Docker GPG 与 APT 源(幂等)
if [ ! -f /usr/share/keyrings/docker.gpg ]; then
  curl -fsSL "$DOCKER_GPG_URL" | gpg --dearmor -o /usr/share/keyrings/docker.gpg
fi
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] $DOCKER_REPO $(lsb_release -cs) stable" \
  | tee /etc/apt/sources.list.d/docker.list >/dev/null

# 4) 安装 Docker
apt-get update -qq
apt-get install -y --no-install-recommends $DOCKER_PKG

# 5) 开机自启
systemctl enable --now docker

# 6) 可选:配置镜像加速(按需取消注释)
# mkdir -p /etc/docker
# cat >/etc/docker/daemon.json <<'EOF'
# {
#   "registry-mirrors": ["https://<你的加速器地址>"]
# }
# EOF
# systemctl restart docker

# 7) 验证
docker version
docker run --rm hello-world

# 8) 可选:将当前用户加入 docker 组(重新登录后生效)
# if ! getent group "$DOCKER_GROUP" >/dev/null; then
#   groupadd -r "$DOCKER_GROUP"
# fi
# usermod -aG "$DOCKER_GROUP" "$(logname)"
  • 使用方式:保存为 install_docker.sh,执行 chmod +x install_docker.sh && ./install_docker.sh。上述流程等价于官方安装步骤:更新索引、安装依赖、导入 GPG、添加仓库、安装 docker-ce、启动并验证 hello-world。

三 批量自动化与配置管理

  • 使用 Ansible 做多机一致化部署(示例 playbook 片段,具备幂等与可复用性):
---
- name: Install and configure Docker on Debian
  hosts: docker_hosts
  become: yes
  vars:
    docker_pkgs:
      - docker-ce
      - docker-ce-cli
      - containerd.io
    docker_gpg: https://download.docker.com/linux/debian/gpg
    docker_repo: https://download.docker.com/linux/debian

  tasks:
    - name: Install prerequisites
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg
          - lsb-release
        state: present
        update_cache: yes

    - name: Add Docker GPG key
      ansible.builtin.apt_key:
        url: "{{ docker_gpg }}"
        state: present
        keyring: /usr/share/keyrings/docker.gpg

    - name: Add Docker APT repository
      ansible.builtin.apt_repository:
        repo: "deb [arch={{ ansible_architecture }} signed-by=/usr/share/keyrings/docker.gpg] {{ docker_repo }} {{ ansible_distribution_release }} stable"
        state: present
        filename: docker

    - name: Install Docker packages
      apt:
        name: "{{ docker_pkgs }}"
        state: present
        update_cache: yes

    - name: Enable and start Docker service
      ansible.builtin.systemd:
        name: docker
        enabled: yes
        state: started

    - name: Add user to docker group
      ansible.builtin.user:
        name: "{{ ansible_user }}"
        groups: docker
        append: yes
  • 适用场景:大规模主机初始化、统一配置(如 /etc/docker/daemon.json)、滚动升级与回滚。上述思路与步骤与官方安装流程一致,适合用 Ansible 编排落地。

四 容器自启动与常用自动化场景

  • 容器随系统启动:使用 Docker 的 重启策略,例如 always/on-failure/unless-stopped。示例:
docker rm -f mynginx 2>/dev/null || true
docker run -d --name mynginx --restart always -p 80:80 nginx:latest
docker ps -a --filter name=mynginx
  • 说明:–restart 策略可确保容器在 崩溃系统重启 后自动拉起,是实现“开机即服务可用”的关键配置。

五 CI/CD 自动构建与部署示例

  • 使用 GitHub Actions 在代码变更时自动构建镜像并部署到 Debian 主机(需提前配置 SSH 免密或 Runner):
name: Build and Deploy Docker
on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USER }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Build and push
        run: |
          docker build -t ${{ secrets.DOCKERHUB_USER }}/myapp:${{ github.sha }} .
          docker push ${{ secrets.DOCKERHUB_USER }}/myapp:${{ github.sha }}

      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            docker pull ${{ secrets.DOCKERHUB_USER }}/myapp:${{ github.sha }}
            docker rm -f myapp 2>/dev/null || true
            docker run -d --name myapp --restart always -p 80:80 \
              ${{ secrets.DOCKERHUB_USER }}/myapp:${{ github.sha }}
  • 说明:该流程覆盖从 拉取代码 → 构建镜像 → 推送仓库 → 远程部署 的完整链路,适合生产级交付;也可替换为 Jenkins/GitLab CI 等工具实现同样效果。

0