Docker
======

TPAはDockerコンテナを作成し、それらにクラスターを展開できます。現時点では、通常のVMであるかのようにsystemdおよびその他のサービスを実行するようにコンテナをセットアップします。

Dockerコンテナへの展開は、さまざまなクラスター構成をテストする簡単な方法です。実稼働使用を目的としたものではありません。

概要
----

構成時にプラットフォームを選択するだけです。

.. code:: bash

   [tpa]$ tpaexec configure clustername --platform docker […]
   [tpa]$ tpaexec provision clustername
   [tpa]$ tpaexec deploy clustername

オペレーティングシステムの選択
------------------------------

標準の\ ``--os Debian/Ubuntu/RedHat/SLES``
configureオプションを使用して、コンテナに使用するディストリビューションを選択します。
TPAは、このディストリビューション用に独自のsystemd対応イメージをビルドします。これらのイメージには、\ ``tpa/redhat:8``
など、\ ``tpa/`` 接頭辞が付いた名前が付けられます。

代わりに\ ``--os-image some/image:name``
を使用して、既存のsystemd対応イメージを指定します。例、 `centos/systemd <https://hub.docker.com/r/centos/systemd/>`_ 

イメージCentOS 7ベースは、この方法で使用できます。

TPAは、DockerコンテナでDebian 8 jessieまたはUbuntu 16.04
xenialをサポートしていません。これらのディストリビューションに同梱されているsystemdの古いバージョンのバグのため。

Dockerのインストール
--------------------

最新の安定したDocker-CEパッケージを使用してTPAをテストします。

このドキュメントでは、動作するDockerインストールがあり、イメージのプルやコンテナの作成などの基本的な操作に精通していることを前提としています。

`install Docker <https://docs.docker.com/engine/install/>`_ および `get started <https://docs.docker.com/get-started/>`_ のヘルプが必要な場合は、
`Docker documentation <https://docs.docker.com>`_ を参照してください。

MacOS Xでは、次のことができます `install "Docker Desktop forMac" <https://hub.docker.com/editions/community/docker-ce-desktop-mac/>`_ 

そして、アプリケーションメニューからDockerを起動します。

Cgroup
^^^^^^

TPAは、cgroupsバージョン1または2を実行しているホストでDockerコンテナをサポートします。
cgroups2を実行しているホストでは、RHEL
7を実行しているインスタンスはサポートされていません。

RHEL
7インスタンスを使用する必要があるが、ホストがcgroupsバージョン2を実行している場合、次のようにcgroupsバージョン1に切り替えることができます。

DebianファミリーのLinuxディストリビューションの場合

::

   $ echo GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false > \
     /etc/default/grub.d/cgroup.cfg
   $ update-grub
   $ reboot

RedHatファミリーのLinuxディストリビューションの場合

::

   $ grubby --args=systemd.unified_cgroup_hierarchy=false --update-kernel=ALL
   $ reboot

MacOSの場合

1. ~/ ライブラリー/Group\\
   Containers/group.com.docker/settings.jsonを編集し、次の置き換えを行います
   ``"deprecatedCgroupv1": false`` → ``"deprecatedCgroupv1": true``

2. Dockerデスクトップアプリを再起動します

アクセス許可
^^^^^^^^^^^^

TPAは、それを実行しているユーザーがDockerデーモンへのアクセス権限を持っていることを想定しています通常は、\ ``/var/run/docker.sock``
を所有する\ ``docker``
グループのメンバーであること。次のようなコマンドを実行して、アクセスがあるかどうかを確認します。

.. code:: bash

   [tpa]$ docker version --format {{.Server.Version}}
   19. 03.12

!!!警告

ユーザーにDockerデーモンと対話できる機能を提供すると、Dockerホストでのrootを簡単に取得できます。信頼できるユーザーのみがDockerデーモンにアクセスできる必要があります。

.. ::
   ### Dockerコンテナ特権

特権コンテナ
^^^^^^^^^^^^

デフォルトでは、TPAはLinux機能フラグを追加せずに、非特権モードでDockerコンテナをプロビジョニングします。このようなコンテナは、ホストファイアウォールルール、ファイルシステム、ブロックデバイス、またはホストで真のroot権限を必要とするその他のほとんどのタスクを管理できません。

コンテナを特権モードで実行する必要がある場合は、それを必要とするインスタンスまたは\ ``instance_defaults``
でグローバルに\ ``privileged`` ブール変数を設定します。例

::

   instance_defaults:
     privileged: true

!!!警告

特権モードでコンテナを実行すると、
rootユーザーまたはrootを取得できるプロセスは、カーネルモジュールのロード、ホストファイアウォールルールを変更、コンテナ名前空間をエスケープ、またはその他の方法で実際のホストの「root」ユーザーと同じように動作できます。本当に必要な場合を除き、特権モードでコンテナを実行しないでください。

.. ::
   Linux機能フラグの詳細については、 `man capabilities` を参照してください。

``security_opts`` および\ ``no-new-privileges`` フラグ
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

tpaexecは、プロセスが特権を増加できない制限モードでDockerコンテナを起動できます。
setuidバイナリは制限されているなど。 ``instance_defaults``
またはコンテナごとの変数\ ``docker_security_opts``
を使用してtpaexecでこれを有効にします。

::

   instance_defaults:
     docker_security_opts:
       - no-new-privileges

``docker run`` の\ ``--security-opts`` への他の引数も受け入れられます。
SELinuxのユーザーとロール。

Linux機能フラグ
^^^^^^^^^^^^^^^

tpaexecは、 ``docker_cap_add``
リスト変数を使用してLinux機能フラグをDockerの制御を公開します。このリスト変数は、コンテナごとまたは\ ``instance_defaults``
で設定できます。機能フラグの詳細については、 ``man capabilities``
、\ ``docker run`` ドキュメント、およびAnsible ``docker_containers``
モジュールのドキュメントを参照してください。

Dockerの\ ``--cap-drop`` は、 ``docker_cap_drop``
リストを介してサポートされています。

たとえば、コンテナを非特権として実行しながら、システムクロックを変更する機能を付与するには、次のように書くことができます。

::

   instance_defaults:
     privileged: false
     docker_cap_add:
       - sys_time
     docker_cap_drop:
       - all

Dockerストレージ構成
^^^^^^^^^^^^^^^^^^^^

多くのホスト上のデフォルトのDocker構成は\ ``lvm-loop``
ブロックストレージを使用し、運用展開には適していません。 ``docker info``
を実行して、使用しているストレージドライバーを確認します。ループバックスキームを使用している場合、次のようなものが表示されます。

::

    Storage Driver: devicemapper
     …
     Data file: /dev/loop0

ストレージ構成の詳細については、Dockerドキュメントを参照してください。

- `Storage Drivers <https://docs.docker.com/storage/storagedriver/>`_ 

- `Configuring lvm-direct for production <https://docs.docker.com/storage/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production>`_ 

Docker MTU設定
^^^^^^^^^^^^^^

デフォルトでは、Dockerネットワークの最大転送ユニットMTUは1500バイトです。これがホストシステムのネットワークインターフェイスのMTUより大きい場合、そのインターフェイスを介してDockerコンテナに接続をルーティングする際に問題が発生する可能性があります。
``ipconfig | grep mtu`` 、\ ``ip |grep mtu``
などのコマンドを使用して、ネットワークインターフェイスのMTUを確認できます。以下に示すように、\ ``config.yml``
のネットワークに適切なドライバーオプションを追加することにより、TPAによってプロビジョニングされたDockerネットワークのMTUを変更できます。

.. code:: shell

   docker_networks:

   - ipam_config:
     - subnet: 10.33.214.192/28
     name: tpa-docker
     driver_options:
       com.docker.network.driver.mtu: 1400

!!!警告

MTUは、Dockerネットワークが最初にプロビジョニングされるときにのみ設定できます。
config.ymlの後続の変更は効果ありません。

.. ::
   Dockerネットワークに接続されたコンテナ内から上記のコマンドのいずれかを実行することにより、DockerネットワークのMTUを確認できます。 `docker network inspect <network-name> | grep mtu` を使用することもできますが、これはMTUが明示的に設定されている場合にのみ機能します。

Dockerコンテナ管理
------------------

クラスター内のすべてのDockerコンテナは、 ``start-containers``
および\ ``stop-containers``
コマンドを使用して、一緒に起動および停止できます。

.. code:: bash

   [tpa]$ tpaexec start-containers clustername
   [tpa]$ tpaexec stop-containers clustername

これらのコマンドは、コンテナをプロビジョニングまたはプロビジョニング解除し、さらにはコンテナに接続しません。これらは、将来の使用に備えて維持する必要があるDockerクラスターを一時的に使用しない場合に、リソースを節約することを目的としています。

クラスター内にプロビジョニングされたDockerコンテナの概要を表示するには、起動または停止にかかわらず、
``list-containers`` コマンドを使用します。

.. code:: bash

   [tpa]$ tpaexec list-containers clustername
