簡単解説!docker composeでNGINX Plusをデプロイする方法
以前に「DockerコンテナにNGINX Plusをデプロイする方法」を紹介しました。今回は docker compose を使って NGINX Plus をコンテナにする方法を紹介します。
コンテナを使っていますか?
既にコンテナを活用してコスト削減・生産性の向上などを推し進めている方も多いかと思います。私も色々な環境でコンテナを使って業務効率化に励んでいるひとりです。
さて、以前に本ブログで 「 分かりやすく解説!DockerコンテナにNGINX Plusをデプロイする方法 」 として NGINX Plusをコンテナにする方法を紹介しました。その際に、ステップ1として「コンテナイメージを作成」し、ステップ2として「コンテナを作成」の二段階でコンテナを作成する方法でした。
今回は、docker compose を使って、コンテナイメージ作成とコンテナの作成を1回で実施します。"docker compose up -d" とコマンドを叩くだけで済みますし、楽です。
以下の内容で早速、その方法を紹介していきます。ゴールは NGINX Plusのインストール まで です。
- ファイルとディレクトリの構成
- コンテナイメージ作成するためのDockerfileの準備
- docker-compose.yml ファイルの準備
- コンテナイメージの作成とコンテナの作成
- NGINXの設定ファイルとコンテンツの準備
- ログの確認とコンテナの削除
はじめに
環境は、Ubuntu 20.04 + Docker Engine 24.0.1 + docker compose 2.18.1 + NGINX Plus R29 です。NGINX Plus の nginx-repo.crt と nginx-repo.key の2つライセンスファイルも事前に用意します。
- NGINX Plusを試してみたい方へ → 東京エレクトロンデバイスではNGINX Plusの無償の30日間のトライアルライセンスを提供しています。お申し込みは、こちら です。
docker compose(ドッカー コンポーズ) とは
コンテナを作成する際の便利なツールです。
- Docker-docs-ja から引用
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose は YAML ファイルを使い、アプリケーションのサービスを設定します。コマンドを1つ実行するだけで、設定内容に基づいた全てのサービスを生成・起動します。
docker composeのインストール
dockerをインストールする際に、一緒に docker compose もインストールします。
- Dockerのインストール(docker composeもインストール)
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y \ && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - \ && sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ && sudo apt -y update \ && sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose
1. ファイルとディレクトリの構成
- 以下の構成です。NGINXの設定conf と SSL用ファイルを置いておけるディレクトリも用意しました。
├── Dockerfile.alpine → バージョンを変更できるように修正したDockerfile ├── Dockerfile.f5 → メーカーサイトよりコピペした内容 ├── .env → 環境ファイル ├── conf.d │ └── default.conf → シンプルなNGINXのconfファイル ├── docker-compose.yml → docker compose で読み込まれる設定ファイル ├── html │ └── index.html → Hello World を表示するコンテンツ └── ssl
2. コンテナイメージ作成するためのDockerfileの準備
NGINX Docs というメーカーサイトで用意されているDockerfileを参考に少しだけ変更しています。
メーカーサイトのalpineベースのDockerfileを Dockerfile.f5 として、今回、修正したDockerfileを Dockerfile.alpine としています。バージョン情報を外部から渡す内容に変更しています。
-
diff Dockerfile.f5 Dockerfile.alpine
の結果10a11,14 > ARG NGINX_VERSION > ENV NGINX_VERSION ${NGINX_VERSION} > ARG PKG_RELEASE > ENV PKG_RELEASE ${PKG_RELEASE} 24,25c28,29 < nginx-plus \ < # nginx-plus=${NGINX_VERSION}-r${PKG_RELEASE} \ --- > # nginx-plus \ > nginx-plus=${NGINX_VERSION}-r${PKG_RELEASE} \ 85a90 >
3. docker-compose.yml ファイルの準備
docker-compose.ymlの準備
docker-compose.yml は、docker compose で読み込まれる設定ファイルです。
-
docker-compose.yml の中で
${NGINX_VERSION}
、${PKG_RELEASE}
、${NGXPORT}
、${LICENSE_KEY}
、${LICENSE_CRT}
を環境変数として設定しています。環境変数の実際の値は、次項の .env ファイル内で指定します。version: '3.9' services: sv: build: context: . dockerfile: ./Dockerfile.alpine args: - NGINX_VERSION=${NGINX_VERSION} - PKG_RELEASE=${PKG_RELEASE} secrets: - nginx-key - nginx-crt container_name: nginxplusr${NGINX_VERSION} hostname: nginxplus-r${NGINX_VERSION} volumes: - ./html:/usr/share/nginx/html - ./conf.d:/etc/nginx/conf.d - ./ssl:/etc/nginx/ssl ports: - ${NGXPORT}:80 - 8443:443 secrets: nginx-key: file: ${LICENSE_KEY} nginx-crt: file: ${LICENSE_CRT}
docker composeで引き渡す環境ファイル .env ファイルの準備
- 環境ファイル .env は自動で読み込まれます。NGINX_VERSION と PKG_RELEASE の値を変更することで今回とは異なるバージョンのNGINX Plusをインストールすることができます。LICENSE_CRT と LICENSE_KEY の値は、ライセンスファイルのディレクトリ情報とファイル名です。
NGINX_VERSION=29 PKG_RELEASE=1 NGXPORT=8029 LICENSE_CRT=/home/ubuntu/setup/nginx-repo.crt LICENSE_KEY=/home/ubuntu/setup/nginx-repo.key
4. NGINXの設定ファイルとコンテンツの準備
今回はシンプルな内容で用意しました。
-
NGINX設定ファイル default.conf(conf.d/default.conf)
server { listen 80 default_server; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } }
-
コンテンツ index.html(html/index.html)
Hello World.
5. コンテナイメージの作成とコンテナの作成
- docker composeを使って、コンテナを作成します。docker-compose.yml ファイルが置いてあるディレクトリで実行します。これでコンテナイメージの作成、そして、コンテナの作成まで が実行されます。
sudo docker compose up -d
- コマンドの実行例です。
[+] Building 11.3s (6/6) FINISHED => [sv internal] load build definition from Dockerfile.alpine 0.0s => => transferring dockerfile: 3.95kB 0.0s => [sv internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [sv internal] load metadata for docker.io/library/alpine:3.17 1.9s => [sv stage-0 1/2] FROM docker.io/library/alpine:3.17@sha256:124c7d2707904eea7431fffe91522a 0.5s => => resolve docker.io/library/alpine:3.17@sha256:124c7d2707904eea7431fffe91522a01e5a861a62 0.0s => => sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a312 1.64kB / 1.64kB 0.0s => => sha256:b6ca290b6b4cdcca5b3db3ffa338ee0285c11744b4a6abaa9627746ee3291d8d 528B / 528B 0.0s => => sha256:9ed4aefc74f6792b5a804d1d146fe4b4a2299147b0f50eaf2b08435d7b38c27 1.47kB / 1.47kB 0.0s => => sha256:f56be85fc22e46face30e2c3de3f7fe7c15f8fd7c4e5add29d7f64b87abdaa0 3.37MB / 3.37MB 0.2s => => extracting sha256:f56be85fc22e46face30e2c3de3f7fe7c15f8fd7c4e5add29d7f64b87abdaa09 0.2s => [sv stage-0 2/2] RUN --mount=type=secret,id=nginx-crt,dst=cert.pem --mount=type=secre 8.5s => [sv] exporting to image 0.2s => => exporting layers 0.2s => => writing image sha256:531aac8a00b181ce30f67787323e543cbf78fa47dc5c286dd1c7c1149775136c 0.0s => => naming to docker.io/library/nginx-sv 0.0s [+] Running 2/2 ✔ Network nginx_default Created 0.0s ✔ Container nginxplusr29 Started
作成されたコンテナの確認
-
docker compose を使ってコンテナの状態を確認します。docker-compose.yml ファイルが置いてあるディレクトリで実行します。なお、docker psコマンドでも状態確認は可能です。
sudo docker compose ps
-
実行結果例
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS nginxplusr29 nginx-sv "nginx -g 'daemon of…" sv 17 minutes ago Up 17 minutes 0.0.0.0:8029->80/tcp, :::8029->80/tcp, 0.0.0.0:8443->443/tcp, :::8443->443/tcp
Listenポートは 8029 で無事にコンテナが起動しています。
早速、curlでアクセスしてみます。以下、結果ですが、こちらも問題なくレスポンスが返ってきています。ubuntu@ip-10-20-1-79:~/nginx$ curl localhost:8029 -i HTTP/1.1 200 OK Server: nginx/1.23.4 Date: Thu, 25 May 2023 06:33:44 GMT Content-Type: text/html Content-Length: 13 Last-Modified: Thu, 25 May 2023 05:37:01 GMT Connection: keep-alive ETag: "646ef3fd-d" Accept-Ranges: bytes Hello World.
作成されたコンテナイメージの確認
- コンテナイメージも確認します。コマンドは以下です。明示的に作成したコンテナイメージを指定していますが、なくてもイメージのリストは表示されます。
sudo docker images nginx-sv
- コンテナイメージの確認結果です。軽量なコンテナですね。
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker images nginx-sv REPOSITORY TAG IMAGE ID CREATED SIZE nginx-sv latest 531aac8a00b1 50 minutes ago 19.6MB
NGINX Plusのバージョン確認
docker composeコマンドで確認する場合には、docker-compose.ymlのあるディレクトリで実行します。
- コマンドでは、サービス名(ここでは sv)を指定します。
sudo docker compose exec sv nginx -v
- 実行結果例
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker compose exec sv nginx -v nginx version: nginx/1.23.4 (nginx-plus-r29)
6. ログの確認とコンテナの削除
access.log と error.log の確認方法
NGINXのログには、/var/log/nginx/access.log と /var/log/nginx/error.log があります。Dockerfileの中で指定していますが、それぞれ /dev/stdout と /dev/stderr とリンクしています。つまり、docker logsコマンドでログ内容を参照することができます。
- access.logの参照方法( nginxplusr29 はdocker psコマンドで確認したコンテナ名)
sudo docker logs nginxplusr29 2> /dev/null
- error.logの参照方法( nginxplusr29 はdocker psコマンドで確認したコンテナ名)
sudo docker logs nginxplusr29 1> /dev/null
コンテナの削除方法
- docker-compose.ymlファイルの置いてあるディレクトリでコマンドを実行します。
sudo docker compose down
- 実行例
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker compose down [+] Running 2/2 ✔ Container nginxplusr29 Removed 0.2s ✔ Network nginx_default Removed 0.1s
-
コンテナは削除されましたが、コンテナイメージは残っていますのでイメージも削除する場合には、以下のコマンドを実行します。
- docker imagesでコンテナイメージを確認
sudo docker images
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-sv latest 531aac8a00b1 9 hours ago 19.6MB
- 削除したコンテナイメージの REPOSITORY か IMAGE ID を使って削除します。
sudo docker rmi nginx-sv:latest
ubuntu@ip-10-20-1-79:~/nginx$ sudo docker rmi nginx-sv:latest Untagged: nginx-sv:latest Deleted: sha256:531aac8a00b181ce30f67787323e543cbf78fa47dc5c286dd1c7c1149775136c
- docker imagesでコンテナイメージを確認
まとめ
docker composeは コンテナを一括で起動・停止・削除などの操作を実施することができ、かつ、複数のコンテナを同時に起動させたり、複数の環境に素早く同じ環境を構築することができます。
NGINXのオープンソース版(OSS版)を使っており、NGINX Plus を試したいという方には、是非、docker compose を使って dockerコンテナとして NGINX Plus を試してみてはいかがでしょうか。
NGINX WAFである NGINX App Protect WAF に関しても docker composeで実現する例をブログに載せたいと思います。ご期待ください。