Debian Docker自动化配置
一 目标与总体思路
二 本机一键安装与初始化脚本
#!/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)"
三 批量自动化与配置管理
---
- 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
四 容器自启动与常用自动化场景
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
五 CI/CD 自动构建与部署示例
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 }}