見出し画像

米国AI開発者がゼロから教えるDocker講座③(かめさん)〜Dockerfileを用いてDockerimageを作成〜

初めまして、みずぺーといいます。
このnoteを機に初めて私を知った方のために、箇条書きで自己紹介を記述します。

  • 年齢:28歳

  • 出身:長崎

  • 大学:中堅国立大学

  • 専門:河川、河川計画、河道計画、河川環境

  • 転職回数:1回(建設(2年9か月)→IT系年収100万up(現職3か月))

  • IT系の資格:R5.4基本情報技術者試験合格💮

今日は業務でdockerを用いて物体検出環境を構築する業務があるので、そのための予習をしておきます。

あと、この記事だけでは正直理解することは難しいと思います。

そのため、詳しく知りたい方や図解で理解を行いたい方は是非かめさんの動画を参考にしていただければと思います。

Dockerfileとは

dockerfileとはdocker imageの設計図であり、テキストファイルである。

INSTRUCTION arugumentsで記載を行っていく。

Dockerfileを作成

docker build .でimageを作成

dockerfileからbuildコマンドを使用することで

docker build <directory>

この際にdirectoryはカレントディレクトリからdockerfileを自動的に探して検索することができる。

カレントディレクトリにdockerfileがあることを確認してdocker build .を実行

REPOSITORY名:<none>
TAG名:<none>

作成されたことがわかる。

これでは少々扱いづらい。。。ということで別の方法でdockerをbuildしたいと思う。

docker build -t <name> <directory>で作成

docker build -t new-ubuntu:latest .

これで作成してみよう。

new-ubuntuの名前で作成された

無事にREPOSITORYおよびTAGが作成された。

自分が作成したdockerfileをrunする

それでは自分が作成したdocker imageをrunしてみよう。

docker run -it new-ubuntu bash

これでnew-ubuntuが起動して中にtestファイルが作成されていることがわかる。

lsでしっかりtestファイルが作成されていることがわかる

また前々回に作成したmy-first-repoも覗いてみよう。

docker hubから持ってきたコンテナ

二つ同じコンテナの比較

あれ?二つ全く同じだということに気づいただろうか。

  • new-ubuntu:dockerfileから一から立ち上げたコンテナ

  • my-first-repo:docker hubから引っ張ってきてtestファイルを作成したコンテナ

こうなるとどっちがいいのかという話になる。

new-ubuntuに軍配(dockerfileから作成)

結論から言うと、「new-ubuntu」のdockerfileで一から作成したコンテナ

なぜかというと、「見やすい!」これに尽きる。

変更点が全てdockerfileに記載されているため全体を俯瞰的に見れる。

docker hubは変更点がそれをやった人にしかわからない。

Dockerfileの書き方

FROM

  • FROMはベースとなるイメージを決定

  • DockerfileはFROMから書き始める

 FROMに関しては最小限のものから立ち上げるのが良い

RUN

  • Linuxコマンドを実行

  • RUNを使うことで好きなようにカスタマイズ

  • RUNごとにLayerが作られる

例えば現在作成しているDockerfileに

RUN echo 'hello world' > test

としてコンテナの中に作成したtestファイルに'hello world'を記述してみよう

FROM ubuntu:latest #テストファイルを作成 
RUN touch test
RUN echo 'hello world' > test

このようになり、ここで

docker build -t ubuntu:latest . 

これでカレントディレクトリにあるDockerfileに記載されているコンテナを作成できる。

CMD

  • CMD:コンテナのデフォルトのコマンドを指定

  • CMD["excecutabul","param1","param2"]

  • 原則Dockerfileの最後に記述

それではdockerを起動した時にデフォルトのコマンドを実行してみよう。

今回はDockerfileの中に

FROM ubuntu:latest
#-yをつけることによって全てyesで答えてくれることが可能となる
RUN apt-get update && apt-get install -y \
    curl \
    cvs \
    nginx 
CMD ["ls"]

lsコマンドを記載している。

結果は以下のようになる。

docker run の起動と同時にlsコマンドが実行されている

通常は/bin/bash等が記述されることが多い。

FROM ubuntu:latest
#-yをつけることによって全てyesで答えてくれることが可能となる
RUN apt-get update && apt-get install -y \
    curl \
    cvs \
    nginx 
CMD ["/bin/bash"]

RUN vs CMD

どちらも作成したコンテナ内でコマンドを実行する。
この二つの違いはどこか。

結論、RUNはLayerを作る。CMDは作らない。

なのでlayerとして保存したい場合にはRUNで記述。
コマンドのみとして実行したい場合はCMDで記述。

layer数を最小限にする

ubuntuではapt-get(またはapt)というコマンドでパッケージ管理を行う。

  • apt-get update

  • apt-get install xxx

  • apt-get install xxx

このようにそれ毎にlayerを書いていくとlayerが増えすぎる。

またinstallは複数のコマンドを取ることが可能となる。

そのため一番のパッケージのインストール方法は

  • apt-get updata && apt-get intall xxx yyy zzz

このように一行で書いていく。

長くなりそうであれば、バックスラッシュを用いて複数行に分ける。

Dockerfileを作るときはキャッシュを活用する

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install¥
xxx¥
xyz¥
yyy¥
zzz
RUN apt-get install aaa

このように書くことによって、

コマンドを実行する場所が限られる

なお書き方は

&&で繋げると一行で書くことができるものの、毎回実行する必要がある

このように書くことによって実行を最小限にとどめることができる。

キャッシュ活用例

dockerの作成をまずは行ってみる。

FROM ubuntu:latest
#-yをつけることによって全てyesで答えてくれることが可能となる
RUN apt-get update 
RUN apt-get install -y \
    curl \
    nginx  #RUN  apt-get install -y \
#    cvs

こちらでは上述のcurlとnginxをインストールする。

このようにbuildができていることが確認できる。

curlとnginxの二つがインストールされている

ここに新たにcvsのパッケージを追加してみる。

FROM ubuntu:latest
#-yをつけることによって全てyesで答えてくれることが可能となる
RUN apt-get update 
RUN apt-get install -y \
    curl \
    nginx 
RUN apt-get install -y \
    cvs

先ほどと違い上述のコマンドで下2行の#を取り外している。

先ほどはbuildingが完了するまでに47.4sかかっていた。
しかし今回の場合にはキャッシュを使用するため6.1sで完了している。

キャッシュを使用することにより省力で構築可能

最後に

詳しく知りたい方や図解で理解を行いたい方は是非かめさんの動画を参考にしていただければと思います。

GW期間中やかめさんのTwitterで定期的に割引(30%OFF)が行われていますので、チェックするようにしていただければと思います。


この記事が気に入ったらサポートをしてみませんか?