LINEで現役エンジニアに直接質問してみよう!登録無料

Dockerfileの書き方と使い方!buildからコンテナ作成まで解説!

この記事では、「Dockerfile」というDocker環境イメージの設定ファイルの書き方について解説します。

「Dockerfile」を使うと、どんなLinuxをどういう手順でコマンドを実行して環境構築したかをすべて残せ、Git管理もできるためよく使われます。

  • Dockerfileの書き方が分からない!😇
  • Dockerfileを使う時のポイントが知りたい!🤔
  • Dockerfile使うの怖い 👻

こののような疑問を持っている初心者向けの内容です。

合わせて読みたい

DockerイメージとDockerコンテナの違いが分からない人は、こちらで解説しているのでみてください 🙌

Dockerfileの作成

まずは、Dockerfileの作成をイメージしやすくするために、「Dockerfile基本の4コマンド」を紹介します。

# 基本イメージを選択
FROM ubuntu
# Dockerfileをメンテナンスする人
LABEL maintainer="Admin <[email protected]>"
# Dockerをビルドする時に実行
RUN echo "Now Building..."
# Dockerコンテナを起動する時に実行
CMD echo "Now Running..."

上記のコードが、Dockerfileでよく使われる基本4コマンドです。

  • FROM … Dockerコンテナで使うベースとなる仮想環境(OS)の種類を設定します
  • LABEL … Dockerイメージの関連情報を設定します(誰が作ったのか書くのがマナーです)。
  • RUN … Dockerイメージをビルドする時に実行するコマンドです。環境構築時に使います。
  • CMD… Dockerコンテナでアプリを起動する時に実行するコマンドです。

Dockerfileからイメージ作成

次に、上記で作ったDockerfileをビルドしてDockerイメージを作成してみましょう。DockerfileからDockerイメージを作成するには、docker buildを使います。

まず、上記のソースコードをDockerfileという名前で保存します。

$ tree
.
└── Dockerfile

0 directories,
1 file

そして、Dockerfileカレントディレクトリにあるのを確認し、docker buildを実行します。

$ docker build -t sample: 1 .

これで、下記のようなログが表示されたらDockerfileからのイメージビルドが完了しています。

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu
Status: Downloaded newer image for ubuntu:latest
 ---> 72300a873c2c
Step 2/4 : LABEL maintainer="Admin &lt;[email protected]>"
 ---> Running in 48e9312f1080
Removing intermediate container 48e9312f1080
 ---> 8eddab145b32
Step 3/4 : RUN echo "Now Building..."
 ---> Running in 3985a03c216d
Now Building...
Removing intermediate container 3985a03c216d
 ---> 925405da182d
Step 4/4 : CMD echo "Now Running..."
 ---> Running in 489ce50f0c76
Removing intermediate container 489ce50f0c76
 ---> 48fa0d53da6a
Successfully built 48fa0d53da6a
Successfully tagged sample: 1

実際に、docker imagesでDockerイメージのリストを確認すると、下記のようにsampleが作成されています。

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
sample                                1                   48fa0d53da6a        8 hours ago         64.2MB

Dockerイメージからコンテナを起動

作成したDockerイメージからDockerコンテナを起動してみましょう!

イメージからコンテナを起動するにはdocker runを使います。

$ docker run -it --rm --name sample sample: 1
Now Running...

起動すると、Now Running...と起動したことが表示され、すぐに処理が終わったので終了します。

docker run起動時に色々オプションを付けているので、1つ1つ解説していきます。

  • -it… ホスト側とDocker側の標準入出力をつなぎます。起動した時のログがリアルタイムで表示されます。
  • --rm… Dockerコンテナの処理が終了した時、自動的にコンテナを削除します。
  • --name… コンテナに名前を付けます。Dockerコンテナの名前は重複してはいけません。

Dockerfileの命令コマンド

Dockerfileに書く命令コマンドは色々ありますが、その中でもよく使われる主要コマンド7つを紹介します。

ここで紹介するのは本当に基本的なものだけで、他にも色々なコマンドがあるので、必要になったタイミングで調べてみてくださいね!

FROM

Dockerイメージを作成するベースイメージを指定します。ubuntuなどのOS名だけではなく、ubuntu: 18.04とかubuntu:bionicとかを指定すると、そのバージョンのOSが使うるようになります。

どのようなベースイメージが使えるかは「Docker Hub」で検索できます。

RUN

ベースイメージにどのような変更を加え、カスタムするのかを設定します。

ベースイメージを元に、環境を「yum」「apt」などのコマンドを使ってカスタマイズする時に使用します。

CMD

Dockerfileで作成したイメージからコンテナを起動する時、実行されるコマンドを記述します。

複数設定することはできず、一番後ろに書いたCMDしか実行されません。

COPY

ホスト側にあるファイルやディレクトリをDockerイメージにコピーする時に使用します。

NginxやApatchの設定ファイルを設置する時などに使います。

ADD

ホスト側にあるファイルやディレクトリをDockerイメージにコピーする時に使用しますCOPYとの違いは、コンテナに追加したファイルは展開(解凍)されて設定されます

ホスト側にある圧縮ファイルを「コピー&展開」の両方を行いたい場合に使います。

ENV

Docker内部で使われる環境変数を設定します。

アプリケーションのルートディレクトリや、ファイルパスなどシステム全体に設定したほうがいい値に使います。

WORKDIR

カレントディレクトリのパスが変更されます。そのため、COPYADDで相対パスを使った場合は、WORKDIRが基準になります。

また、Dockerコンテナに/bin/bashなどでログインした場合のカレントディレクトリもここが設定されます。

DockerfileでWebサーバーを作る

先程は簡単な「メッセージを表示するだけ」のコンテナでしたが、今回はDockerfileからWebサーバーのDockerイメージを作って起動させてみたいと思います。

まずはじめに、Dockerfileの全体を紹介します。

Docker用のビルド用ソースコードファイルを用意する

適当な名前のディレクトリを作成し、下記のDockerfileを作成します。

# 基本イメージを選択
FROM ubuntu

# Dockerfileをメンテナンスする人
LABEL maintainer="Admin <[email protected]>"

# Dockerをビルドする時に実行
RUN apt update
RUN apt install -y nginx

# Dockerコンテナを起動する時に実行
CMD [
    "nginx",
    "-g",
    "daemon off;"
]

Dockerイメージをビルドする

dockerイメージを作成するため、下記コマンドを実行します。

$ docker build -t nginx-sample: 1 .

一部省略していますが、下記のようなログが出ていればOKです(全く同じにはなりません)。

Sending build context to Docker daemon  3.584kB
Step 1/6 : FROM ubuntu
 ---> 72300a873c2c
Step 2/6 : LABEL maintainer="Admin <[email protected]>"
 ---> Running in f3b60978a056
Removing intermediate container f3b60978a056
 ---> b304a61ffbd7
Step 3/6 : RUN apt update
 ---> Running in f319e6c69bcd
...
Removing intermediate container f319e6c69bcd
 ---> 0d8ea3ba0bbf
Step 4/6 : RUN apt install -y nginx
 ---> Running in 9a3b193417e3
 ...
Step 5/6 : COPY ./src /usr/share/nginx/html
 ---> 589e15ea5fcf
Step 6/6 : CMD [
    "nginx",
    "-g",
    "daemon off;"
]
 ---> Running in 040df4e22d3f
Removing intermediate container 040df4e22d3f
 ---> c8450ac0754f
Successfully built c8450ac0754f
Successfully tagged nginx-sample: 1

これでビルドは完了です。正常に終了すると、docker imagesで作成したイメージ一覧にnginx-sampleが表示されます。

$ docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
nginx-sample                          1                   c8450ac0754f        2 minutes ago       152MB
sample                                1                   48fa0d53da6a        9 hours ago         64.2MB

作成したWebサーバーを起動しよう

先程ビルドしたnginx-sampleを起動して見ましょう

$ docker run -d -p 8080: 80 --name nginx-sample nginx-sample: 1

これで、Nginxサーバー機能を持ったDockerコンテナが起動します。試しに「http: //localhost:8080/」を見てみてください。「Welcome to nginx!」が表示されているはずです。

Webサーバーの後片付けをしよう

このままではずっとWebサーバーが起動しっぱなしになるので、Dockerコンテナを終了&削除して後片付けをしましょう。

$ docker stop nginx-sample
$ docker rm nginx-sample

これで、「http: //localhost:8080/」にアクセスできなくなりました。

まとめ

最後に内容をまとめます。

  • Dockerfileで基本的なコマンドは4つ
    – FROM: 基本イメージを選択
    – LABEL: Dockerfileをメンテナンスする人
    – RUN: Dockerをビルドする時に実行
    – CMD: Dockerコンテナを起動する時に実行
  • その他にも沢山のコマンドがあるので、適宜調べる
  • Dockerfileを使えばWebサーバーが立てられる

Dockerに命令コマンドを記述して開発していくやり方は、主流になっておりエンジニアであれば絶対に押さえておきたい内容です。

ぜひ覚えて、Dockerfileを一通り読めるようになりましょう!

この記事を書いた人

自身がプログラミングを独学で勉強し始めて躓いた経験を元に、これから勉強をする人に向けに「イラスト多めでわかりやすい記事」にこだわって情報を発信しています。

現在はフルスタックエンジニアとしてサービス開発などのお仕事をしています。