【初心者〜現場で活躍まで】挫折しないPython勉強方法もっと知る

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

  • Dockerをどうやって使ったら良いか分からない!

今回は、こんな悩みについて解決します。

Dockerの便利さを理解出来たとしても、Dockerの使い方が分からなかったら意味がありません。

そのため、今回は、Dockerの使い方について解説します。具体的にはDockerfileの書き方です。

この記事では、実世界でプログラムをインストールする時の話を具体例として、ハンズオン形式でDockerfileの書き方について解説します。

Dockerの概要や便利さを理解したい人は以下の記事がおすすめです。

Dockerfileの書き方を理解するためには、3つのコマンドの使い方を理解すれば完全に理解できますので、最後までお読み下さい。

目次

Dockerfileの概要

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

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

Dockerがあれば、簡単に環境のコピーが可能

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

エソラ

Dockerfileがあると、環境構築がとっても楽になるわけです!

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

次に、Dockerfileの作成方法についてです。ここを理解出来たら、Dockerを使うことが出来るようになります。

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

エソラ

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

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

空のPCのセットアップ手順
  1. OSをインストールする
  2. ソフトウェアをインストール
  3. インストールしたソフトウェアを実行

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

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

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

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

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

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

Linuxディストリビューションとは?

Linuxを使いやすいように必要なアプリケーション等をパッケージ化して、すぐに使える状態にしたものです。

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

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

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

現実世界ではDockerfileでは
OS(alpine)をインストールするFROM alpine
RedisとgccをインストールするRUN apk add –update redis
RUN apk add –update gcc
Redisを実行するCMD [“redis-server”]
Dockerfileに書く内容

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

ここで重要なのは、「FROM」、「RUN」、「CMD」という3つのコマンドです。

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を作成してみましょう。

まずローカル環境のお好きな場所に「Dockerfile」というファイルを作って下さい。ちなみに拡張子はいりません。

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

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の作成方法まとめ

今回はDockerfileの作成方法について、ざっと説明させて頂きました。簡単にまとめてしまうと、以下の3つのコマンドをDockerfileに書きます。

Dockerfileで書く3つのコマンド
  1. FROMでベースとなるイメージを書く。
  2. RUNでベースとなるイメージの中で追加で実施するコマンドを書く。
  3. CMDでコンテナ起動時に実行するコマンドを書く。

まだまだこの記事の内容だけでは、Dockerfileの全容を掴めるというわけではないですが、理解するためのファーストステップとなっていれば幸いです。

以下は参考書籍です。

¥4,180 (2022/11/25 00:35時点 | Amazon調べ)

ここまでお読みいただき、ありがとうございました。

役に立った、面白かったと思ったら、SNSでシェアしてくれると嬉しいです。

エソラ

もし分からないことがあれば、お問い合わせTwitterにご連絡をいただけると嬉しいです。(Twitterの方が返信早いかも…)

\ 更新の励みになるので、ポチッとしてね /

エソラ

他にもスキルアップやキャリアアップの役に立つ情報が満載です。他の記事も読んで、ゆっくりしていってね!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメント一覧 (3件)

コメントする

目次