Dockerで簡単にbuildする方法: イメージのセットアップを自動化する

35, 2020-09-03

目次

Dockerでbuild

DockerのbuildコマンドはDockerfileからイメージを新規作成するコマンドです。
Dockerfileには自動化のためのコマンドを記述することが出来ます。

これを使うことによってイメージのビルドを自動化し、ひいてはサービスのデプロイの自動化にも貢献することが可能です。

今回はCentOSNginxをインストールし、指定したHTMLをブラウザで表示するところまでやってみたいと思います。

公式ドキュメント

作業ディレクトリを決める

Dockerfileindex.htmlなどを置いておくディレクトリを最初に決めます。
このディレクトリで作業することになります。
今回はWSL2上の/mnt/d/src/docker-test内で作業することにします。
皆さんはお好きなディレクトリをお使いください。

HTMLファイルを作成

次にブラウザで表示するHTMLファイルを作成します。
名前はindex.htmlとします。
この名前はあとでDockerfileから参照します。

<html>
<head>
  <title>Hello</title>
</head>
<body>
  <h1>Hello, World!</h1>
</body>
</html>

Dockerfileを作成

次にDockerfileを作成します。
Dockerfileは↓のような内容です。

FROM centos
LABEL maintainer="dev <xxxx@gmail.com>"

RUN yum install -y nginx
ADD index.html /usr/share/nginx/html/

Dockerfileにはコマンドを記述します。
コマンドは複数記述することが出来ます。

コマンド コマンドの引数
コマンド コマンドの引数
コマンド コマンドの引数
...

各コマンドについて解説します。

FROMコマンド

FROMコマンドはビルドで最初に実行されるコマンドです。
FROMコマンドは引数に指定されたDockerイメージを引っ張ってきて初期化します。
これはベース・イメージと呼ばれます。

FROM centos

↑の例ではcentosというイメージが設定され、ベース・イメージとして初期化されます。

LABELコマンド

LABELコマンドはイメージに対してメタデータを追加するコマンドです。

LABEL maintainer="dev <xxxx@gmail.com>"

↑の例ではイメージのメンテナーのラベルを設定しています。

RUNコマンド

RUNコマンドはビルド中のイメージ内で実行するコマンドを指定します。

RUN yum install -y nginx

↑の場合、CentOSのyumコマンドが実行され、nginxがインストールされます。
こうすることでnginxをインストール済みのイメージを作成することが出来ます。

ADDコマンド

ADDコマンドはホスト側のファイルをイメージ内に追加します。

ADD index.html /usr/share/nginx/html/

↑の場合、ホスト側にあるindex.html(先ほど作成したファイル)をイメージ側の/usr/share/nginx/html/に追加しています。
/usr/share/nginx/html/はNginxが管理するディレクトリです。
デフォルト設定ではここに置かれたindex.htmlをNginxは見に行きます。

その他のコマンド

その他のコマンドについてはこちらのドキュメントを参照してみてください。

docker buildでビルドする

Dcokerfileを作成したのでビルドします。
ビルドするときは作業ディレクトリ上に移動しておきます。
そして以下のコマンドを実行すると、ビルドが開始されます。

# docker build -t dev/centos-nginx:1.0 .

docker buildコマンドは↓のような構造をしています。

docker build -t 作成するイメージ名:タグ Dockerfileのあるディレクトリのパス

↑の場合、dev/centos-nginx:1.0と言うイメージを、.ディレクトリ以下のDockerfileから作成します。

ビルドが実行されるとベース・イメージの設定やyumコマンドの動作などがログで流れます。

ビルドしたイメージからコンテナを走らせる

ビルドしたイメージdev/centos-nginx:1.0からコンテナを走らせます。

# docker run -itdp 8123:80 dev/centos-nginx:1.0 /usr/sbin/nginx -g "daemon off;"

ポートは8123:80とし、ホスト側の8123ポートにコンテナ側の80ポートを繋げます。つまりコンテナ側のNginxの出力をホスト側に繋げています。

実行するコマンドは/usr/sbin/nginxとします。これはNginxのバイナリです。
このバイナリを実行するときは-g "daemon off;"をオプションとして付け加えます。
-g "daemon off;"を付けるのは/usr/sbin/nginxを単体で実行するだけではプロセスがすぐに終了し、よってコンテナもすぐに終了してしまうためです。
Dockerはプロセスがフォアグラウンドで動いてないとコンテナを終了してしまうので、-g "daemon off;"を付けて/usr/sbin/nginxのデーモン化をやめてフォアグラウンドで実行するようにしています。

ブラウザでアクセスする

ブラウザでlocalhost:8123にアクセスすると「Hello, World!」と表示されます。

問題

Q1: Dockerfileでベース・イメージを設定するコマンドを答えよ

  1. RUN

  2. FROM

  3. ENTRYPOINT

Q2: ビルド中のイメージ内でMariaDBをインストールしたい。適当なコマンドを答えよ

  1. FROM

  2. RUN

  3. ADD

Q3: ビルド中のイメージにホスト側のファイルを追加したい。適当なコマンドを答えよ

  1. RUN

  2. FROM

  3. ADD

Q4: docker runでバックグラウンドですぐに終了するプロセスをフォアグラウンドで実行できるようにしたい。適当なオプションを答えよ

  1. -g "daemon off;"

  2. -g "deemon off;"

  3. -g "daemon on;"


正解

Q1: 2
Q2: 2
Q3: 3
Q4: 1

おわりに

Dockerによるビルドの自動化ができるようになると、自作のサービスをDockerfileに落とし込んで、どんなサーバー上でもコマンド1発でイメージを生成できるようになります。
サービスのデプロイの自動化も可能になるので、ぜひ押さえおきたいツールですね。



この記事のアンケートを送信する