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(',') }}"
相关推荐
XIAOHEZIcode12 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
武子康1 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn864 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智4 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_4 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化