俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

Dockerのコンテナについて理解を深める(米国AI開発者がゼロから教えるDocker講座)

今回は、Dockerのコンテナについて、理解を深めました。

Dockerのコンテナの起動の仕組みを確認し、起動に合わせてコマンドを実行したり、コンテナを停止したり削除したりできるようになりました。

今回もかめ@usdatascientistさんの「米国AI開発者がゼロから教えるDocker講座」をUdemyで受講しながら進めています。

とても分かりやすく解説いただけますし、ハンズオン形式で講座が進むので、まさに「手で覚える」ことができるので、おすすめです!

www.udemy.com

では、振り返っていきたいと思います。

Dockerのコンテナについて理解を深める

1.docker runコマンドについて知る

まずは、docker runを詳しく学びました。

docker runは大きく分けて、create(作成する)とstart(起動する)の2ステップの処理が行われます。

この2ステップの処理を別々に実行します。

docker create hello-world

f:id:kanriyou_h004:20200705132014p:plain

図1.docker create実行

createされた状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705132603p:plain

図2.createされた状態を確認する

hello-worldのコンテナが作成され「STATUS」が「Created」になっていることが確認できました。

次に、docker startで、コンテナを起動します。

docker start e03e9b972652 

f:id:kanriyou_h004:20200705133017p:plain

図3.コンテナを起動する

コンテナIDだけが返ってきます。

再度、状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705133142p:plain

図4.起動したコンテナを確認する

「STATUS」が「Exited」になっています。

hellow-worldコンテナは、起動後すぐに処理を実行した後Exitしてしまうので、なにも出力されず、「Exited」状態になってしまいます。

出力する結果を知りたい場合は、以下を使います。

docker start -a e03e9b972652

f:id:kanriyou_h004:20200705133754p:plain

図5.[-a]オプションを付けてコンテナを起動する

出力結果が確認できました。

2.コンテナ起動時にデフォルトコマンド以外を実行する

hello-worldでは、コンテナ起動時に自動的に(デフォルトコマンドで)「Hello from Docker!」という文字列を出力してExitすることを確認しました。

今度は、ubuntuのコンテナ起動時に、デフォルトコマンド以外のコマンドを実行してみます。

まず、ubuntuのコンテナをデフォルトコマンドで起動した場合にどうなるか確認します。

docker run ubuntu

f:id:kanriyou_h004:20200705134809p:plain

図6.ubuntuコンテナを起動する

何も出力されず終了します。

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705135000p:plain

図7.ubuntuコンテナの状態を確認する

「STATUS」が「Exited」になっており、hello-world同様に、コンテナが作成され、起動され、デフォルトコマンド実行後、Exitしています。

次に、デフォルトのコマンドではなく、「ls」を実行してみます。

docker runコマンドの2つ目の引数に実行したいコマンド、今回の場合は「ls」を指定します。

docker run ubuntu ls

f:id:kanriyou_h004:20200705135716p:plain

図8.コンテナ起動時に実行するコマンドを指定する

コンテナが起動後、「ls」コマンドを実行して、出力できました。

ただ、デフォルトコマンド同様、実行後は、コンテナからExitします。

3.コンテナ起動後にExitせずに入力可能な状態にする

先ほどは、デフォルトコマンドを実行後、Exitしてしまいましたが、コンテナ上でもろもろ処理できるように入力可能な状態にします。

[-i]オプションを付けることで、入力可能な状況になります。

また、[-t]オプションも追加した[-it]とすることで、図8.のような出力ではなく、見やすい出力になります。

docker run -it ubuntu bash

f:id:kanriyou_h004:20200705140915p:plain

図9.[-it]オプションを付けてコンテナを起動

これで、コンテナを起動後、bashを実行し、入力可能な状態となり、表示もきれいになりました。

4.コンテナを削除・停止・全削除する

まず、コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705141552p:plain

図10.コンテナの状態を確認

「STATUS」が「Exited」になっている2つ目のコンテナを削除します。

削除するには、docker rmコマンドを使って、引数にコンテナIDを指定します。

docker rm 73abf556080e

f:id:kanriyou_h004:20200705141841p:plain

図11.コンテナを削除する

再度コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705142125p:plain

図12.コンテナが削除されたことを確認する

2つ目のコンテナ「73abf556080e」が削除されました。

同様に、1つ目のコンテナも削除したいところですが、このコンテナは、「STATUS」が「Up」の状態なので、削除することができません。

このため、まずは、このコンテナを停止させます。

停止するには、docker stopコマンドを使って、引数にコンテナIDを指定します。

docker stop afba2b1baf15

f:id:kanriyou_h004:20200705142531p:plain

図13.コンテナを停止する

再度コンテナの状態を確認します。

f:id:kanriyou_h004:20200705142635p:plain

図14.コンテナが停止されたことの確認

1つ目のコンテナも「STATUS」が「Exited」になっていることが確認できました。

これで、先ほどと同様にdocker rmコマンドでコンテナが削除できます。

最後に、停止されているコンテナを全て削除します。

コンテナを全て削除するにはdocker system pruneコマンドを実行します。

docker system prune

f:id:kanriyou_h004:20200705143200p:plain

図15.コンテナ全削除の実行

コマンドを実行すると、本当に削除してよいか確認されるので、削除して良ければ「y」を入力すると削除が実行されます。

コンテナの状況を確認します。

docker ps -a

f:id:kanriyou_h004:20200705143427p:plain

図16.全コンテナが削除されたことの確認

全てのコンテナが削除されたことが確認できました。

5.コンテナのファイルシステムの独立性の確認

コンテナのファイルシステムと、ホストのファイルシステムや別のコンテナのファイルシステムとは独立していて、何もしなければ、相互にファイルのやり取りはできません。

2つのコンテナを作って確認していきます。

まずは、コンテナを1つ作成して、そのファイルシステムの中に、「test1」というファイルを作成します。

docker run -it ubuntu bash

f:id:kanriyou_h004:20200705144233p:plain

図17.1つめのコンテナの起動

touch test1

ls

f:id:kanriyou_h004:20200705144502p:plain

図18.touchコマンドで「test1」ファイルを作成

次に同様に、もう1つコンテナを起動して、「test2」ファイルを作成します。

docker run -it ubuntu bash

touch test2

f:id:kanriyou_h004:20200705145015p:plain

図19.もう1つコンテナを起動して「test2」ファイルを作成する

コンテナが2つ起動していることを確認します。

f:id:kanriyou_h004:20200705145249p:plain

図20.コンテナが2つ起動していることを確認

次に、それぞれのコンテナのルートディレクトリのファイルを確認します。

f:id:kanriyou_h004:20200705145548p:plain

図21.1つ目のコンテナのファイル

f:id:kanriyou_h004:20200705145647p:plain

図22.2つ目のコンテナのファイル

1つ目のコンテナは「test1」のみ、2つ目のコンテナは「test2」のみが作成されていて、ファイルシステムが別々であることが確認できました。

6.コンテナに名前を付ける

これまで、コンテナを起動するときに、特にコンテナの名称は指定しませんでしたが、コンテナの名称を指定しない場合は、ランダムな名前が付けられます。

ずっと起動させ続けたり、共有サーバとして使うときや、他のプログラムで使用するときのように、決まった名前が必要となる場合には、名前を指定してコンテナを起動することができます。

docker run コマンドで、[--name]オプションを指定して、引数の1つ目にコンテナの名前、2つ目にDocker imageを指定します。

docker run --name sample_container ubuntu

f:id:kanriyou_h004:20200705150830p:plain

図23.コンテナに名前を付けて起動

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705150956p:plain

図24.コンテナの名前を確認

「NAMES」に先ほど指定した「sample_container」が付けられていることが確認できました。

すでに作成されているコンテナに同じ名前があった場合はエラーとなるので、注意が必要です。

7.detachedモードとforegroundモード

ずっと起動させたままにしたい場合などに、バックグラウンドでコンテナを起動させておきたい場合などは、detached モードを利用します。

また、逆に一回一回、コンテナを終了させる毎に、コンテナを削除する場合は、foregroundモードを利用します。

では、まずdetachedモードでコンテナを起動します。

detachedモードでコンテナを起動するには、[-d]オプションを使います。

docker run -it -d ubuntu bash

f:id:kanriyou_h004:20200705152316p:plain

図25.detachedモードでコンテナを起動

detachedモードで起動すると、[-it]オプションを指定しても、何も表示されずにホストのプロンプト戻ってきます。

コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705152842p:plain

図26.detachedモードのコンテナの状態を確認

コンテナの状態を確認すると「STATUS」が「Up」になっていて、バックグラウンドで実行状態で、Exitしていないことが分かります。

 

次にforegroundモードでコンテナを起動します。

foregroundモードでコンテナを起動するには、[--rm]オプションを使います。

docker run --rm hello-world

f:id:kanriyou_h004:20200705153400p:plain

図27.foregroundモードでhello-worldコンテナを起動する

foregroundモードでhello-worldコンテナを起動すると、これまで通り、「Hello from Docker!」が出力されて、ホストのコマンドに戻ってきました。

では、コンテナの状態を確認します。

docker ps -a

f:id:kanriyou_h004:20200705153650p:plain

図28.コンテナの状態を確認

これまでは、hello-worldを起動した後は、Exitしたコンテナが残っていましたが、コンテナが残っていません。

これは、[--rm]オプションをつけることで、コンテナ起動後、Exitして、そのあとコンテナの削除も実行してくれるからです。

一度きり起動のコンテナは、こうすることで、残骸が残っていくことが防げます。

 

今回の振り返りは以上になります。

Dockerのコンテナについて、より深く理解することができ、コンテナを起動、停止、削除、コンテナ上でのコマンドの実行などができるようになりました。

これまで、Dockerを利用するといっても、インターネット上の記事に記載されていたDockerのコマンドを丸写しして実行していただけだったのですが、今回の講座で、内容を理解して実行できるようになりました。

少しずつですが、手を動かして進歩を感じることができるのは、すごく励みになります。

 

今回受講している「米国AI開発者がゼロから教えるDocker講座」では、もっと詳しくわかりやすくご説明いただけているので、ほんとうに良い勉強になります。

今後も、継続して受講して、もっと、Dockerを使いこなせるようになりたいと思います! 

www.udemy.com

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

f:id:kanriyou_h004:20200705161439p:plain