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

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

Dockerのホストとコンテナの関係を理解する(米国AI開発者がゼロから教えるDocker講座)

これまでは、コンテナを起動する際にホストからファイルをコピーしたり、設定等をおこなったりしていましたが、コンテナを起動してからもファイルのやり取りをしたり、コンテナが利用するリソースを制御したりする方法を理解しました。

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

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

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

Dockerのホストとコンテナの関係を理解する

1.ホストとコンテナ間でファイルを共有する(-v オプション)

これまで、ホストからコンテナにファイルを渡すときは、Docker image作成時にファイルをコピーしていました、しかしながら、コンテナ起動後、ファイルをやりとりしたくなることもあります。また、コンテナに大きなファイルをおきたくないこともあります。

このようなときには、「-v」オプションを使うことで、ホストのファイルシステムをコンテナにマウントすることができます。

では、早速やってみます。

今回は、ホスト側に「mounted_folder」を作成しマウントされたことの確認用に、この中に「file_at_host」というファイルを作っておきます。

そして、このディレクトリを、コンテナ側に「new_dir」を作成した「new_dir」というディレクトリにマウントさせます。

まずは、以下のDockerfileを作成します。

FROM ubuntu:latest
RUN mkdir new_dir

作成したDockerfileが保存されたディレクトリに移動して、Dockerをbuildします。

docker build .

f:id:kanriyou_h004:20200725154105p:plain

図1.docker buildの実行

作成されたDocker imageから、コンテナを立ち上げます。

立ち上げる時に「-v」オプションを指定します。引数には、ホスト側のマウントするホスト側のディレクトリと、コンテナ側のディレクトリを「:」で区切って記載します。

docker run -it -v ~/tmp/docker/mounted_folder:/new_dir 616979cf0014

f:id:kanriyou_h004:20200725155702p:plain

図2.ホスト側のディレクトリをマウントしてコンテナを立ち上げる

コンテナが起動したら、「new_dir」が作成され、「mounted_folder」にマウントされている(「file_at_host」が中にある)ことを確認します。

cd /new_dir

ls

f:id:kanriyou_h004:20200725155840p:plain

図3.「mounted_folder」内のファイルが表示されることを確認する

無事、「new_dir」に「mounted_folder」がマウントされ、ホスト側の「mounted_folder」内に作成した「file_at_host」が表示されることが確認できました。

2.ホストとコンテナ間でアクセス権限を共有する(-u オプション)

 先ほどの「-v」オプションを使ってマウントした場合は、コンテナからホストにアクセスするときに、ルート権限を持ってアクセスできてしまいます。

このため、「-u」オプションを指定することで、適切なアクセス権でマウントさせることができます。

まず、以下のDockerfileを作成します。

FROM ubuntu:latest
RUN mkdir created_in_Dockerfile

作成したDockerfileが保存されたディレクトリに移動して、Dockerをbuildします。

docker build .

f:id:kanriyou_h004:20200725163145p:plain

図5.docker buildを実行する

次にコンテナを立ち上げる際にアクセス権を指定してみます。

「-u」オプションでは、引数にユーザーID,グループIDを「:」で区切って記載します。

この時、各IDの数字を入力するのではなく、コマンドの実行結果を渡すために$(コマンド)の記載を使って、実行結果を直接、引数として渡します。

docker run -it -u $(id -u):$(id -g) -v ~/docker/mounted_folder:/created_in_run 0f9142f9b4ad bash

f:id:kanriyou_h004:20200725164433p:plain

図6.アクセス権を指定してマウントする

マウントされたディレクトリのアクセス権を確認します。

ls -la

f:id:kanriyou_h004:20200725170307p:plain

図7.アクセス権を確認する

Dockerfileで作成した「created_in_Dockerfile」ディレクトリは、ユーザもグループも「root」権限になっています。

コンテナ起動時にアクセス権限を指定した「created_in_run」ディレクトリは、ユーザは「1000」、グループは「staff」となっていることが確認できました。

3.ホストのポートをコンテナのポートにつなげる(-p オプション)

 コンテナ上にWebサービスを立ち上げた際に、IPアドレスはホストのアドレスと同じとなるため、コンテナ上のサービスにアクセスするために、「-p」オプションを指定することで、ホストのポートとコンテナのポートにつなげることができ舞う。

今回は、jupyter notebookのDocker imageをpull(run)して、ポート番号8888同士をつなげます。

docker run -it -p 8888:8888 --rm jupyter/datascience-notebook bash

f:id:kanriyou_h004:20200725175113p:plain

<中略>

f:id:kanriyou_h004:20200725181432p:plain

図8.つなげるポートを指定してコンテナを起動

コンテナが起動できたら、jupyter notebook を立ち上げます。

jupyter notebook

f:id:kanriyou_h004:20200725181730p:plain

図9.jupyter notebookを立ち上げる

コンテナ上でjupyter notebookが立ち上がったら、ホストのブラウザから「http://localhost:8888/」にアクセスします。

f:id:kanriyou_h004:20200725182728p:plain

図10.コンテナ上のjupyter notebookにホストからアクセスする

無事、ホストからコンテナ上のjupyter notebookにアクセスすることができました。

4.コンテナの利用できるリソースを制限する(--cpus,--memory オプション)

 コンテナがホストのリソースを使い切ってしまわないように、それぞれのコンテナに利用できるリソースを制限できます。

CPUについては「--cpus」オプションで引数に利用するコア数を指定します。メモリについては「--memory」オプションで、メモリのバイト数を指定します。

例えば、以下は、CPUを1コア、メモリを2GBに制限したコンテナを立ち上げます。

docker run -it --rm --cpus 1 --memory 2g ubuntu bash

f:id:kanriyou_h004:20200725183848p:plain

図11.リソースを制限してコンテナを立ち上げる

ホストのターミナルから、コンテナのCPU、メモリの利用状況を確認します。

まずは、CPUを確認します。docker inspect コマンドで、コンテナの情報を得ることができます。ただ、情報がたくさん出すぎてしまうので、grepコマンドで、cpuという文字列を含む行だけ出力します。

docker inspect b80dcb84513d | grep -i cpu

f:id:kanriyou_h004:20200725184447p:plain

図12.コンテナで利用できるCPUの利用量を確認する

少し読みづらいのですが「NanoCpus」を確認すると1000000000NanoCPUであることが確認できます。これは、単位がNanoなので、1CPUということになります。

 

同様にメモリについても確認します。

docker inspect b80dcb84513d | grep -i memory

f:id:kanriyou_h004:20200725185047p:plain

図13.コンテナで利用できるメモリの利用量を確認する

またもや、少し読みづらいのですが「Memory」を確認すると2147483648バイトであることが確認できます。これは、1024バイトで1Kバイト、1024Kバイトで1Mバイト、1024Mバイトで1Gバイトなので、計算すると2Gバイトになります。

これで、無事、リソースを制限することができました。

 

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

今回、Dockerのホストとコンテナの関係を理解し、ディレクトリのマウントや、アクセス権限の管理、ポートの接続、リソースの制限ができるようになりました。

これで、Docker講座の基礎編が終わり、一通りDockerが使えるようになりました。

 

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

次回からは、応用編に進み、Dockerを使いこなせるようになりたいと思います! 

px.a8.net

 

 【過去記事】

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

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

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

oregin-ai.hatenablog.com 

 

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

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

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

g-kentei.hatenablog.com

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

 

f:id:kanriyou_h004:20200725150502p:plain