アクセスありがとうございます!次は「とあるエンジニアのエソラゴト」で検索して頂けると嬉しいです!

【初心者】たった3つのコマンドでDockerfileの使い方を説明できるようになる

はじめに

前回の記事で「Dockerをなぜ使うべきなのか」を解説しました。

関連記事

はじめに 読者 Dockerっていう言葉を最近よく聞くけど、よく分からない 読者 Dockerって何が便利なの? 今回は、そんな疑問に答えます! Dockerをまともに使えないエンジニアはかなり遅れているとい[…]

読者
読んでコンテナ技術やDockerをなぜ使うべきなのかは分かったけど、どうやって使ったら良いか分からない!

前回の記事ではDockerの採用理由についての解説だったため、具体的な使い方の話は省略していました。

そのため、今回は、Dockerの使い方(具体的にはDockerfileの使い方)についてです!

Dockerfileの概要

Dockerの最大の利点は、「環境構築の手軽さ」でした。

以下の図のように、事前に作成したDockerfileを他のエンジニアに渡すことで、同じ環境が作成出来ます。

Dockerfileは「Dockerを起動するために必要なコンテナを作ったり、起動したりするために必要なイメージを記述するためのファイル」です。

Dockerfileがあると、環境構築が滅茶苦茶楽になるわけです!

Dockerfileの作成方法

Dockerfileを理解するために、空のPCを渡された時の手順を考える

次に、Dockerfileの作成方法についてです。

ここを理解出来たら、Dockerを使うことが出来るようになります。

まず、Dockerfileでやることを簡略化してお伝えします。

例えば、「あなたにまだOSもソフトも入っていない自作PCを渡して、ソフトウェアをインストールして、実行して下さい」と言ったら何をしますか?

以下のような手順になると思います。

  1. OSをインストールする
  2. ソフトウェアをインストール
  3. インストールしたソフトウェアを実行

Dockerfileもやっていることはほぼ同じです。

まずはこれを念頭に入れて下さい!

Dockerfileに置き換えたチュートリアル

今回は、以下の例で説明していきます。

  1. OSとして、alpineをインストールする
  2. ソフトウェアとして、Redis・gccをインストールする
  3. Redisを起動する

OSとして、「alpine」というLinuxディストリビューションをインストールします。

Linuxディストリビューションとは、「Linuxを使いやすいように必要なアプリケーション等をパッケージ化して、すぐに使える状態にしたもの」です。

次に、Redisというインメモリデータベースとgccをインストールします。

そして最後に、Redisサーバーを起動するというチュートリアルという内容になっています。

では、Dockerfileに書く内容を整理すると、以下の図のようになります。

左側が「現実世界であなたが手動で行う場合の作業内容」で、右側が「Dockerfileで同じことをしようとした際に書く内容」となります。
ここで重要なのは、「FROM」、「RUN」、「CMD」です。

FROM

FROMは、以降の命令で使用する「イメージ」を指定します。

FROM <イメージ>

イメージはDockerHubというたくさんのDockerイメージが保存されているリポジトリから探して使用するのが、一番楽だと思います。

FROMはDockerfileの先頭行に書く必要があることに注意して下さい。

RUN

RUNは、先程取得した「イメージの中で実行する」コマンドを記述します。

「イメージの中で実行する」というのがポイントです。

例えば、FROMで取得したイメージの中で、足りないものをインストールしたりする際に使います。

#(シェル形式、コマンドを実行する。Linux 上のデフォルトは /bin/sh -c であり、Windows 上 cmd /S /C )
RUN <コマンド> 

#(exec 形式)
RUN ["実行バイナリ", "パラメータ1", "パラメータ2"]

CMD

CMDは、コンテナ実行時に実施したい内容を書きます。

CMD ["実行バイナリ", "パラメータ1", "パラメータ2"]
例えば、RUNでインストールしたプログラムを、コンテナ実行時に起動したい場合に、使ったりします。

注意点としては、「CMDはDockerfile内で一回しか書けません。」

仮に複数のCMDを書いてしまった場合は、最終行のCMDが有効になります。

CMD ["hoge1"]
CMD ["hoge2"]
CMD ["hoge3"] # この行が有効

Dockerfileを作成する

Dockerfileの用意

では、実際にDockerfileを作成してみましょう。

まずローカル環境のお好きな場所に「Dockerfile」というファイルを作って下さい。

ちなみに拡張子はいりません。

VSCodeで作成した例を載せると、こんな感じ。

create_dockerfile

Dockerfileを作ったら、以下のコードを書いて下さい。

# 既存のDockerイメージをベースとして使用する
FROM alpine

# 依存関係をダウンロードしてインストールする
RUN apk add --update redis
RUN apk add --update gcc

# コンテナとして起動したときに、何をすべきかをイメージに伝えます
CMD [ "redis-server" ]

Dockerfileからイメージをビルドする

書けたら、ターミナルに以下のコマンドを打ち込み、Enterボタンを押します。

$ docker build -t sample .
このコマンドは、先程作成したDockerfileを元にイメージをビルドするコマンドです。

オプションとして、「-t」を付けることでイメージに名前を付けています。

コマンドの最後にある「.」はDockerfileの配置場所を指定しています。

すると、以下のようになります。

$ docker build -t sample .

Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM alpine
 ---> e7d92cdc71fe
Step 2/4 : RUN apk add --update redis
 ---> Running in 347a43c89788
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz
(1/1) Installing redis (5.0.7-r0)
Executing redis-5.0.7-r0.pre-install
Executing redis-5.0.7-r0.post-install
Executing busybox-1.31.1-r9.trigger
OK: 7 MiB in 15 packages
Removing intermediate container 347a43c89788
 ---> 810ed3e51b85
Step 3/4 : RUN apk add --update gcc
 ---> Running in eaa447d30f31
(1/10) Installing libgcc (9.2.0-r3)
(2/10) Installing libstdc++ (9.2.0-r3)
(3/10) Installing binutils (2.33.1-r0)
(4/10) Installing gmp (6.1.2-r1)
(5/10) Installing isl (0.18-r0)
(6/10) Installing libgomp (9.2.0-r3)
(7/10) Installing libatomic (9.2.0-r3)
(8/10) Installing mpfr4 (4.0.2-r1)
(9/10) Installing mpc1 (1.1.0-r1)
(10/10) Installing gcc (9.2.0-r3)
Executing busybox-1.31.1-r9.trigger
OK: 102 MiB in 25 packages
Removing intermediate container eaa447d30f31
 ---> 580d1653b05a
Step 4/4 : CMD [ "redis-server" ]
 ---> Running in ef2315d864c2
Removing intermediate container ef2315d864c2
 ---> 7e9ec14f7706
Successfully built 7e9ec14f7706
Successfully tagged sample:latest

上記をよく観察すると、「Step 1/4」、「Step 2/4」といった感じで、Dockerfileからイメージをビルドする際の途中経過がログとして記載されています。

Step 1/4では、alpineがインストールされていることが分かり、Step 2/4ではRedisがインストールされていることが分かります。

これでDockerfileからイメージがビルドされました。

コンテナを起動する

次はイメージからコンテナを作って、実行します。

以下のコマンドを打ち込んで下さい。

$ docker run sample

先程、作成したイメージを引数で指定していることに注目して下さい。

すると、以下のようになると思います。

$ docker run sample
1:C 24 Feb 2020 06:15:31.505 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 24 Feb 2020 06:15:31.506 # Redis version=5.0.7, bits=64, commit=bed89672, modified=0, pid=1, just started
1:C 24 Feb 2020 06:15:31.506 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 24 Feb 2020 06:15:31.527 * Running mode=standalone, port=6379.
1:M 24 Feb 2020 06:15:31.529 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 24 Feb 2020 06:15:31.529 # Server initialized
1:M 24 Feb 2020 06:15:31.535 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 24 Feb 2020 06:15:31.536 * Ready to accept connections

「Ready to accept connections」と出ているので、Redisが起動したことが分かります。

停止する場合は、「Ctrl + C」で停止します。

ここまでで、Dockerfileを使用してイメージを設定し、コンテナを起動することが出来ました。

最後に

今回はDockerfileの作成方法について、ざっと説明させて頂きました。

簡単にまとめてしまうと、以下の3点をDockerfileで書きます。

  1. FROMでベースとなるイメージを書く。
  2. RUNでベースとなるイメージの中で追加で実施するコマンドを書く。
  3. CMDでコンテナ起動時に実行するコマンドを書く。
まだまだこの記事の内容だけでは、Dockerfileの全容を掴めるというわけではないですが、理解するためのファーストステップとなっていれば幸いです。

それでは、良いエンジニアライフをお過ごし下さい!

ありがとうございました!

もし、「面白かった・ためになった」という方がいましたら、シェアして頂けると幸いです!
最新情報をチェックしよう!