こんにちは!ともわん(@TomoOne4)です。
僕は、IT企業でマーケティングやセールスをやっています。
Dockerについての第5回目投稿です。
今回は、「Dockerのキモとも言える、Dockerfileとは何なのか?」を扱います。
今回のポイント
- Dockerfileってなんなのか?
- Dockerfileを作ってそこからDocker Imageを作ってみる
- Dockerfileに書いた通りにDocker Imageが作られているのかをコンテナから確認してみる
ここで書く内容は、Udemy で受講できる、
かめ れおんさんの米国AI開発者がゼロから教えるDocker講座
で学んだ内容を自分の中で定着するために調べたり考えたりした内容を踏まえて進めていきます。
導入は文章より動画のほうがすっと入ってくる人も多いと思いますので、少し記事を読んでいただき
「Docker面白そうだし、簡単そう」
と思った人はぜひUdemyで米国AI開発者がゼロから教えるDocker講座を受けてみてください。
Dockerやコンテナ、仮想化については第1回、第2回、第3回、第4回がありますのでこちらをみてみてください!
Dockerfileとは? 〜Docker Imageの設計図〜
まずは、今回扱うDockerfileとは何なのかをまとめていきます。
こちらになります。
【Dockerfileとは?】
・Docker Imageの設計図
・Dockerfileを使って、Docker Imageを作成する
・ファイル名は、みんな同じで”Dockerfile”
・Docker Instruction + arguments の形で記述していく(FROM “Docker Image:Tag”から始まる)
ドキュメントの説明も引用しておきます。
Docker は
Dockerfile リファレンスDockerfile
から命令を読み込んで、自動的にイメージをビルドします。Dockerfile
はテキストファイルであり、イメージを作り上げるために実行するコマンドラインコマンドを、すべてこのファイルに含めることができます。docker build
を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。
なんとなく、イメージつきましたか??
Docker Hubで実際に見てみる
実は、Docker Hubに登録されているDocker Imageを見ると、Dockerfileも確認することができます。
前までの記事で扱ってきたUbuntuのイメージで見てみます。
Docker Hubのサイトで、画面上部の検索窓からUbuntuと検索すると表示されるこちらです。
このUbuntuイメージをクリックすると以下のような画面になりますので、その中の
Supported tags and respective Dockerfile links
部分の一番上のリンクをクリックします。
すると、GitHubのページに遷移するのですが、これがこのUbuntuイメージのDockerfileです。ちゃんとファイル名もDockerfileになっていますね。
書き方としては、
FROMやRUN、ADDなどのようなDocker Instructionを使って書いてあげる感じで、これを見れば、一体どうやってDocker Imageが作られたのかが一目瞭然となります。
Dockerfileが何となく分かったところで、一度流れをまとめてみます。
Dockerfileの流れ
Docker Imageを作るために、Dockerfileという設計図を作成し、
それをもとにDocker Imageを作ってもらうdocker buildというコマンドを入力するという流れが一般的です。
一方逆方向からのアプローチもあり、更新したコンテナをdocker commitしてDocker Imageにするという流れです。
これは第3回の「Docker初心者のUbuntuコンテナ docker pushとdocker pull(Mac)」という記事で扱っています。
どちらも使うことがあるということですが、
原則としてはDockerfileからの流れのほうがどんなコンテナが作られたのかがはっきりわかるので良いようです。
Dockerfileを作る
Dockerfile書けたら超かっこいい!!
まず場所を作ります。
適当なところに作業用ディレクトリを作成し、その中にDockerfileというファイルを作成します。
例えば、/Users/{User name}/docker
試しにDockerfileを書いてみます。
ubuntuイメージの最新版を持ってきて、touch testコマンドを実行させるという内容です。
FROM ubuntu:latest
RUN touch test
DockerfileをDocker Imageにしていく
作ったDockerfileをDocker Imageにする場合は、
Dockerfileがあるディレクトリに移動して以下のコマンドを実行します。
$ docker build .
$ docker build .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:latest
---> adafef2e596e
Step 2/2 : RUN touch test-file
---> Running in 3fe596e2947f
Removing intermediate container 3fe596e2947f
---> ae645b281b88
Successfully built ae645b281b88
ae645b281b88というIDのイメージが作られました。
確認してみると、同じIMAGE IDのものが見つかります。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ae645b281b88 45 seconds ago 73.9MB
ただ、<none>になっているのがわかります。これは、dangling(ダングリング;宙ぶらりんな状態)なイメージと呼ばれるものです。
ちなみに、docker imagesコマンドで -fでフィルタがかけられ、danglingだけ抽出してみると、このようになります。
$ docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> ae645b281b88 3 minutes ago 73.9MB
引っかかりましたね。こいつがdangling imageであることがわかります。
ただ、このdangling imageだと名前がないため扱いづらいので、buildする際に -t で名前をつけてあげることにします。
$ docker build -t <Image name:Tag name> <Directory>
$ docker build -t test-ubuntu:latest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:latest
---> adafef2e596e
Step 2/2 : RUN touch test-file
---> Using cache
---> ae645b281b88
Successfully built ae645b281b88
Successfully tagged test-ubuntu:latest
test-ubuntuという名前で、タグもlatestとしました。早速buildしたイメージを確認してみます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test-ubuntu latest ae645b281b88 7 minutes ago 73.9MB
これでしっかりDocker Imageができました!!
Dockerfileでは、touchコマンドでtest-fileを作成しているのでそこも確認してみます。
$ docker run -it test-ubuntu bash
root@1fb83a8457c5:/# ls -l
total 48
lrwxrwxrwx 1 root root 7 Jul 3 01:56 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 11:09 boot
drwxr-xr-x 5 root root 360 Aug 14 23:22 dev
drwxr-xr-x 1 root root 4096 Aug 14 23:22 etc
drwxr-xr-x 2 root root 4096 Apr 15 11:09 home
lrwxrwxrwx 1 root root 7 Jul 3 01:56 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Jul 3 01:56 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Jul 3 01:56 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Jul 3 01:56 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Jul 3 01:57 media
drwxr-xr-x 2 root root 4096 Jul 3 01:57 mnt
drwxr-xr-x 2 root root 4096 Jul 3 01:57 opt
dr-xr-xr-x 160 root root 0 Aug 14 23:22 proc
drwx------ 2 root root 4096 Jul 3 02:00 root
drwxr-xr-x 1 root root 4096 Jul 6 21:56 run
lrwxrwxrwx 1 root root 8 Jul 3 01:56 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Jul 3 01:57 srv
dr-xr-xr-x 12 root root 0 Aug 14 23:22 sys
-rw-r--r-- 1 root root 0 Aug 14 23:11 test-file
drwxrwxrwt 2 root root 4096 Jul 3 02:00 tmp
drwxr-xr-x 1 root root 4096 Jul 3 01:57 usr
drwxr-xr-x 1 root root 4096 Jul 3 02:00 var
ちゃんと、test-fileが作られている(touch test-fileが実行された)ことがわかります。
これを応用していけば自分の作業に必要なDockerfileを作れたり、今Docer Hub上で確認できるイメージのDockerfileを見て理解することができます。
まとめ:Dockerfileがわかってきた
今回は、Dockerfileというものを新しく扱ってみました。
記述はそこまで難しくなさそうですし、これを使ってDocker Imageを作るところまでできたのでかなりいい線になってきているのではないでしょうか?
次は、Dockerfileの細かい部分の書き方などをやっていきます。