Docker自动化部署与配置详解③

目录结构

复制代码
docker/
├── tasks/
│   └── main.yml
├── templates/
│   ├── daemon.json.j2
│   └── docker.service.j2
└── vars/
    └── main.yml

1. tasks/main.yml

复制代码
- name: 获取是否已经安装 docker
  shell: 'systemctl is-active docker || echo "NoFound"'
  register: docker_svc

- name: 获取 docker 版本信息
  shell: "{{ base_dir }}/bin/docker-bin/dockerd --version|cut -d' ' -f3"
  register: docker_ver
  connection: local
  run_once: true
  tags: upgrade_docker, download_docker

- name: debug info
  debug: var="docker_ver"
  connection: local
  run_once: true
  tags: upgrade_docker, download_docker

- name: 转换 docker 版本信息为浮点数
  set_fact:
    DOCKER_VER: "{{ docker_ver.stdout.split('.')[0]|int + docker_ver.stdout.split('.')[1]|int/100 }}"
  connection: local
  run_once: true
  tags: upgrade_docker, download_docker

- name: 已安装提示
  debug:
    msg: "docker 服务已安装"
  when: "'NoFound' not in docker_svc.stdout"

- block:
    - name: 准备 docker 相关目录
      file:
        name: "{{ item }}"
        state: directory
      loop:
        - "{{ bin_dir }}"
        - "/etc/docker"

    - name: 下载 docker 二进制文件
      copy:
        src: "{{ item }}"
        dest: "{{ bin_dir }}/"
        mode: '0755'
      with_fileglob:
        - "{{ base_dir }}/bin/docker-bin/*"
      tags: upgrade_docker, download_docker

    - name: 配置 docker daemon
      template:
        src: daemon.json.j2
        dest: /etc/docker/daemon.json

    - name: 创建 docker 的 systemd unit 文件
      template:
        src: docker.service.j2
        dest: /etc/systemd/system/docker.service
      tags: upgrade_docker, download_docker

    - name: 开机启用 docker 服务
      shell: systemctl enable docker
      ignore_errors: true

    - name: 开启 docker 服务
      shell: systemctl daemon-reload && systemctl restart docker
      tags: upgrade_docker

    - name: 轮询等待 docker 服务运行
      shell: "systemctl is-active docker.service"
      register: docker_status
      until: '"active" in docker_status.stdout'
      retries: 8
      delay: 2
      tags: upgrade_docker

    # 配置 docker 命令软链接,方便单独安装 docker
    - name: 配置 docker 命令软链接
      file:
        src: "{{ bin_dir }}/docker"
        dest: /usr/bin/docker
        state: link
      ignore_errors: true

  when: "'NoFound' in docker_svc.stdout"

2. templates

2.1 daemon.json.j2
复制代码
{
  "data-root": "{{ DOCKER_STORAGE_DIR }}",
  "exec-opts": ["native.cgroupdriver={{ CGROUP_DRIVER }}"],
{% if ENABLE_MIRROR_REGISTRY %}
  "registry-mirrors": [
    "https://docker.nju.edu.cn/",
    "https://kuamavit.mirror.aliyuncs.com"
  ],
{% endif %}
{% if DOCKER_ENABLE_REMOTE_API %}
  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"],
{% endif %}
  "insecure-registries": [{{ INSECURE_REG_STRING }}],
  "max-concurrent-downloads": 10,
  "live-restore": true,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "50m",
    "max-file": "1"
  },
  "storage-driver": "overlay2"
}
2.2 docker.service.j2
复制代码
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io

[Service]
Environment="PATH={{ bin_dir }}:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart={{ bin_dir }}/dockerd 
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

3. vars/main.yml

复制代码
# cgroup driver
CGROUP_DRIVER: "{%- if DOCKER_VER|float >= 20.10 -%} \
                     systemd \
                {%- else -%} \
                     cgroupfs \
                {%- endif -%}"

#
INSECURE_REG_STR: "{% for reg in INSECURE_REG %}\"{{ reg }}\",{% endfor %}"
INSECURE_REG_STRING: "{{ INSECURE_REG_STR.rstrip(',') }}"
相关推荐
RisunJan2 小时前
Linux命令-rlogin(远程登录)
linux·运维
深圳恒讯2 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者3 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn3 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络
小顿的企业观察4 小时前
中企出海战略规划,正在从“走出去”转向“走进去”
大数据·运维·人工智能·产品运营·制造
数智化转型推荐官4 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互4 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
liguojun20256 小时前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
Promise微笑6 小时前
红外分辨率 160×120、320×240、384×288 与 640×480实战选型指南
大数据·运维·人工智能·物联网
云飞云共享云桌面7 小时前
单机建模卡顿运维繁琐!中小型机械制造厂云飞云 3D 云桌面落地
运维·服务器·网络·3d·自动化·电脑·负载均衡