如何在Atomic主机上远程使用 Docker

如何在Atomic主机上远程使用 Docker

来自Atomic项目的Atomic主机是一个轻量级的容器基于的操作系统,它可以运行 Linux 容器。它已被优化为用作云环境的容器运行时系统。例如,它可以托管 Docker 守护进程和容器。有时,你可能需要在该主机上运行 docker 命令,并从其他地方管理服务器。本文介绍如何远程访问 Fedora Atomic 主机(你可以在这里下载到它)上的 Docker 守护进程。整个过程由 Ansible 自动完成 - 在涉及到自动化的一切上,这真是一个伟大的工具!

安全备忘录

由于我们通过网络连接,所以我们使用TLS保护 Docker 守护进程。此过程需要客户端证书和服务器证书。OpenSSL包用于创建用于建立 TLS 连接的证书密钥。这里,Atomic主机运行守护程序,我们的本地的Fedora Workstation充当客户端。

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

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

获取 Ansible role

Chris Houseknecht 写了一个Ansible role,它会创造所需的所有证书。这样,你不需要手动运行 openssl命令了。 这些在 Ansible role 仓库中提供。将它克隆到你当前的工作主机。


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

创建配置文件

接下来,你必须创建 Ansible 配置文件、清单inventory和剧本playbook文件以设置客户端和守护进程。以下说明在 Atomic 主机上创建客户端和服务器证书。然后,获取客户端证书到本地。最后,它们会配置守护进程以及客户端,使它们能彼此交互。

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


  1. $ tree docker-remote-access/ 
  2. docker-remote-access/ 
  3. ├── ansible.cfg 
  4. ├── inventory 
  5. ├── remote-access.yml 
  6. └── role-secure-docker-daemon 

ansible.cfg:


  1. $ vim ansible.cfg 

  1. [defaults] 
  2. inventory=inventory 

清单文件(inventory):


  1. $ vim inventory 

  1. [daemonhost] 
  2. 'IP_OF_ATOMIC_HOST' ansible_ssh_private_key_file='PRIVATE_KEY_FILE' 

将清单文件(inventory) 中的 IP_OF_ATOMIC_HOST 替换为 Atomic 主机的 IP。将 PRIVATE_KEY_FILE 替换为本地系统上的 SSH 私钥文件的位置。

剧本文件(remote-access.yml):


  1. $ vim remote-access.yml 

  1. name: Docker Client Set up 
  2.   hosts: daemonhost 
  3.   gather_facts: no 
  4.   tasks: 
  5.     - name: Make ~/.docker directory for docker certs 
  6.       local_action: file path='~/.docker' state='directory' 
  7.     - nameAdd Environment variables to ~/.bashrc 
  8.       local_action: lineinfile dest='~/.bashrc' line='export DOCKER_TLS_VERIFY=1\nexport DOCKER_CERT_PATH=~/.docker/\nexport DOCKER_HOST=tcp://{{ inventory_hostname }}:2376\n' state='present' 
  9.     - name: Source ~/.bashrc file 
  10.       local_action: shell source ~/.bashrc 
  11. name: Docker Daemon Set up 
  12.   hosts: daemonhost 
  13.   gather_facts: no 
  14.   remote_user: fedora 
  15.   become: yes 
  16.   become_method: sudo 
  17.   become_user: root 
  18.   roles: 
  19.     - role: role-secure-docker-daemon 
  20.       dds_host: "{{ inventory_hostname }}" 
  21.       dds_server_cert_path: /etc/docker 
  22.       dds_restart_docker: no 
  23.   tasks: 
  24.     - namefetch ca.pem from daemon host 
  25.       fetch
  26.         src: /root/.docker/ca.pem 
  27.         dest: ~/.docker/ 
  28.         fail_on_missing: yes 
  29.         flat: yes 
  30.     - namefetch cert.pem from daemon host 
  31.       fetch
  32.         src: /root/.docker/cert.pem 
  33.         dest: ~/.docker/ 
  34.         fail_on_missing: yes 
  35.         flat: yes 
  36.     - namefetch key.pem from daemon host 
  37.       fetch
  38.         src: /root/.docker/key.pem 
  39.         dest: ~/.docker/ 
  40.         fail_on_missing: yes 
  41.         flat: yes 
  42.     - name: Remove Environment variable OPTIONS from /etc/sysconfig/docker 
  43.       lineinfile: 
  44.         dest: /etc/sysconfig/docker 
  45.         regexp: '^OPTIONS' 
  46.         state: absent 
  47.     - nameModify Environment variable OPTIONS in /etc/sysconfig/docker 
  48.       lineinfile: 
  49.         dest: /etc/sysconfig/docker 
  50.         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'" 
  51.         state: present 
  52.     - name: Remove client certs from daemon host 
  53.       file: 
  54.         path: /root/.docker 
  55.         state: absent 
  56.     - name: Reload Docker daemon 
  57.       command: systemctl daemon-reload 
  58.     - name: Restart Docker daemon 
  59.       command: systemctl restart docker.service 

访问 Atomic 主机

现在运行 Ansible 剧本:


  1. $ ansible-playbook remote-access.yml 

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

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

如果你想克隆 Ansible 剧本和配置文件,这里是 git 仓库

如何在Atomic主机上远程使用 Docker

 docker-daemon





作者:Trishna Guha
来源:51CTO
上一篇:【Java】几种典型的内存溢出案例,都在这儿了!


下一篇:【C++】【源码解读】std::is_same函数源码解读