新兵訓練Dockerキャンプ! Dockerfileを書いてイメージを作れ!

f:id:tercel_s:20210125195054p:plain

Docker がよく分からないまま取り残されてしまったそこのキミ!

ブートキャンプへようこそ!!

ビクッ

前回の記事が謎の好評を頂いたので、まさかの第二弾です。

でも隊長のキャラを維持するのは思いのほかキツいので、今日は普通にやります。

※ 参考: 前回の記事

本日のミッション: Dockerfile を書いてみよう

今日は、Dockerfile という設定ファイルを書いて、Docker イメージを作ってみよう。

ぉぉぅ。

前提知識: イメージとコンテナ

あ、ところで何の説明もなく Docker イメージという言葉を使っているけど、大丈夫?

一応大丈夫

イメージとコンテナは、クラスとインスタンスの関係に似ているという理解。

さすがアプリケーションプログラマ

どうしても最初は抽象論っぽく感じる人が多いんだけど、既知の概念と対応させると理解しやすいよね。

うん。

Docker イメージの作り方は2通り

Docker イメージは、既存のコンテナから作る方法と、Dockerfile から作る方法の2通りがあるのだ。

Docker イメージの作り方は2通り:
❶ 既存のコンテナから作る
❷ Dockerfileから作る
既存のコンテナから作られたイメージは、ベースとなるコンテナにどのような変更が加えられたかが分からない。
ポイント

一方、Dockerfile からイメージを作れば、ベースとなるイメージに対してどのような変更を加えたかが分かる

後からさらに変更を加えたい場合も、Dockerfile の必要箇所を編集するだけで済むんだ。

Dockerfile の方がいいってこと?

ケースバイケースだけどね。

でも、Dockerfile から イメージの作り方を知っておくのはよいことだよ。

今日の到達目標

今日は、Apache HTTP Server (httpd) をベースに、静的な HTML ファイルを内蔵したイメージを作ってみよう。

ふぁい。

今日の目標は、簡単なページを表示するところまで。

f:id:tercel_s:20210306180925p:plain

……難しい?

いやチョー簡単。

慣れれば5分とかからない。

全体の手順の流れはこんな感じだよ。

Dockerfile を使ってイメージを作る場合、イメージに含めたいファイルと Dockerfile を 1 つのディレクトリに置き、それを docker build して作る。
f:id:tercel_s:20210306155334p:plain:w500
作り方の流れ

なるほど分からん。

ここからは実際に手を動かしてやってみよう。

ハンズオン

作業用ディレクトリを作る

まず、イメージに含めたいファイルをまとめるための作業用ディレクトリを作ろう。

$ mkdir work
$ cd work

ディレクトリ名はなんでもいいの?

なんでもいいよ。

イメージに含めるファイルを作る

ここに index.html と Dockerfile を作る。

とりあえず nano か vi を使おう。

f:id:tercel_s:20210306162245p:plain

じゃあとりあえず vi で。

index.html

<html>
  <body>
    <div>Hello, World</div>
  </body>
</html>

Dockerfile

FROM httpd
COPY index.html /usr/local/apache2/htdocs/

HTML はいいとして、Dockerfile は何が書いてあるの?

今回は2行だから分かりやすいと思う。

ざっくりこんな感じ。

FROM 
ベースイメージを指定
COPY 
index.html
 
/usr/local/apache2/htdocs/
コピー元
コンテナの中のコピー先
= Apache のドキュメントルート
Dockerfile の中身

1行目は、「ベースイメージに Apache HTTP Server (httpd) を使うよ」という意味。

ふむ。

で、2行目は、「作業フォルダにある index.html を、Apache のドキュメントルートにコピーしてね」という意味。

作業フォルダに無いファイルを、コピー元に指定することはできない。

イメージに含めたいファイルは、前もって作業用フォルダにまとめておく必要があるということか。

そう。

ls コマンドで、index.html と Dockerfile があることを確認しておこう。

f:id:tercel_s:20210306170402p:plain

docker build でイメージを作る

これで準備は完了なので、docker build コマンドを使ってイメージを作ってみるよ。

$ docker build -t myhelloworld .

おk

f:id:tercel_s:20210306170638p:plain

ちなみにこのコマンドの意味はこんな感じ。

-t オプションでイメージ名myhelloworldを指定している。

$ docker build 
-t myhelloworld
 
.
イメージ名
:タグ
※ タグは省略可能
Dockerfile があるディレクトリのパス
docker build コマンド

これで Docker イメージができたの?

うん。

docker image ls コマンドで確認できるよ。

f:id:tercel_s:20210306173448p:plain

なるほど、myhelloworld がいる……。

docker run でコンテナを起動する

せっかくだから動かしてみるか。

docker run コマンドを叩いてみよう。

$ docker run -dit --name hello -p 8080:80 myhelloworld

……長いよ。

長いね。

$ docker run 
-dit
 \
コンテナをバックグラウンドで実行する
    
--name hello
 \
コンテナにhelloという名前をつける
    
-p 8080:80
 \
ホストの8080番ポートを、コンテナの80番ポートに結びつける
    
myhelloworld
イメージの名前
docker run コマンド

オプションの指定のところで、「-」が1個だったり2個だったり統一されていない気がするのですが……?

まぁそこは、ぶっちゃけわびさびの世界ですな。

なんとなく緩い基準はあるっぽいのだけど。

-p ってなにもの?

ブラウザを開いて、コンテナを動かしているホストの IPアドレス:8080 にアクセスしてみよう。

f:id:tercel_s:20210306180925p:plain

ぉぉ。

httpd のコンテナは、80番ポートで通信を待ち受けているんだ。

-p 8080:80 と指定すると、ホストの8080番ポートに対する通信が、そのままコンテナの80番ポートに透過されるようになる。

ふむ。

まぁそこは追い追いですな。

とりあえず今日のミッションは以上です。

お疲れ様でした。

おつかれしたー(舐めプ

反省会

そもそも、こんなことして何が嬉しいんだっけ。

一番大きな動機は、開発環境の構成をそのまま本番環境に持っていけることだと思う。

開発環境で正常動作していたのに、なぜか本番環境で動かなくなるとか、あるあるだよね。

笑い事じゃないけど。

あと、実際に運用する段階でも嬉しいことはあるよ。

例えば、Web サイトを運営していたら、予想外にアクセスが急増したとしよう。

そういえば去年、シャープの EC サイトにアクセスが集中してダウンしたね。

そんなとき、同じような構成のサーバを新しく立てて、負荷分散することがあるんだ。

スケールアウトというのだけど。

はい。

Docker イメージがあれば、簡単に構成を複製できるよね。

あぁなるほど。

とりあえず、Docker イメージづくりの基本はたったこれだけ。

❶ 作業フォルダを作る

❷ イメージに含めたいファイルを集める

❸ Dockerfile を書く

docker buildコマンドを叩く

なんかできそうな気がしてきた。

まぁがんばってください。

つづく(かもしれない)

Copyright (c) 2012 @tercel_s, @iTercel, @pi_cro_s.