Docker
======

TPAは、Dockerコンテナーを作成し、クラスターをそれらにデプロイできます。現時点では、コンテナをセットアップしてsystemdやその他のサービスを通常のVMのように実行します。

dockerコンテナへのデプロイは、さまざまなクラスター構成をテストする簡単な方法です。実稼働での使用を意図したものではありません。

概要
----

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

.. code:: bash

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

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

標準の\ ``--os Debian/Ubuntu/RedHat/SLES``
構成オプションを使用して、コンテナに使用するディストリビューションを選択します。
TPAは、このディストリビューション用に独自のsystemd対応イメージをビルドします。これらの画像には、\ ``tpa/``
プレフィックスが付いた名前が付けられます（例、\ ``tpa/redhat:8`` ）。

``--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 for Mac" <https://hub.docker.com/editions/community/docker-ce-desktop-mac/>`_ できます

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

CgroupVersion
^^^^^^^^^^^^^

CgroupVersion 2のサポートは、ansibleおよび関連するツールのdocker
sdkに対してまだ完全には焼き付けられていません。そのため、最新バージョンのdockerを使用することをお勧めしますが。バージョン2が完全にサポートされるまで、
CgroupVersion
1に依存しています。以下の手順は、プラットフォームがデフォルトでCgroupVersion
2を使用している場合、 CgroupVersion
1に切り替えるための変更を提案します。

Linuxの場合：

::

   $ echo GRUB_CMDLINE_LINUX=systemd.unified_cgroup_hierarchy=false > \
     /etc/default/grub.d/cgroup.cfg
   $ update-grub
   $ 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は非特権モードでDockerコンテナをプロビジョニングし、Linux機能フラグは追加されません。このようなコンテナは、ホストファイアウォールルール、ファイルシステム、ブロックデバイス、またはホストでの真のroot権限を必要とするその他のほとんどのタスクを管理できません。

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

::

   instance_defaults:
     privileged: true

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

Linuxケーパビリティフラグの詳細については、 ``man capabilities``
を参照してください。

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

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

::

   instance_defaults:
     docker_security_opts:
       - no-new-privileges

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

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

tpaexecは、コンテナごとまたは\ ``instance_defaults``
で設定できる\ ``docker_cap_add``
リスト変数を使用して、Linux機能フラグに対するDockerの制御を公開します。機能フラグの詳細については、
``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コンテナ管理
------------------

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

.. code:: bash

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

これらのコマンドは、コンテナーをプロビジョニングまたはプロビジョニング解除したり、接続したりしません。これらは、将来の使用に備えて利用可能な状態にしておく必要があるdockerクラスターを一時的に使用していないときに、リソースを節約することを目的としています。

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

.. code:: bash

   [tpa]$ tpaexec list-containers clustername
