【Docker】Dockerfileの概要と作り方の簡単な説明　no.6

![パンプキン カフェ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/90eb962f-56ca-70ec-51a6-b469ac6c0192.png)


こんにちは、まゆみです。

Dockerに関する記事をシリーズで書いています。

今回の記事では、


<ul>

<li>Dockerfileの概要</li>
<li>Dockerfileの作り方</li>

</ul>


に焦点を置いて書いていこうと思います

Dockerfileについての初めての記事になりますので、表面的な内容のみを扱って書いていきますね。


ではさっそく、はじめて行きます。

#Dockerfile とは？

![Docker hub (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5202f82e-4874-334d-2238-aedfcee2206d.png)


[第一回目の記事](https://qiita.com/Mayumi_Pythonista/items/93a884507355855c09fd)では、他のエンジニアが書いてくれたDockerfileをDocker hub から引っ張ってきて、Docker Imageを作ることを紹介しました。


今回の記事では、他のエンジニアが書いたfile ではなく、<font color="Red">自らDockerfileを書いていきます。</font>

上記のイラストでは、一番左にある黄緑色の『Dockerfile』と書いてあるところですね。

Dockerfileとは、Docker Imageの設計図となるものです。

では、実際にどのようにその設計が書かれているのか、Docker hubにあるDockerfile の中身を見てみましょう


##実際のDockerfile の中身は？

Dockerfileはどれも<font color="Red">同じようなパターンで書かれています</font>ので、まず[Docker hub にあるubuntu](https://hub.docker.com/_/ubuntu)のDockerfileの中身を見て、Dockerfile のパターンに慣れてみましょう


![2021-05-30_12-33-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/dc712310-e472-04d3-10ed-f0418fae4b14.png)

![2021-05-30_12-36-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/20d27052-76b9-eabc-b93e-21a77906508d.png)



![Instruction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/02fd0854-0265-92a4-7757-bc81fb391a27.png)

Dockerfile の書き方のパターンはざっくり上のようになります。

大文字でコードの文頭に書かれているのが、『Instruction』と言われるもので、何をするのかの指示になります。(それぞれのInstructionについては後で、一つづつ詳しく解説します)

その後に続くのが『Argument(引数)』と呼ばれるものです。

では、シンプルなDockerfileを作りながら

>それぞれのInstructionが何をするように指示しているのか？

>それぞれのプロセスでは何が起こっているのか

解説していきます

まずは簡単なDockerfileを作ります

#Dockerfileを作る

![my_first_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/58605a78-c712-2a8c-3aeb-4e328e29eca3.png)




```
mkdir my_first_image
cd my_first_image
code .
```
>①何か好きな名前のディレクトリーを作り(場所はどこで作っても良いです)
②そのディレクトリーのなかに入り
③そこで、エディターを開いてください。

私は、Visual Studio Code の設定を変えてますので

```
code .
```

で、カレントディレクトリ―内でエディターを開けますが、そのような設定をしていない方は、上記のコードをうってもエディターは開きません。

とにかく、<font color="Red">作ったディレクトリー内でエディターを開いて</font>くださいね。

次にそのディレクトリー内に

>Dockerfile

を作ってください。


下のようになります。ファイル名を『Dockerfile』とすると、Dockerのアイコンが表示されますので、そうなればOKです。

![2021-05-31_8-45-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d1065baa-1ce4-b99c-4d6e-9fa24b309ced.png)

そのあと、エディターに次のように書きます。
それぞれのコードが何を意味しているかは、後述するので、今はとりあえず下のように書いてみてください。

![2021-05-31_9-01-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5dccd3c7-586c-daad-1bda-ca3d93a64f09.png)

コマンドラインに戻り、

>今現在、先ほどあなたが作ったディレクトリーにいること

>その中にDockerfileがあることを確認

します。

そしてその後

```
docker build .
```
と打ってください。

docker build の後の<font color="Red">.(ドット)は『現在いるディレクトリ―』</font>を示しています。

今いるディレクトリー内で、イメージをbuild しますよという意味です。


![my_first_image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0b20254c-b316-0b04-d625-640786132fab.png)



なのでDockerfileからDocker Imageをbuild する時には、ちゃんとDockerfileが存在するディレクトリーにいるようにしましょう。

![2021-05-31_9-09-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/08d5357e-5968-ab94-ac96-84d5f0e18503.png)

docker build . を実行すると、Dockerfileの中身が実行されているのが分かると思います(青の文字の赤の下線が引かれているところ)

その後、どんなImagesができたのか『docker images』で調べると、ちゃんと作られているのが分かります。


![2021-05-31_9-19-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/9628b457-1cdd-5700-dff3-ef8f41102b18.png)

ただ、<font color="Red">いま作ったImageにはImage名が作られていません。</font>(REPOSITORYのところがnoneになっています)

もし、名前を付けたいときは

```
docker build -t <name> <directory>
```

としてください。

下のようになります


![2021-05-31_9-25-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c8d17c1d-2fb4-4afa-472e-baaec9a24b0c.png)




#Docker Container を作る

では、Imageが作られたので、次はそのImageからContainerを作ってみます。

```
docker run <imageID>
```

![2021-05-31_9-13-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4720caba-46a9-c37f-97b5-806e7d4e2a8f.png)

すると、Dockerfile を書いた時に

```
CMD ["コマンド"]
```

で書いたコマンドが実行されているのが分かります。

![2021-05-31_10-00-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/eb22188d-421c-798c-c816-9ab85084e867.png)

#DockerfileのInstructionについて

では、今回エディターで作ったDockerfile のInstructionがそれぞれ何を意味するのかを書いていきますね。

今回の記事で紹介する他にもInstructionはありますが、今回の記事では

>FROM

>RUN

>CMD

のみに的を絞って解説していきます

##FROM
<font color="Red">全てのDockerfile は『FROM』から</font>始まります

FROMの後には、ベースとなるイメージを指定します。


今回はubuntuというLinux系のOSを指定しました。


このFROMで引っ張ってきたベースイメージの上で、RUN以降のInstructionで実行されるLinuxのコマンドを実行する事になります

##RUN

RUNはベースイメージに対して、特定のコマンドを実行させます。

update されたパッケージを取ってきてインストールさせたり、Container内にファイルを作って、その中に何かテキスト情報を書いたりできます。(今回の場合、my_first_fileにhello と書き込みました)

今回作ったDockerfileのRUNの結果がどのように反映されているか確かめてみましょう

![2021-05-31_11-08-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/13ac43b1-da71-9913-3d8b-6b1f84b07168.png)


##CMD
CMD はCommandの略です。

Containerを最初に作る時に実行されるコマンドを書きます

```
CMD ["コマンド"]
```
　
と、角括弧にクォーテーションマークで囲んだコマンドを入れます。

前述した、『Docker Containerを作る』という見出しのついたセクションに、実際どのようにコマンドが実行されたかの結果のスクショを貼っていますので、確認しておきたいかたは見てくださいね。

#まとめ

今回の記事はここで締めくくらせていただきます

Dockerfileのざっくりした内容を書かせていただきました。

次回の記事ではもう少し踏み込んだ内容について書いていこうと思います！