Docker

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

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

概要

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

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

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

標準の--os Debian/Ubuntu/RedHat 構成オプションを使用して、コンテナに使用するディストリビューションを選択します。 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を起動できます。

Cgroupバージョン

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ホストでルートを取得できます。信頼できるユーザーのみがDockerデーモンにアクセスできるようにする必要があります。

Dockerコンテナの権限

特権コンテナ

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

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

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は、コンテナごとまたは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