Translate

2015年2月25日水曜日

Docker上のCentOSコンテナでsystemdを使えるようにする方法

CloudStack、OpenStackときたら、Dockerにも手をつけないと..

というよくわからない強迫観念にかられ
私もついに Docker に手を出しました。


..こりゃ簡単だ..

できることはVMware PlayerのNATで仮想イメージ上げたような
感じだけど、むちゃくちゃ軽い。

OSはCentOS/ubuntuだけなのが残念。

だからこれまでのハイパーバイザ型の仮想化技術に
完全に取って代わることはできないけど、
アプリ開発をやっている人がちょいと
tomcatやhttpdを起動させたい時とか
開発で使うsubversion/redmine/jenkinsサーバを必要なときに起動して
必要なくなったらイメージで固めて保管すればいい。

インストールなんてCloudStackやOpenStackなんか死ぬほど難しいけど
CentOSやubuntuならyumapt-getでさっくりはいってしまう。

なによりホスト(?)OSはCentOSやubuntuのデフォルト最小構成インストールでOK
ゲストOSのインストールは一切不要(だからライセンス問題のある有料OSはなかなか対応できないだろうけど)。


デモ環境やアプリや向きの仮想化技術だ。

DockerfileもCentOS/ubuntuを普通につかってる人ならだれでも書ける。
コマンドラインに打ち込んでいたコマンドの先頭に"RUN"つけて列挙するだけ。
あとVOLUMEやEXPOSEやいろいろあるけど、
サンプルパクればさくっと作れる。


ただ..そこまでいくまでの情報が少ない。

現時点で紙で出版されている書籍はなく、
Kindleで以下の本が販売されていた。



(この記事を書いた時点で)星3つなのは、
最初の概要がとってもおざなりでどういう技術をもとに
動いているのか読んでもさっぱりわからない。
その後は、それなりにコマンドを理解している人なら有益だけど
さいしょのとっっかりには不親切な本だ。

..星3つなのはさいごの

「Dockerを
 ドカドカ使う
 春の空

  米村正明」
が、イラッとさせたのかもしれない..



雑誌ではSoftwareDesignがある。



Docker情報にみな飢えているのか
定価1220円の雑誌が2100円(この記事書いた時点)になってる..

こちらは、Dockerが登場することになったのかのLinux上の技術の変遷が
かたられており最初のKindle本の補填をしてくれた。

Docker上のネットワーク構成の絵があるのもありがたかった。

実際の動くところ紹介は端折り過ぎなので
初心者向きにはちょっと足りないかんじ。

たぶん初心者はここから入った方がいい。

いまさら聞けないDocker入門
http://goo.gl/uMIEv2

このリンクの周辺の記事をよんで
事前情報をえるとよいとおもう。


チュートリアルも英語だけど用意されている。
DockerHubへアカウント作った翌日にサイトから
チュートリアルのリンク付きメールが送られてきた。

The best way to understand Docker is to try it!
http://goo.gl/dB58ZF

このサイト、画面左側の英語を読んででてくる
指示にあったコマンドを右側のコンソールに入力して実行すると
つぎにすすめるこうせいになっていて、
Docker環境がなくてもよく使うコマンドをひととおりおぼえることができる。

チュートリアルを済ませた後
PC上にVirtualBoxなり、VMware playerなりでCentOS7を最小インストールで
たちあげて、「yum -y install docker」すればOK。

この環境で色々試していけばいい。




で、CentOSをdocker上でごそごそ動かしてみたら
色々と不都合なことがでてきた。

大きくは以下の2点。

  1. ネットワーク系のコマンドがないし設定できない
  2. systemdがない

最初の問題、Docker上のコンテナはIPアドレスがかえられない。
nmclientとかip addr showとかが使えない..

ホスト側のNICにブリッジ接続するからで、そのあたりは変えてくれるなということのようで、"ありき"で構築しないとダメらしい。

DNSは/etc/sysconfig/docker上のオプション指定でできるようだ。


で問題なのは2つめだ。

CentOSのバージョンが7になって
適応するのに困るのがsystemdfirewall-cmd/chconがらみ。

これまでserviceで起動停止していたのを
またこんどはsystemdに変えられて
必死で対応していたのに
おぼえたとおもったら
Dockerのデフォルトコンテナではsystemdが入っていない..

Googleってみると
みんないろいろがんばっている。

そもそもわざわざfakesystemdなんていれて
隠しているので何かこのデザインに意図があるように思えた。


で、ブログではなくDockerHubのCentOSサイトを開いてみたら
案の定systemdに関する記述が見つかった。

DockerHub: OFFICIAL REPO CentOS
http://goo.gl/aKYzXi

英語なので翻訳してみた。
以下翻訳した日本語であるが
当然 at your own risk で参照してほしい。


-------

サポートしているタグおよびDockerfile


    latest, centos7, 7 (docker/Dockerfile)
    centos6, 6 (docker/Dockerfile)
    centos5, 5 (docker/Dockerfile)
    centos7.0.1406, 7.0.1406 (docker/Dockerfile)
    centos6.6, 6.6 (docker/Dockerfile)
    centos5.11, 5.11 (docker/Dockerfile)

イメージと履歴については、docker-library/official-images GitHubリポジトリのマニフェストファイル(library/centos)を参照してください。

CentOS


CentOS Linuxは、RHEL(Red Hat Enterprise Linux)のために Red Hat により公式に提供されているフリーソースをもとに構成されたコミュニティサポートされたディストリビュージョンです。このため、CentOS LinuxはRHELと機能的に互換性を持つことを目的としています。CentOS プロジェクトは、主にベンダーの商標や意匠を必要とするものを削除したパッケージに変更しています。CentOS Linux はノーコストで再配布自由です。

CentOS Linux の各バージョンは10年以上維持され続けています(セキュリティアップデートの維持:Red Hatによるサポートの間隔はソース側リリースにより異なる)。CentOS Linux の新しいバージョンはほぼ2年毎にリリースされ、各バージョンは新規ハードウェアサポートのために定期的に更新されます(だいたい6ヶ月間隔)。この結果、安全で、低メンテナンスで、信頼性がたかく、予測可能で、再現可能なLinux環境を提供します。各々のCentOS Linux版は、最高10年の間維持されます(セキュリティ最新版によって Red Hatによる支持間隔の長さは、リリースされる源に関して、時間とともに異なりました)。 新しいCentOS Linux版は、ほぼ2年おきにリリースされます、そして、各々のCentOS Linux版は、より新しいハードウェアを支持するために、定期的に更新されます(ざっと6ヵ月ごと)。これは、安全で、低-メンテナンス、信頼できて、予想できて、再生可能なLinux環境に終わります。

https://wiki.centos.org/FrontPage


CentOS イメージ ドキュメンテーション


centos:latest」タグは現時点でほぼ最新な状態となっています。


定期ビルド


CentOS プロジェクトは、すべてのアクティブリリースのイメージを定期的に更新します。これらのイメージは毎月、もしくは緊急フィックスが必要な際に更新されます。これらのローリングアップデートはメジャーバージョン番号のみでタグ付けされています。

例:「docker pull centos:6」、「docker pull centos:7

マイナータグ


さらに、インストールメディアと一致するマイナーバージョンタグのついたイメージも提供します。これらのイメージは、インストール用ISOコンテンツとマッチさせることが目的なので更新しません。

もしこれらのイメージを選択するのであれば、「RUN yum -y update && yum clean all」をDockerfileに記述するか、もしくは利用者に潜在的なセキュリティ問題を含む可能性を申し入れることを強く推奨します。
これらのイメージを使用する場合は、マイナーバージョンタグを指定してください:

例:「docker pull centos:5.11」、「docker pull centos:6.6

パッケージ ドキュメンテーション


特に指定がない場合は、CentOSコンテナは、イメージのサイズを削減するために nodocs オプションを付けたyumをつかってビルドされます。
もしパッケージをインストールして行方不明になったファイルを発見するならば、「/etc/yum.conf」内の「tsflags=nodocs」をコメントアウトして再インストールしてください。

systemd インテグレーション


現時点では、CentOS7 に含まれる systemd は削除され、依存性解決のためにかわりに fakesystemd に入れ替わっています。これは、systemdが「CAP_SYS_ADMIN」ケーパビリティ(訳者注:root の持つ細かい権限のこと、CAP_SYS_ADMIN quotaswapmount などの操作が可能)を必要としているためです(ホストOS側の cgroups を読むことができるだけではありません)。
もしあなたが fakesystemd を置き換え systemd を不通に使いたいのであれば、以下のステップに従ってください。

systemd ベースイメージのための Dockerfile


FROM centos:7
MAINTAINER "あなたの名前" <あなたの@メールアドレス>
ENV container docker
RUN yum -y swap -- remove fakesystemd -- install systemd systemd-libs
RUN yum -y update; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

この Dockerfilefakesystemd を実際のパッケージと交換しますが、問題を起こしそうな多くのユニットファイル群を削除します。ここからあなたのベースイメージファイルを構築することができます。

docker build --rm -t local/c7-systemd .」

systemd が使用可能なアプリケーションコンテナの例

上記で作成した systemd が使用可能なベースコンテナをつかって、以下のような Dockerfile を作る必要があります。


FROM local/c7-systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

このイメージのビルド:

docker build --rm -t local/c7-systemd-httpd


systemd が使用可能なアプリケーションコンテナの実行


systemd が使用可能なコンテナを実行するためには、ホスト側のcgroupボリュームをマウントするだけでなく、「--privileged」オプションを使う必要があります。

以下は、事前に作成した systemd が使用可能な httpd コンテナを実行するためのコマンド例です。

docker run --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 local/c7-systemd-httpd

このコンテナは制限されたコンテキスト内でsystemdが使用可能な状態で実行していますが、ほぼcgroupsファイルシステムをマウントした特権が付与されたコンテナとしての実行となります。

サポートされている Docker バージョン


このイメージは Docker バージョン 1.5.0 を公式にサポートしています。

(1.0下の)古いバージョンのサポートは基本ベストエフォートで提供されています。

ユーザフィードバック

Issues


もしこのイメージについての問題や質問がある場合は、https://bugs.centos.org もしくは GitHub issue のチケットを発行してください。

Freenode(https://freenode.net/)上の「#docker-library」IRCチャネル経由で多くの公式イメージメンテナーへ連絡をとることができます。

寄贈・貢献(Contributing)


ぜひ新機能、フィックス、更新、大きいもの少ないものにかかわらず、寄贈(contribute)してください;私達はいつもぞくぞくして pull request を受け取り、可能な限り早く最善を尽くします。

コーディングを開始する前に、特に野心的な寄贈の場合は、 https://bugs.centos.org のチケットもしくは GitHub issue に計画を投稿して我々と議論することをおすすめします。ほかの寄贈に対しての正しい方向性を指し示すチャンスをあたえることになり、あなたの設計上のフィードバックを受けることができ、他の人が同様の作業をしているかどうかの発見を助けてくれます。

-------


なるほど、
ホスト側のcgroupsとの兼ね合いでゲスト・ホスト間の疎結合性が崩れるのと
パッケージコマンド管理による依存関係をだまくらかす意味で
fakesystemdをやむをえず入れたわけか..


このサイトに有るように systemd をむりくり入れてもいいけど..
わざわざ特権許可したコンテナでうごかすより
CMDで起動スクリプト叩いたほうが安全かもなあ..

ケースバイケースでえらぶしかないか..


既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...