Docker

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

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

概要

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

[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 7ベース)はこの方法で使用できます。

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

Dockerのインストール

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

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

install Docker および get started に関するヘルプが必要な場合は、 Docker documentation にご相談ください。

MacOS Xでは、アプリケーションメニューから install “Docker Desktop for 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 グループのメンバーであることによる)。次のようなコマンドを実行して、アクセスできるかどうかを確認します。

[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のドキュメントを参照してください。

Dockerコンテナ管理

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

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

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

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

[tpa]$ tpaexec list-containers clustername