米国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を自動的に探して検索することができる。
REPOSITORY名:<none>
TAG名:<none>
作成されたことがわかる。
これでは少々扱いづらい。。。ということで別の方法でdockerをbuildしたいと思う。
docker build -t <name> <directory>で作成
docker build -t new-ubuntu:latest .
これで作成してみよう。
無事にREPOSITORYおよびTAGが作成された。
自分が作成したdockerfileをrunする
それでは自分が作成したdocker imageをrunしてみよう。
docker run -it new-ubuntu bash
これでnew-ubuntuが起動して中にtestファイルが作成されていることがわかる。
また前々回に作成したmy-first-repoも覗いてみよう。
二つ同じコンテナの比較
あれ?二つ全く同じだということに気づいただろうか。
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コマンドを記載している。
結果は以下のようになる。
通常は/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ができていることが確認できる。
ここに新たに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)が行われていますので、チェックするようにしていただければと思います。