docker_rootless

无根 Docker Ansible 角色

一个 Ansible 角色,用于以非根用户的身份安装和配置 Docker 守护进程。

在未在非操作环境中测试之前,请勿使用这些内容。

无根模式允许以非根用户的身份运行 Docker 守护进程和容器,以减轻守护进程和容器运行时可能存在的安全漏洞。(docker

注意 当前在 slsa action workflow 下存在一个 SLSA 产物以供验证。

需求

---
roles:
  - name: konstruktoid.docker_rootless
    version: v0.53.0
    src: https://github.com/konstruktoid/ansible-role-docker-rootless.git
    scm: git

Playbook 示例

---
- hosts: all
  any_errors_fatal: true
  tasks:
    - name: 引入 konstruktoid.docker_rootless 角色
      ansible.builtin.import_role:
        name: konstruktoid.docker_rootless

角色变量及默认值

---
docker_add_alias: true
docker_allow_ping: false
docker_allow_privileged_ports: false
docker_compose: false
docker_compose_arch: x86_64
docker_compose_release: v2.29.2
docker_compose_release_shasum: d037bd4937bf18fba67cff4366e084ee125a3e15c25657ee1aeceff8db3672b4
docker_compose_url: https://github.com/docker/compose/releases/download
docker_daemon_json_template: daemon.json.j2
docker_driver_network: slirp4netns
docker_driver_port: builtin
docker_release: 27.1.2
docker_release_rootless_shasum: 5565502b4fab26266327f5a018185f5a98cc1714c975b943dcb7c4365cdcdb25
docker_release_shasum: a7fff574037af22bd0239e7e5601c312d9fe9c55e2b9cf5ddea86d5499a4de88
docker_repository_template: docker.repo.j2
docker_rootful_enabled: false
docker_rootful: false
docker_rootful_opts: false
docker_rootful_service_template: docker_rootful.service.j2
docker_rootless_script_template: docker_rootless.sh.j2
docker_rootless_service_template: docker_rootless.service.j2
docker_service_restart: true
docker_url: https://download.docker.com/linux/static/stable/x86_64
docker_user_bashrc: false
docker_user: dockeruser

在使用此角色之前,您必须先决定是使用发行版中可用的安装包来安装 Docker,这被称为 "rootful" 安装,因为它需要 root 权限并安装上游 Docker 守护进程,还是想下载静态二进制文件并手动安装。

如果将 docker_rootful 设置为 false,则会下载静态二进制文件并进行手动安装,且不需要任何 root 权限。

如果 docker_rootful 设置为 true,则 docker_rootful_enabled 将决定守护进程是否应作为服务启用。

docker_service_restart 会在 Docker 二进制文件提取后重新启动无根服务。这可能会影响任何正在运行的容器。

docker_rootfuldocker_rootful_enabled 都设置为 true,将导致标准 Docker 安装,具有一个作为非根用户运行的额外 Docker 守护进程。

注意,Debian 10 及之前版本由于缺少依赖项,需要将 docker_rootful 设置为 false

docker_urldocker_releasedocker_compose_urldocker_compose_release 变量定义了您找到相关二进制文件的路径以及在进行手动安装时应使用的版本。

您可以使用 docker_user 变量定义将要创建的 Docker 用户的名称。此用户将在 docker_rootful: false 的情况下下载并安装二进制文件,否则用户将运行无根安装脚本并启动隔离的守护进程。

请注意,docker_user 的唯一目的在于运行 Docker 守护进程和相关容器,而不是用于系统管理或作为普通用户。

docker_release_shasumdocker_release_rootless_shasumdocker_compose_release_shasum 用于在使用 get_url 模块下载文件时进行验证。docker_release_shasum 用于 Docker .tgz 文件,docker_release_rootless_shasum 用于 docker-ce-rootless-extras 软件包。

docker_rootful_opts 是在以 rootful 模式运行时要应用于 Docker 守护进程的选项,若未设置,则将使用 docker_rootful_service_template 中的设置。

如果 docker_add_alias: true,则将为 Ansible 用户的 .bashrc.bash_aliases 添加 docker 别名。如果为 false,则会在 Ansible 用户主目录中创建一个名为 docker_rootless.sh 的 shell 脚本。这个脚本替代 docker 命令,使 Ansible 用户能够从 docker_user 执行无根 Docker 安装。

如果 docker_compose: true,则将安装 Docker compose 插件或 docker-composedocker_compose_arch 用于定义 docker-compose 二进制文件的架构。

如果 docker_user_bashrc: true,将会在 docker_user 的主目录中放置一个带有 dockerdocker compose 命令补全的 .bashrc 文件。

docker_allow_privileged_ports 变量配置是否允许暴露 特权端口 (< 1024)

docker_allow_ping 变量配置普通用户是否可以打开 ICMP 回声套接字。在某些发行版中,这是不被允许的,因此容器不能 ping 通外部。

docker_driver_networkdocker_driver_port 变量分别配置 RootlessKit 的 网络驱动端口驱动,这对于 优化网络性能 和当 源 IP 传播 是必需的。默认情况下,builtin 端口驱动不会暴露实际的源 IP;相反,所有连接在容器中都看起来来自 Docker 网关(例如 172.19.0.1)。设置 docker_driver_port: slirp4netns 来启用源 IP 传播。

*_template 命名的变量是所使用的 模板 的位置,以便更容易用自定义模板进行替换。

最重要的模板可能是 docker_daemon_json_template: daemon.json.j2,这个模板是 Docker daemon.json 配置文件的模板位置。

容器管理

独立容器

运行容器与使用 rootful Docker 守护进程时没有太大区别,但您仍需以非特权用户身份运行,并调整工作目录路径。

如果使用 docker_add_alias: truedocker 命令也将按常规方式对 Ansible 用户可用。在 shell 中输入 alias 以查看关键词配置。

- name: 注册 Docker 用户信息
  become: true
  ansible.builtin.user:
    name: "{{ docker_user }}"
  check_mode: true
  register: docker_user_info

- name: 示例容器块
  environment:
    XDG_RUNTIME_DIR: "/run/user/{{ docker_user_info.uid }}"
    PATH: "{{ docker_user_info.home }}/bin:{{ ansible_env.PATH }}"
    DOCKER_HOST: "unix:///run/user/{{ docker_user_info.uid }}/docker.sock"
  block:
    - name: Nginx 容器
      become: true
      become_user: "{{ docker_user }}"
      community.docker.docker_container:
        name: nginx
        image: konstruktoid/nginx
        state: started
        cap_drop: all
        capabilities:
          - chown
          - dac_override
          - net_bind_service
          - setgid
          - setuid
        pull: true
        hostname: "{{ ansible_nodename }}"
        container_default_behavior: compatibility

Docker Compose 服务

- name: 注册 Docker 用户信息
  become: true
  ansible.builtin.user:
    name: "{{ docker_user }}"
  check_mode: true
  register: docker_user_info

- name: 示例 Docker Compose 
  become: true
  become_user: "{{ docker_user }}"
  environment:
    XDG_RUNTIME_DIR: /run/user/{{ docker_user_info.uid }}
    PATH: "{{ docker_user_info.home }}/bin:{{ ansible_env.PATH }}"
    DOCKER_HOST: "unix:///run/user/{{ docker_user_info.uid }}/docker.sock"
  block:
    - name: 安装 pip 依赖
      ansible.builtin.pip:
        name:
          - docker<7 # https://github.com/docker/docker-py/issues/3194
          - docker-compose

    - name: 创建并启动服务
      community.docker.docker_compose:
        project_src: /var/tmp/
        files: "{{ docker_user }}-docker-compose.yml"
      register: compose_output

使用 Molecule 进行测试

如果已安装 Ansible Moleculevagrant 插件 及相关软件,支持运行 molecule test

tox -l 将列出所有可用的 tox 测试环境。

贡献

您想要贡献吗?太好了!无论大小,贡献总是受欢迎的。如果您发现了任何奇怪的地方,请随时提交问题,创建拉取请求来改善代码,或通过 赞助此项目

许可证

Apache 许可证第 2.0 版

作者信息

https://github.com/konstruktoid

关于项目

Docker daemon installation, with rootless support

安装
ansible-galaxy install docker_rootless
许可证
apache-2.0
下载
7.5k
拥有者