質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.46%

  • Ubuntu

    805questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • Docker

    368questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

dockerコンテナの中のサービスを自動起動したい

解決済

回答 3

投稿 2015/11/05 13:51 ・編集 2015/11/05 13:52

  • 評価
  • クリップ 1
  • VIEW 8,941

mint.cherry

score 263

質問はタイトルとおりです。

環境:ubuntu15.04

docker 1.8.3コンテナ:ubuntu14..04

やったこと

自動起動コマンドsystemctlコマンドがコンテナの中では、なかったため[apt-get -y install sysv-rc-conf]で自動起動してくれるものを導入
sysv-rc-conf postfix on
exitでコンテナを終了させて、startで起動
ps aux | grep postfix
なにも出ませんでした。
sysv-rc-conf -list
runlevel -listでonになっているrunlevelを確認
現在のランレベルを知りたくてrunlevelコマンドを実行
unknownとでてきました。

どうしたら、コンテナの中でサービスを自動起動できますか?現在のrunlevelがunknownにも疑問を持ちます。

よろしくお願いしますm(__)m
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

自動起動について

通常の Linux OS では init プロセスから sysvinit, upstart, systemd などの仕組みにより、各プロセスが起動しますが、docker コンテナ(のOSイメージ)では、init プロセスではなく、直接プロセスを実行するようにするよう想定されています。runlevel の概念もありません。

そのため、chkconfig on/off (sysvinit), sysv-rc-conf on/off (upstart), systemctl enable/disable (systemd) などの自動起動設定は効きませんし、initctl start/stop (upstart), systemctl start/stop (systemd)による起動/停止も init や udev プロセスが無いのでダメだと思います。
service start/stop (sysvinit) はできるかもしれません。シェルスクリプトの作りによります。

なので、docker run の引数で直接プロセスを起動するか、dockerfile の CMD, ENTRYPOINT でプロセスを起動するよう設定し、イメージを作成しておくことになると思います。

複数プロセスの起動について

docker の考えとしては、1コンテナで 1プロセスを実行し、コンテナの連携に link を使うようにすることを推奨しているようです。
Best practices for writing Dockerfiles の Run only one process per container 箇所

複数プロセスを起動するには、苦肉の策ですが、以下のようなシェルスクリプトを用意し、docker run で起動するといいと思います。

/init.sh
#!/bin/bash

/usr/sbin/service rsyslog start  # バックグランドで起動 
/usr/sbin/service postfix start  # バックグランドで起動

while true ; do
    /bin/bash    # 最後のプロセスはフォアグラウンドで起動
done
最後の /bin/bash は docker attach でコンテナ内に入るためのものです。
Control-p, Control-q で抜ける(detach)することができます。
誤って exit しても /bin/bash が再起動し、init.sh プロセス自体は終了しませんので、コンテナも終了しません。

あるいは、monitを導入して、monit から各プロセスを起動する方法もあります。

投稿 2015/11/10 10:11

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/11/10 13:15

    回答ありがとうございます。
    dockerだとinitプロセスがないのですね。
    dockerfileの中にENTRYPOINT service rsyslog startで実際に試してみましたらコンテナを作った際に、コマンドが実行されました!dockerfileはこのように使うのですね。

    >1コンテナで 1プロセス
    と書いてありますが、このような解釈でいいでしょうか?
    もし、mailサーバーを構築する際にpostfixとdovecotは2つのコンテナでそれぞれ分けるべき。


    シェル・シェルスクリプトとは?から始まりました(汗)すいません、プログラム(?)がなんて書いてあるかわかりませんm(__)m(汗)
    シェルについてはある程度理解しました。複数プロセスを動かすのに今まで無理やり、serviceコマンドを使いまくってました。


    最後ですが、何回も利用しているのでattach,dettachはわかりますm(__)m
    exitでコンテナ終了しないのが気にかかります
    コンテナ側でexitしたあとにホスト側でdocker psと実行したら、exitしたコンテナはなくなっています。きちんと終了させるのは、docker stopコマンドの方がよろしいでしょうか?

    キャンセル

  • 2015/11/10 14:11

    このあといろいろとやってみましたがコンテナに入れませんでした。。。
    Dockerfileに
    FROM user/ubuntu:14.04
    ENTRYPOINT service rsyslog start

    docker build -t log:log .
    dokcer images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    log log b557c63fedce 8 minutes ago 188.4 MB

    docker run --name log -i -t log:log /bin/bash
    docker start -a -i log
    * Starting enhanced syslogd rsyslogd [OK]

    この時点でコンテナの中に入れるのですが、これだけでて終わってしまいました。。。

    docker ps -a
    7cf47ee1f66e log:log "/bin/sh -c 'service " 9 minutes ago Exited (0) 9 minutes ago log

    キャンセル

  • 2015/11/10 14:37

    最後のプロセスはフォアグラウンドで起動する必要があります。
    最後のプロセスが終了すると、コンテナが stop しますので。

    キャンセル

  • 2015/11/10 16:56

    返信ありがとうございますm(__)m
    やり方がまた違ったものですけどDockerfileにENTORYPOINT /bin/bash --login と記述すれば、出来ました。これがフォアグランドで起動してくれるのかな。。

    キャンセル

+2

Dockerを半年ほどやっていて、未だにそのあたりは疑問です。
もともとは1コンテナに1プロセスが基本のようで、「ENTRYPOINT /usr/sbin/postfix ...」 などと書くのが正式なのかと思ってはいますが、質問者と同じように通常(Docker環境でない時)と変わらぬ設定で起動したいです。

いくつか理由があるのですが、以下の理由から最後にshellを起動しています。

  • できる限り通常同じコマンド
  • プログラムのバージョンにより、起動の仕方が変わるとイヤだなぁ
  • 意味のある単位でコンテナに詰めたいので複数サービスを起動したい

なので私は次のような感じで起動しています。

ENTRYPOINT service apache2 start && service postfix start && /bin/bash --login

これよりスマートなやり方があるなら私も知りたいですね。

投稿 2015/11/07 08:10

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

Docker初心者なので、間違っていたらごめんなさい。

Dockerコンテナの場合、イメージ自体を修正しない限り、稼動中に加えた設定変更も、コンテナを再起動すると戻ってしまいますよね?

なので、その様なケースは、Dockerfile に必要な 追加設定 を書いておけば良いようです。

下記ページはMySQLの例ですが、コンテナ起動時にサービスを自動起動させる方法の参考になると思います。

    DockerfileでCentOS6.6 + MySQLを自動起動するサーバを作る

投稿 2015/11/05 18:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.46%

関連した質問

同じタグがついた質問を見る

  • Ubuntu

    805questions

    Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

  • Docker

    368questions

    Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです