在 Atomic Host 上远程使用 Docker

原子主机来自 原子计划 是一个基于轻量级容器的操作系统,可以运行 Linux 容器。 它已经过优化,可用作云环境的容器运行时系统。 例如,它可以托管 Docker 守护程序和容器。 有时,您可能希望在该主机上运行 docker 命令并从其他地方管理服务器。 本文将向您展示如何远程访问 码头工人 的守护进程 Fedora 原子主机, 你可以在这里下载。 整个过程由 Ansible — 在自动化一切方面,这是一个很棒的工具。

关于安全的说明

我们将保护 Docker 守护进程 TLS,因为我们是通过网络连接的。 此过程需要客户端证书和服务器证书。 OpenSSL 包用于创建用于建立 TLS 连接的证书密钥。 在这里,Atomic Host 正在运行守护进程,而我们的本地 Fedora 工作站 充当客户。

在执行这些步骤之前,请注意客户端上可以访问 TLS 证书的任何进程现在都具有 服务器上的完全根访问权限。 因此,客户端可以在服务器上做任何它想做的事情。 因此,我们只需要向可以信任的特定客户端主机授予证书访问权限。 您应该只将客户端证书复制到完全由您控制的客户端主机。 即使在这种情况下,客户端机器的安全性也至关重要。

但是,此方法只是远程访问守护程序的一种方法。 编排工具通常提供更安全的控制。 下面的简单方法适用于个人实验,但可能不适合开放网络。

获得 Ansible 角色

克里斯·豪斯克内希特 编写了一个 Ansible 角色来创建所需的所有证书。 这样您就不需要手动运行 openssl 命令。 这些是在一个 Ansible 角色存储库. 将其克隆到您当前的工作主机。

$ mkdir docker-remote-access
$ cd docker-remote-access
$ git clone https://github.com/ansible/role-secure-docker-daemon.git

创建配置文件

接下来,您必须创建一个 Ansible 配置文件、库存和剧本文件来设置客户端和守护程序。 以下说明在原子主机上创建客户端和服务器证书。 然后,他们将客户端证书获取到本地计算机。 最后,他们配置守护进程和客户端,以便它们相互通信。

这是您需要的目录结构。 如图所示,创建下面的每个文件。

$ tree docker-remote-access/
docker-remote-access/
├── ansible.cfg
├── inventory
├── remote-access.yml
└── role-secure-docker-daemon

ansible.cfg

 $ vim ansible.cfg
[defaults]
inventory=inventory

存货

 $ vim inventory
[daemonhost]
'IP_OF_ATOMIC_HOST' ansible_ssh_private_key_file="PRIVATE_KEY_FILE"

将清单文件中的 IP_OF_ATOMIC_HOST 替换为您的原子主机的 IP。 将 PRIVATE_KEY_FILE 替换为本地系统上 SSH 私钥文件的位置。

远程访问.yml

$ vim remote-access.yml
---
- name: Docker Client Set up
  hosts: daemonhost
  gather_facts: no
  tasks:
    - name: Make ~/.docker directory for docker certs
      local_action: file path="~/.docker" state="directory"

    - name: Add Environment variables to ~/.bashrc
      local_action: lineinfile dest="~/.bashrc" line="export DOCKER_TLS_VERIFY=1nexport DOCKER_CERT_PATH=~/.docker/nexport DOCKER_HOST=tcp://{{ inventory_hostname }}:2376n" state="present"

    - name: Source ~/.bashrc file
      local_action: shell source ~/.bashrc

- name: Docker Daemon Set up
  hosts: daemonhost
  gather_facts: no
  remote_user: fedora
  become: yes
  become_method: sudo
  become_user: root
  roles:
    - role: role-secure-docker-daemon
      dds_host: "{{ inventory_hostname }}"
      dds_server_cert_path: /etc/docker
      dds_restart_docker: no
  tasks:
    - name: fetch ca.pem from daemon host
      fetch:
        src: /root/.docker/ca.pem
        dest: ~/.docker/
        fail_on_missing: yes
        flat: yes
    - name: fetch cert.pem from daemon host
      fetch:
        src: /root/.docker/cert.pem
        dest: ~/.docker/
        fail_on_missing: yes
        flat: yes
    - name: fetch key.pem from daemon host
      fetch:
        src: /root/.docker/key.pem
        dest: ~/.docker/
        fail_on_missing: yes
        flat: yes
    - name: Remove Environment variable OPTIONS from /etc/sysconfig/docker
      lineinfile:
        dest: /etc/sysconfig/docker
        regexp: '^OPTIONS'
        state: absent

    - name: Modify Environment variable OPTIONS in /etc/sysconfig/docker
      lineinfile:
        dest: /etc/sysconfig/docker
        line: "OPTIONS='--selinux-enabled --log-driver=journald --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H=0.0.0.0:2376 -H=unix:///var/run/docker.sock'"
        state: present

    - name: Remove client certs from daemon host
      file:
        path: /root/.docker
        state: absent

    - name: Reload Docker daemon
      command: systemctl daemon-reload
    - name: Restart Docker daemon
      command: systemctl restart docker.service

访问远程原子主机

现在,运行 Ansible 剧本:

$ ansible-playbook remote-access.yml

确保在您的 Atomic Host 上打开 tcp 端口 2376。 如果您使用的是 Openstack,请在您的安全规则中添加 TCP 端口 2376。 如果您使用的是 AWS,请将其添加到您的安全组。

现在,在您的工作站上以普通用户身份运行的 docker 命令与 Atomic 主机的守护进程对话,并在那里执行命令。 您无需手动 ssh 或在 Atomic 主机上发出命令。 这使您可以远程、轻松、安全地启动容器化应用程序。

如果你想克隆剧本和配置文件,有 此处提供的 git 存储库.

图片由 阿克塞尔阿霍伊 – 最初发布到 不飞溅.