Docker初心者のDockerfile作成(Mac)

スポンサーリンク
Docker
この記事は約11分で読めます。

こんにちは!ともわん(@TomoOne4)です。

僕は、IT企業でマーケティングやセールスをやっています。

Dockerについての第5回目投稿です。

今回は、「Dockerのキモとも言える、Dockerfileとは何なのか?」を扱います。

今回のポイント

  1. Dockerfileってなんなのか?
  2. Dockerfileを作ってそこからDocker Imageを作ってみる
  3. 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 はテキストファイルであり、イメージを作り上げるために実行するコマンドラインコマンドを、すべてこのファイルに含めることができます。 docker build を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。

Dockerfile リファレンス

なんとなく、イメージつきましたか??

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を作る

TomoOne
TomoOne

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(ダングリング;宙ぶらりんな状態)なイメージと呼ばれるものです。

images — Docker-docs-ja 17.06 ドキュメント

ちなみに、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の細かい部分の書き方などをやっていきます。

教材と参考資料

米国AI開発者がゼロから教えるDocker講座
AI開発のプロが徹底的に現場目線でわかりやすく教えます.Dockerを使って超本格的なデータサイエンスやWeb開発の環境が作れるようになります.
タイトルとURLをコピーしました