2020-12-26に投稿

Dockerの学習 #2 (コンテナの起動・操作コマンド RUN、EXEC、ATTACH、STOP・KILL・START)

Qrunchからお引越しした記事です : created_at: 2019-05-04 19:00:26 +0900

前回イメージファイルの取得まで勉強したので、今回は起動・操作・停止系の基本コマンドを勉強していく。

参考URL

1.とても分かりやすいサイト
https://morizyun.github.io/docker/about-docker-command.html
2.ドキュメント日本語化プロジェクト(主にコマンドリファレンスを参照)
http://docs.docker.jp/index.html
3.シグナルについて
https://qiita.com/hoto17296/items/07206f25d8cdfad4d358

RUN

イメージファイルを元にコンテナを起動する。
このコマンドでコンテナのディスク作成・メインプロセス(アプリケーションのプロセス)開始が実行される。
(RUNというコマンドなのに起動だけでなくMAKEまでするのか・・・)

  • コマンド
    docker run [オプション] イメージ[:タグ|@ダイジェスト値] [コマンド] [引数...]

  • 例1:イメージファイル「mysql」を元にコンテナ起動
    docker run mysql
    イメージファイルが無いときはイメージのダウンロードも自動実行される。

  • 例2:イメージファイル・タグ指定でコンテナ起動
    docker run ubuntu:14.04
    タグの指定、ダイジェスト値の指定も可能な様子。

  • 例3:コンテナに名前を付ける
    docker run --name sql01 mysql
    「--name」で任意の名前を付与。
    付けない場合は自動で命名される。

  • 例4:ポートのひも付け(ホスト⇔コンテナ)
    docker run -p 8080:80 nginx
    「-p ホストのポート:コンテナのポート」で指定。
    上の例の場合、ホストの8080ポートへの通信はコンテナの80ポートへつながっている。
    (NAPTみたいな動きをしてくれるってことかな?)

  • 例5:起動したコンテナでBashを使う(既定のアプリでなくBashを起動する)
    docker run -it --entrypoint /bin/bash mysql
    Bashを使いたい今回のケースでは「--entrypoint」を指定する必要がある。
    イメージファイルには「ENTRYPOINT」という「起動後に一番最初に実行するコマンド」が
    定義されており、通常はそれが実行される。
    ⇒メインプロセスの実行コマンド、という解釈でよいはず。
    このケースでは、まずBashを使いたいので、ENTRYPOINTをBashの実行(/bin/bash)で上書きしてやる。
    ⇒メインプロセスをBashにしてやる。
    「-i」が「ホストの入力をコンテナの標準出力へつなげる」、
    「-t」が「コンテナの標準出力とホストの出力をつなげる」。
    大抵の場合IO両方を指定すると思うので「-it」とセットで使う模様。
    「アプリケーションのプロセスは起動するけど、それとは別にBashを使いたい」というケースは
    後述のEXECコマンドを使う。

  • 例6:終了時にコンテナ削除
    docker run -rm mysql
    「-rm」でコンテナの終了時にコンテナを自動で削除してくれる。

  • 補足
    リファレンスによると、イメージファイルに定義された次の情報をRUN実行時に上書きできるとのこと。

    ・デタッチドあるいはフォアグラウンドで実行
    ・コンテナの識別
    ・ネットワーク設定
    ・実行時の CPU とメモリの制限
    ・権限と LXC 設定

 コンテナのリソース設定やネットワーク周りの詳細設定もできる模様。
 このあたりまで深く理解しようとすると頭がパンクしそうなので、後回し。
 ⇒ただ、実運用するとなったら避けては通れなそう。

EXEC

コンテナに追加のプロセス(メインプロセスとは別のプロセス)を実行させる。
ターミナルアクセスなどに使う。

  • コマンド
    docker exec [オプション] コンテナ名 コマンド [引数...]

  • 例1:メインプロセスとは別にBashプロセスを起動
    docker exec -it web01 /bin/bash
    「web01」というコンテナのBashを起動。
    RUNの時と同様に「-it」をオプションにつける。
    「-i」は「標準入力(STDIN)を開いたままにする」
    「-t」は「擬似デバイス(ディスプレイ)へ接続」みたいな感じ。

ATTACH

実行中のコンテナのメインプロセスの標準入力、標準出力へ接続する。
ちなみに、接続後「exit」でメインプロセスを終了するとコンテナが停止する模様。

なお、コマンドの定義としては
「メインプロセス 」=「PIDが1のプロセス」として扱っているらしい。

  • コマンド
    docker attach [オプション] コンテナ名

  • 例1:コンテナ「web01」のプロセスへ接近
    docker attach web01

STOP・KILL・START

コンテナの停止と開始ができる。
「コンテナの停止」⇒「コンテナのメインプロセスの停止」
「コンテナの開始」⇒「コンテナのメインプロセスの開始」
という感じか。

  • コマンド
    docker stop [オプション] コンテナ名
    docker kill [オプション] コンテナ名
    docker start [オプション] コンテナ名

  • STOPとKILLの違い
    STOPは終了信号(SIGTERM)を送信し、一定時間経過後に強制終了信号(SIGKILL)を送信する。
    KILLは強制終了信号(SIGKILL)を送信する。
    強制停止の要否によって使い分けか。(シャットダウンとパワーオフ(電源オフ)の関係な様なものか)

  • 例1:コンテナ「web01」を通常停止
    docker stop web01
    オプションなしでstopコマンドを利用した場合、
    終了信号を送って10秒(デフォルト値)経過した後に、強制終了信号を送信する。

  • 例2:コンテナ「web01」を通常停止、ただし強制停止までに1分まつ
    docker stop -t 60 web01
    「-t」または「--time」で強制終了信号送信までの時間を秒単位で指定することも可能。

  • 例3:コンテナ「web01」を強制停止
    docker kill web01
    メインプロセスの強制終了時はKILL。

  • 例4:コンテナ「web01」を開始
    docker start web01
    メインプロセスの開始。

所感

・RUNは奥が深そうだ・・・
 イメージファイルに定義されていることと違うことがしたい!って
 時は色々指定してやらないといけない、って感じか。
・今回の勉強内容でDockerの概念がだいぶ分かってきた。
 参考URL1に記載されているイメージ、コンテナ、プロセスの関係性の図が大分理解できた(気がする)。
・色んなサイトを見たときのコマンド例で、RUN時にポート番号指定している意味が全然分からなかった。
 けど、やっとわかった。
・次は残りの基本コマンドをサラッとさらって、その次は色々実践してみよう。

ツイッターでシェア
みんなに共有、忘れないようにメモ

view_list Docker自己学習
第1回 Dockerの学習 #1 (イメージファイルとPULLコマンド)
第2回 Dockerの学習 #2 (コンテナの起動・操作コマンド RUN、EXEC、ATTACH、STOP・KILL・START)
第3回 Dockerの学習 #3 (PS、IMAGES、COMMIT、PUSH、RM、RMI、(BUILD))
第4回 Dockerの学習 #4 (Wordpressを使おう その1:Mysqlセットアップ)
第5回 Dockerの学習 #5 (Wordpressを使おう その2:Wordpressセットアップ)

ANA

日々勉強中です ( ..)φ

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント