Docker#

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

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

概要#

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

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

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

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

代わりに--os-image some/image:name を使用して、既存のsystemd対応イメージを指定します。例、 centos/systemd

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

Dockerのインストール#

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

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

install Docker および get started のヘルプが必要な場合は、 Docker documentation を参照してください。

MacOS Xでは、次のことができます install "Docker Desktop forMac"

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

Cgroup#

すべての Distribution support は、cgroupsバージョン2のサポートを提供します。古いオペレーティングシステムを使用している場合を除き、Dockerに展開するときは、ホストマシンで常にcgroupsバージョン2を使用する必要があります。

!!!重要

古いシステムを使用する手順は、純粋にテストまたはこれらのプラットフォームからの移行をサポートするために提供されています。

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 グループのメンバーであること。次のようなコマンドを実行して、アクセスがあるかどうかを確認します。

docker version --format {{.Server.Version}}
19. 03.12

警告

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

特権コンテナ#

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

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

instance_defaults:
  privileged: true

警告

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

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

Docker MTU設定#

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

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コンテナは、 start-containers およびstop-containers コマンドを使用して、一緒に起動および停止できます。

tpaexec start-containers clustername
tpaexec stop-containers clustername

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

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

tpaexec list-containers clustername