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

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

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ(米国AI開発者がゼロから教えるDocker講座)

今回は、前回学んだDockerfileのINSTRUCTION(命令)についてさらに理解を深めました。INSTRUCTIONは、FROM、RUN、CMDの三つになります。

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

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

www.udemy.com

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

DockerfileのINSTRUCTION(FROM,RUN,CMD)を学ぶ

1.FROMについて理解を深める

Dockerfileにおいて、FROMは、Docker imageを作成する際に、もとにするDocker imageを何にするかを指定するINSTRUCTION(命令)になります。Dockerfileの一番最初に、指定する必要があります。

ここで指定したDocker imageをもとに環境が構築されるので、OSのDocker imageか、OSを含むDocker imageを指定することになります。

たとえば、Docker fileに以下を記述することで、ubuntuの最新版のDocker imageからDocker imageを作成できます。

FROM ubuntu:latest

2.RUNについて理解を深める

 RUNは、コマンドを実行するINSTRUCTION(命令)になります。

コマンドを実行することで、Docker imageに、任意の変更を加えていくことができます。また、RUNを1行追加するごとに、Docker imageのLayer(層)が追加されていくことになります。

たとえば、以下を記述することで、testというファイルを作成し、ファイルの中に'hello world'という文字列を書き込みます。

RUN touch test

RUN echo 'hello world' > test

先ほどの、FROMと合わせて、以下のDockerfileを作成します。

FROM ubuntu:latest

RUN touch test

RUN echo 'hello world' > test

作成したDockerfileのディレクトリに移動して、以下のコマンドを実行します。

docker build .

f:id:kanriyou_h004:20200712165702p:plain

図1.docker buildの実行

作成されたDokcer image(bda713f6179f)からコンテナを起動して中身を確認します。

まずは、コンテナを起動します。

docker run -it bda713f6179f

f:id:kanriyou_h004:20200712170435p:plain

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

起動したコンテナでに、「test」ファイルが作成され、「hello world」が書き込まれていることを確認します。

cat test

f:id:kanriyou_h004:20200712170721p:plain

図3.testファイルの中身の確認

無事、「hello world」と書き込まれた「test」ファイルが作成されていることが確認できました。

3.Docker imageのサイズを小さくする工夫

先ほど、Docker fileにRUNを2行記載しましたが、RUNが実行されるたびに、Layerが追加されていくため、RUNを記述し続けるとDocker imageのサイズがどんどん大きくなってしまいます。

Dokcer imageをなるべく小さくするためには、Layer数を小さくするための工夫が必要になります。この工夫のために「&&」を使います。

たとえば、先ほどのDockerfileは、以下の通りRUNで実行する2つのコマンドを「&&」でつなげて記述することで、Layerをひとつ少なくすることができます。

FROM ubuntu:latest

RUN touch test && echo 'hello world' > test

4.Docker image上にパッケージをインストールする

 Dokcer image上にパッケージをインストールするためには、apt-getコマンドを使います。updateオプションで、パッケージのリストを更新し、installオプションでインストールするパッケージを指定します。例えば、「curl」、「nginx」をインストールする場合は以下の通りのDockerfileを作成します。

また、「-y」オプションを指定することで、インストールの際に、入力を求められた際に、すべて[y]で入力することができます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712201418p:plain

<中略>

f:id:kanriyou_h004:20200712201235p:plain

図4.docker buildを実行する

なお、今回は最初の実行だったので、インストールに時間がかかりましたが、一度、Docker image のLayerが作成されている場合は、cacheが使われるため、以下のように時間が短縮できます。

docker build .

f:id:kanriyou_h004:20200712202352p:plain

図5.2回目のbuildはcacheが利用される

5.CMDについて理解を深める

 CMDは、コンテナが実行するデフォルトのコマンドを指定するINSTRUCTION(命令)になります。原則、Dockerfileの最後に一つだけ記載します。

記載方法は、CMD["実行するコマンド","引数1","引数2"]となります。

では、先ほどのDockerfileに、デフォルトのコマンドに「ls」コマンドを指定してみます。

FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx

CMD ["ls"]

上記のDockerfileからDokcer imageをbuildします。

docker build .

f:id:kanriyou_h004:20200712204102p:plain

図6.CMDでデフォルトのコマンドを指定したDockerfileでbuildする

この状態で、Docker imageから、コンテナを立ち上げます。

docker run b5597893e556

f:id:kanriyou_h004:20200712204744p:plain

図7.コンテナ起動時にLSが実行される

コンテナ起動時にlsが実行されて、ホームディレクトリのファイルが表示されることが確認できました。

なお、RUNとCMDは、どちらもコマンドを実行するINSTRUCTION(命令)になります。この2つのINSTRUCTIONの大きな違いは、RUNは実行後のDokcer imageのLayerが作成されますが、CMDはLayerが作成されないという点になります。

 

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

前回、基本を理解したDockerfileの記載し方について、掘り下げて理解することができました。

FROM、RUN、CMDを利用して、基にするDokcer imageに、パッケージをインストールして、コンテナを起動時にデフォルトで実行するコマンドを指定することができました。また、Dokcer imageのサイズをなるべく小さくするために、Layer数を少なくする記述方法についても学びました。

Dokcerを知れば知るほど、早く環境構築をしたくなってきました。自分の環境構築にも活用していきたいと思います。

 

今回受講している「米国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:20200712210639p:plain