今回は、Dockerのコンテナについて、理解を深めました。
Dockerのコンテナの起動の仕組みを確認し、起動に合わせてコマンドを実行したり、コンテナを停止したり削除したりできるようになりました。
今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。
とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!
では、振り返っていきたいと思います。
Dockerのコンテナについて理解を深める
1.docker runコマンドについて知る
まずは、docker runを詳しく学びました。
docker runは大きく分けて、create(作成する)とstart(起動する)の2ステップの処理が行われます。
この2ステップの処理を別々に実行します。
docker create hello-world
createされた状態を確認します。
docker ps -a
hello-worldのコンテナが作成され「STATUS」が「Created」になっていることが確認できました。
次に、docker startで、コンテナを起動します。
docker start e03e9b972652
コンテナIDだけが返ってきます。
再度、状態を確認します。
docker ps -a
「STATUS」が「Exited」になっています。
hellow-worldコンテナは、起動後すぐに処理を実行した後Exitしてしまうので、なにも出力されず、「Exited」状態になってしまいます。
出力する結果を知りたい場合は、以下を使います。
docker start -a e03e9b972652
出力結果が確認できました。
2.コンテナ起動時にデフォルトコマンド以外を実行する
hello-worldでは、コンテナ起動時に自動的に(デフォルトコマンドで)「Hello from Docker!」という文字列を出力してExitすることを確認しました。
今度は、ubuntuのコンテナ起動時に、デフォルトコマンド以外のコマンドを実行してみます。
まず、ubuntuのコンテナをデフォルトコマンドで起動した場合にどうなるか確認します。
docker run ubuntu
何も出力されず終了します。
コンテナの状態を確認します。
docker ps -a
「STATUS」が「Exited」になっており、hello-world同様に、コンテナが作成され、起動され、デフォルトコマンド実行後、Exitしています。
次に、デフォルトのコマンドではなく、「ls」を実行してみます。
docker runコマンドの2つ目の引数に実行したいコマンド、今回の場合は「ls」を指定します。
docker run ubuntu ls
コンテナが起動後、「ls」コマンドを実行して、出力できました。
ただ、デフォルトコマンド同様、実行後は、コンテナからExitします。
3.コンテナ起動後にExitせずに入力可能な状態にする
先ほどは、デフォルトコマンドを実行後、Exitしてしまいましたが、コンテナ上でもろもろ処理できるように入力可能な状態にします。
[-i]オプションを付けることで、入力可能な状況になります。
また、[-t]オプションも追加した[-it]とすることで、図8.のような出力ではなく、見やすい出力になります。
これで、コンテナを起動後、bashを実行し、入力可能な状態となり、表示もきれいになりました。
4.コンテナを削除・停止・全削除する
まず、コンテナの状態を確認します。
docker ps -a
「STATUS」が「Exited」になっている2つ目のコンテナを削除します。
削除するには、docker rmコマンドを使って、引数にコンテナIDを指定します。
docker rm 73abf556080e
再度コンテナの状態を確認します。
docker ps -a
2つ目のコンテナ「73abf556080e」が削除されました。
同様に、1つ目のコンテナも削除したいところですが、このコンテナは、「STATUS」が「Up」の状態なので、削除することができません。
このため、まずは、このコンテナを停止させます。
停止するには、docker stopコマンドを使って、引数にコンテナIDを指定します。
docker stop afba2b1baf15
再度コンテナの状態を確認します。
1つ目のコンテナも「STATUS」が「Exited」になっていることが確認できました。
これで、先ほどと同様にdocker rmコマンドでコンテナが削除できます。
最後に、停止されているコンテナを全て削除します。
コンテナを全て削除するにはdocker system pruneコマンドを実行します。
docker system prune
コマンドを実行すると、本当に削除してよいか確認されるので、削除して良ければ「y」を入力すると削除が実行されます。
コンテナの状況を確認します。
docker ps -a
全てのコンテナが削除されたことが確認できました。
5.コンテナのファイルシステムの独立性の確認
コンテナのファイルシステムと、ホストのファイルシステムや別のコンテナのファイルシステムとは独立していて、何もしなければ、相互にファイルのやり取りはできません。
2つのコンテナを作って確認していきます。
まずは、コンテナを1つ作成して、そのファイルシステムの中に、「test1」というファイルを作成します。
touch test1
ls
次に同様に、もう1つコンテナを起動して、「test2」ファイルを作成します。
touch test2
コンテナが2つ起動していることを確認します。
次に、それぞれのコンテナのルートディレクトリのファイルを確認します。
1つ目のコンテナは「test1」のみ、2つ目のコンテナは「test2」のみが作成されていて、ファイルシステムが別々であることが確認できました。
6.コンテナに名前を付ける
これまで、コンテナを起動するときに、特にコンテナの名称は指定しませんでしたが、コンテナの名称を指定しない場合は、ランダムな名前が付けられます。
ずっと起動させ続けたり、共有サーバとして使うときや、他のプログラムで使用するときのように、決まった名前が必要となる場合には、名前を指定してコンテナを起動することができます。
docker run コマンドで、[--name]オプションを指定して、引数の1つ目にコンテナの名前、2つ目にDocker imageを指定します。
docker run --name sample_container ubuntu
コンテナの状態を確認します。
docker ps -a
「NAMES」に先ほど指定した「sample_container」が付けられていることが確認できました。
すでに作成されているコンテナに同じ名前があった場合はエラーとなるので、注意が必要です。
7.detachedモードとforegroundモード
ずっと起動させたままにしたい場合などに、バックグラウンドでコンテナを起動させておきたい場合などは、detached モードを利用します。
また、逆に一回一回、コンテナを終了させる毎に、コンテナを削除する場合は、foregroundモードを利用します。
では、まずdetachedモードでコンテナを起動します。
detachedモードでコンテナを起動するには、[-d]オプションを使います。
detachedモードで起動すると、[-it]オプションを指定しても、何も表示されずにホストのプロンプト戻ってきます。
コンテナの状態を確認します。
docker ps -a
コンテナの状態を確認すると「STATUS」が「Up」になっていて、バックグラウンドで実行状態で、Exitしていないことが分かります。
次にforegroundモードでコンテナを起動します。
foregroundモードでコンテナを起動するには、[--rm]オプションを使います。
docker run --rm hello-world
foregroundモードでhello-worldコンテナを起動すると、これまで通り、「Hello from Docker!」が出力されて、ホストのコマンドに戻ってきました。
では、コンテナの状態を確認します。
docker ps -a
これまでは、hello-worldを起動した後は、Exitしたコンテナが残っていましたが、コンテナが残っていません。
これは、[--rm]オプションをつけることで、コンテナ起動後、Exitして、そのあとコンテナの削除も実行してくれるからです。
一度きり起動のコンテナは、こうすることで、残骸が残っていくことが防げます。
今回の振り返りは以上になります。
Dockerのコンテナについて、より深く理解することができ、コンテナを起動、停止、削除、コンテナ上でのコマンドの実行などができるようになりました。
これまで、Dockerを利用するといっても、インターネット上の記事に記載されていたDockerのコマンドを丸写しして実行していただけだったのですが、今回の講座で、内容を理解して実行できるようになりました。
少しずつですが、手を動かして進歩を感じることができるのは、すごく励みになります。
今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。
今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います!
【過去記事】
2019年8月31日(土)にE資格を受験して、合格しました!
E資格対策として勉強の進め方や、参考書などをまとめました。
これから受験される方がいらっしゃいましたらご参考まで。
2019年3月9日(土)にG検定を受験し、見事合格できました!
受験の体験記や勉強法などを別のブログにまとめました。
これから受験される方がいらっしゃいましたらご参考まで。
【E資格対策に使った参考書】
- 人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書) [ 松尾豊 ]
- 深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト (EXAMPRESS) [ 一般社団法人日本ディープラーニング協会 ]
- 徹底攻略ディープラーニングG検定ジェネラリスト問題集 [ 明松真司 ]
- 実践機械学習システム [ ウィリ・リチャート ]
- アルゴリズムクイックリファレンス 第2版 [ George T. Heineman ]
- 深層学習【電子書籍】[ 岩澤 有祐 ]
- 入門Python 3 [ ビル・ルバノビック ]
- PythonによるWebスクレイピング 第2版 [ Ryan Mitchell ]
- Think Stats第2版 プログラマのための統計入門 [ アレン・B.ダウニー ]
- 集合知プログラミング [ トビー・セガラン ]
- ITエンジニアのための機械学習理論入門 [ 中井悦司 ]