Dockerで簡単にbuildする方法: イメージのセットアップを自動化する
目次
- Dockerでbuild
- 公式ドキュメント
- 作業ディレクトリを決める
- HTMLファイルを作成
- Dockerfileを作成
- その他のコマンド
- docker buildでビルドする
- ビルドしたイメージからコンテナを走らせる
- ブラウザでアクセスする
- 問題
- おわりに
Dockerでbuild
Dockerのbuild
コマンドはDockerfile
からイメージを新規作成するコマンドです。
Dockerfile
には自動化のためのコマンドを記述することが出来ます。
これを使うことによってイメージのビルドを自動化し、ひいてはサービスのデプロイの自動化にも貢献することが可能です。
今回はCentOS
にNginx
をインストールし、指定したHTML
をブラウザで表示するところまでやってみたいと思います。
公式ドキュメント
作業ディレクトリを決める
Dockerfile
やindex.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
でベース・イメージを設定するコマンドを答えよ
RUN
FROM
ENTRYPOINT
Q2: ビルド中のイメージ内でMariaDB
をインストールしたい。適当なコマンドを答えよ
FROM
RUN
ADD
Q3: ビルド中のイメージにホスト側のファイルを追加したい。適当なコマンドを答えよ
RUN
FROM
ADD
Q4: docker run
でバックグラウンドですぐに終了するプロセスをフォアグラウンドで実行できるようにしたい。適当なオプションを答えよ
-g "daemon off;"
-g "deemon off;"
-g "daemon on;"
正解
Q1: 2
Q2: 2
Q3: 3
Q4: 1
おわりに
Dockerによるビルドの自動化ができるようになると、自作のサービスをDockerfile
に落とし込んで、どんなサーバー上でもコマンド1発でイメージを生成できるようになります。
サービスのデプロイの自動化も可能になるので、ぜひ押さえおきたいツールですね。