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_rootful
和 docker_rootful_enabled
都设置为 true
,将导致标准 Docker 安装,具有一个作为非根用户运行的额外 Docker 守护进程。
注意,Debian 10 及之前版本由于缺少依赖项,需要将
docker_rootful
设置为false
。
docker_url
、docker_release
、docker_compose_url
和 docker_compose_release
变量定义了您找到相关二进制文件的路径以及在进行手动安装时应使用的版本。
您可以使用 docker_user
变量定义将要创建的 Docker 用户的名称。此用户将在 docker_rootful: false
的情况下下载并安装二进制文件,否则用户将运行无根安装脚本并启动隔离的守护进程。
请注意,
docker_user
的唯一目的在于运行 Docker 守护进程和相关容器,而不是用于系统管理或作为普通用户。
docker_release_shasum
、docker_release_rootless_shasum
和 docker_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-compose
。docker_compose_arch
用于定义 docker-compose
二进制文件的架构。
如果 docker_user_bashrc: true
,将会在 docker_user
的主目录中放置一个带有 docker
和 docker compose
命令补全的 .bashrc 文件。
docker_allow_privileged_ports
变量配置是否允许暴露 特权端口 (< 1024)。
docker_allow_ping
变量配置普通用户是否可以打开 ICMP 回声套接字。在某些发行版中,这是不被允许的,因此容器不能 ping 通外部。
docker_driver_network
和 docker_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: true
,docker
命令也将按常规方式对 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 Molecule 和 vagrant 插件 及相关软件,支持运行 molecule test
。
tox -l
将列出所有可用的 tox
测试环境。
贡献
您想要贡献吗?太好了!无论大小,贡献总是受欢迎的。如果您发现了任何奇怪的地方,请随时提交问题,创建拉取请求来改善代码,或通过 赞助此项目。
许可证
Apache 许可证第 2.0 版