コンテナネットワーク

簡単解説!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のインストール まで です。

  1. ファイルとディレクトリの構成
  2. コンテナイメージ作成するためのDockerfileの準備
  3. docker-compose.yml ファイルの準備
  4. コンテナイメージの作成とコンテナの作成
  5. NGINXの設定ファイルとコンテンツの準備
  6. ログの確認とコンテナの削除

はじめに

環境は、Ubuntu 20.04 + Docker Engine 24.0.1 + docker compose 2.18.1 + NGINX Plus R29 です。NGINX Plus の nginx-repo.crtnginx-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
  • コンテナは削除されましたが、コンテナイメージは残っていますのでイメージも削除する場合には、以下のコマンドを実行します。

    1. 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
    2. 削除したコンテナイメージの 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 composeは コンテナを一括で起動・停止・削除などの操作を実施することができ、かつ、複数のコンテナを同時に起動させたり、複数の環境に素早く同じ環境を構築することができます。
NGINXのオープンソース版(OSS版)を使っており、NGINX Plus を試したいという方には、是非、docker compose を使って dockerコンテナとして NGINX Plus を試してみてはいかがでしょうか。

NGINX WAFである NGINX App Protect WAF に関しても docker composeで実現する例をブログに載せたいと思います。ご期待ください。

この記事に関連する製品・サービス

この記事に関連する記事