Qrunchからお引越しした記事です : created_at: 2019-05-04 19:00:26 +0900
前回イメージファイルの取得まで勉強したので、今回は起動・操作・停止系の基本コマンドを勉強していく。
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というコマンドなのに起動だけでなく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 設定
コンテナのリソース設定やネットワーク周りの詳細設定もできる模様。
このあたりまで深く理解しようとすると頭がパンクしそうなので、後回し。
⇒ただ、実運用するとなったら避けては通れなそう。
コンテナに追加のプロセス(メインプロセスとは別のプロセス)を実行させる。
ターミナルアクセスなどに使う。
コマンド
docker exec [オプション] コンテナ名 コマンド [引数...]
例1:メインプロセスとは別にBashプロセスを起動
docker exec -it web01 /bin/bash
「web01」というコンテナのBashを起動。
RUNの時と同様に「-it」をオプションにつける。
「-i」は「標準入力(STDIN)を開いたままにする」
「-t」は「擬似デバイス(ディスプレイ)へ接続」みたいな感じ。
実行中のコンテナのメインプロセスの標準入力、標準出力へ接続する。
ちなみに、接続後「exit」でメインプロセスを終了するとコンテナが停止する模様。
なお、コマンドの定義としては
「メインプロセス 」=「PIDが1のプロセス」として扱っているらしい。
コマンド
docker attach [オプション] コンテナ名
例1:コンテナ「web01」のプロセスへ接近
docker attach web01
コンテナの停止と開始ができる。
「コンテナの停止」⇒「コンテナのメインプロセスの停止」
「コンテナの開始」⇒「コンテナのメインプロセスの開始」
という感じか。
コマンド
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時にポート番号指定している意味が全然分からなかった。
けど、やっとわかった。
・次は残りの基本コマンドをサラッとさらって、その次は色々実践してみよう。
第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セットアップ) |
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント