LoginSignup
144
115

More than 5 years have passed since last update.

Dockerコンテナに使える「正しい」軽量init process(PID 1)まとめ

Last updated at Posted at 2016-06-15

Dockerコンテナの「正しい」init processについては、Docker and the PID 1 zombie reaping problemが詳しいです。

Docker 1.13からは--initオプションでtini相当のinit processを仕込んでくれるようになりました(Thanks to @sumomonekoさん :bow:)。以下の内容は--initの機能が未だ利用できない場合(K8Sなどでコンテナを動かす、Docker 1.12以前、など)にのみ有効です。

1コンテナ単一アプリ対応・superviseなし

tini

tini

dumb-init

dumb-init

1コンテナ複数アプリ対応・superviseあり

runit

s6-overlay

s6-overlay

s6というプロセス・スーパバイザをDockerコンテナのinit processとして使うためのツール一式です。

  • S6 Made Easy, with the S6 Overlay | Tutum Blog
  • バイナリは3.4MB
  • 260 stars
  • 170 commits
  • 45 releases
  • superviseの機能あり。
  • superviseプロセスをフォアグラウンドで起動できる
  • 複数アプリケーションを起動して、特定アプリをメインとしたい場合(例えば、cron、syslog、nginxを起動して、nginx以外は落ちたら再起動、nginxが落ちたらコンテナをエラー終了)はこれが唯一の選択肢?

Dockerコンテナ内で複数アプリケーションを実行したいときに使われる他のソリューション

  • Using Honcho to Create a Multi-Process Docker Container | via @codeship
    • HonchoというProcfileベースのアプリケーション用のスーパーバイザ
    • s6-overlay同様、代表的なプロセスが落ちたら、コンテナ自体を落とすことができる
    • ただし、Honchoはinit processではない…ので、「正しく」使いたいなら、他のinit processと組み合わせる必要があり。そうすると、Honchoの必要性は…?
    • プロセス毎にログがわかりやすくラベリングされるのはうれしいけど、Docker Loggingとの相性?

おまけ: Dockerコンテナのブートストラップに使えるテンプレートシステム

環境変数に応じて、設定ファイルや実行時引数を変えてプロセスを実行したい場合、

  • シェルスクリプト等でラップする
  • テンプレートシステムを使う
  • 上記を組み合わせる

という選択肢があります。

対象となる設定ファイルが複数であったり、変数が多かったり、プロセス数が多かったりする場合は、テンプレートシステムを利用するとよいことがあります。

  • voltgrid
  • entrykit (Entrykitはゾンビプロセスをkillしてくれないので、正しいinit processではない認識です。違ってたら誰かこっそりおしえてください)
  • johanhaleby/bash-templater & Simple templating engine in Bash
  • confd (イメージサイズが20MBくらい増えて、Alpine等でがんばってるイメージが台無しになってしまいそうですが、コンテナ内の設定ファイル・テンプレートファイルの配置が規約化されていたりするなど、複雑なテンプレーティングが必要なイメージには向いている印象)
144
115
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
144
115