めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

RHEL Atomic HostのSPCとatomicコマンドについて

(参考)RHEL Atomic Hostのご紹介

RHEL Atomic HostのGA版では、ベータ版にはなかった下記の機能拡張が行われています。これらをクイックに紹介します。

・SPC(Super Privileged Container)
・atomicコマンドによるコンテナのセットアップ
・Red Hat公式レジストリーの登録

SPC(Super Privileged Container)

Atomic Hostでは、yumコマンドがなく、/usr以下がreadonlyのため、ホスト上にアプリケーションを導入することができません。「アプリケーションはコンテナで起動するからいいだろ」という発想もあるのですが、lsofやtcpdumpなど、ホストを管理するためのコマンドの追加ができなくて困ることもあります。この問題に対応するのがSPCです。SPCは、ホスト環境を管理するためのコマンドやアプリケーションをコンテナで実行するという「裏ワザ」を提供します。

その実体は何かというと、dockerコマンドにオプションをいろいろ付けまくると、「ファイルシステム以外は、ホストと同じ環境が見えるコンテナ(つまり、chrootしただけのアプリケーションと同じ状態)」を作ることができます。これが、SPCです。SPCの中でlsofとかtcpdumpを実行すると、ホスト環境の管理ができるという寸法です。

具体的には次のオプションでコンテナを起動します。

# docker run -it --name mytools --privileged --ipc=host --net=host --pid=host \
  -v /run:/run -v /var/log:/var/log -v /etc/localtime:/etc/localtime -v /:/host \
  rhel7/tools /bin/bash

ここでは、-vオプションでホストの「/」をコンテナの「/host」にマウントしているので、「/host」から、ホストのファイルシステムにアクセスすることも可能です。

ホストを監視するエージェントなどは、コンテナイメージ化しておいて、SPCで実行すると良いでしょう。その気になれば、SPC内でmodprobeして、カーネルモジュールをロードすることもできるかも知れません。

SPCを起動する際のオプションの一部は、Atomic Hostに同梱のDockerのみで使用できるので注意してください。(アップストリームのDockerには、これからマージされる予定とのことです。)

atomicコマンドによるコンテナのセットアップ

SPCを起動するのに、オプションを付けまくるのは面倒です。atomicコマンドを使うと、事前にコンテナイメージに埋め込んでおいた(オプション付きの)起動コマンドを一発で実行することができます。

具体的には、Dockerfileからコンテナイメージを作成する際に、LABEL命令で、「RUN」「INSTALL」「UNINSTALL」の3種類のメタデータを埋め込んでおきます。次は、lsofとtcpdumpとnet-toolsを入れたイメージを作るサンプルです。

FROM rhel7.1
MAINTAINER  Etsuji Nakai
ENV container docker
RUN yum -y install lsof tcpdump net-tools; yum clean all

LABEL Vendor="Red Hat" License=GPLv2
LABEL Version=1.0
LABEL RUN="docker run -it --name NAME --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=NAME -e IMAGE=IMAGE -v /run:/run -v /var/log:/var/log -v /etc/localtime:/etc/localtime -v /:/host IMAGE"
LABEL INSTALL="echo install"
LABEL UNINSTALL="echo uninstall"

CMD [ "/bin/bash" ]

このイメージに対して、次のコマンドを実行すると「RUN」で指定されたコマンドが実行されて、SPCとしてコンテナが起動します。(--nameオプションの値は、指定コマンド実行時に、環境変数NAMEにセットされます。)

# atomic run --name mytool rhel7/tools

SPCに限らず、事前に決められたオプションでdockerコマンドを実行させたい場合は、この手法が活用できるでしょう。

同様に、次のコマンドでは、それぞれ、「INSTALL」「UNINSTALL」で指定されたコマンドが実行されます。

# atomic install rhel7/tools
# atomic uninstall rhel7/tools

先ほどのDockerfileの例では、意味のないechoコマンドを用意していますが、これらは、コンテナを利用する前にホスト側で事前準備が必要なアプリケーションがあった場合(ホスト側にデータ領域のディレクトリを作っておくなど)に、事前準備をするコマンドを「INSTALL」で指定しておくような使い方が想定されています。「UNINSTALL」は、逆に、事前準備を無かったことにするコマンド(ホスト側に作ったディレクトリを削除するなど)を指定しておきます。

「UNINSTALL」がセットされていないイメージに「atomic uninstall」を実行すると、ホストからイメージを削除します。

※本記事執筆時点では、atomicコマンドの不具合で「UNINSTALL」ラベルが無視されますが、これは修正される予定です。
Bug 1200434 - atomic uninstall doesn't run uninstall command

コンテナイメージに埋め込まれたLABEL情報は、「atomic info」コマンドで確認できます。(Vendor, Versionなどは、実行には影響しない単なる情報として埋め込んでいます。)

# atomic info rhel7/tools
Vendor       : Red Hat
License      : GPLv2
Version      : 1.0
INSTALL      : echo install
RUN          : docker run -it --name NAME --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=NAME -e IMAGE=IMAGE -v /run:/run -v /var/log:/var/log -v /etc/localtime:/etc/localtime -v /:/host IMAGE
UNINSTALL    : echo uninstall

Red Hat公式レジストリーの登録

/etc/sysconfig/dockerに下記の設定が追加されており、「docker pull」でRed Hat公式レジストリーのイメージを取得することができます。

ADD_REGISTRY='--add-registry registry.access.redhat.com'

たとえば、次のコマンドで公式のRHEL7.1イメージが取得できます。

# docker pull rhel7.1

公式イメージについては、ダウンロード時に、改変されていなことをチェックサムで確認するようになっています。

公式レジストリーはsearchには対応していないので、「docker search」で登録イメージを検索することはできません。公式イメージの一覧は、Red HatのWebサイトで確認してください。