Docker composeとNginxでリバースプロキシする | アントレプログラマー

Docker composeとNginxでリバースプロキシする

Docker

こんにちは、ニキです。

この記事はこんな方におすすめです。

  • Docker composeやNginx の基本的なことは分かる。
  • compose.yamlやdefault.confの具体的な設定方法を知りたい。
  • SSL通信できるようにしたい。
  • Nginxを使ってリバースプロキシしたい。

今回の記事では、リバースプロキシをするためにcompose.yamlとdefault.confの具体的な設定方法を解説します。先にSSL通信なしパターンを解説した後に、SSL通信ありパターンを解説します。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

Docker composeを使ってSSL非対応のNginxをリバースプロキシとして扱う

まずは、SSL非対応です。

default.confを作成する

Nginxの設定ファイルとしてdefault.confを用意します。

% touch default.conf

default.confを以下のように編集します。コンテナ内部からホストを参照したいのでhost.docker.internalを使用しています。

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_pass <http://host.docker.internal:8081/>;
    }
}

index.htmlを作成する

プロキシできているかを確認するために、index.htmlを作成します。

% touch index.html

index.htmlの編集例です。

<h1>Hello Nginx!</h1>

compose.yamlを作成する

compose.yamlを作成します。

% touch compose.yaml

compose.yamlを以下のように編集します。リバースプロキシされるAPIサーバーとして、今回は簡単のためにNginxを使用しています。

services:
  nginx:
    image: nginx:1.25.1-alpine-slim
    container_name: nginx
    ports:
      - 8080:80
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
  api:
    image: nginx:1.25.1-alpine-slim
    container_name: api
    ports:
      - 8081:80
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html

コンテナを作成する

コンテナを作成・起動します。

% docker compose up -d

コンテナが動作していることを確認します。

% docker compose ps

以下のように表示されていれば正常に動作しています。

NAME                IMAGE                      COMMAND                  SERVICE             CREATED             STATUS              PORTS
api                 nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   api                 2 minutes ago       Up 2 minutes        0.0.0.0:8081->80/tcp
nginx               nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   nginx               2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp

http://localhost:8080/ にアクセスして、以下のように表示されていれば成功です。

Docker composeを使ってSSL非対応のNginxをリバースプロキシとして扱う

次に、SSLに対応させます。

default.confを作成する

Nginxの設定ファイルとしてdefault.confを用意します。

% touch default.conf

default.confを以下のように編集します。

server {
    listen       443 ssl;
    server_name  localhost;
    ssl_certificate      /etc/nginx/conf.d/localhost.pem;
    ssl_certificate_key  /etc/nginx/conf.d/localhost-key.pem;

    location / {
        proxy_pass <http://host.docker.internal:8081/>;
    }
}

秘密鍵とSSL証明書を新たに用意するなら以下の記事が参考になります。

compose.yamlを変更する

compose.yamlを以下のように変更します。

services:
  nginx:
    image: nginx:1.25.1-alpine-slim
    container_name: nginx
    ports:
      - 8443:443
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - $PWD/localhost.pem:/etc/nginx/conf.d/localhost.pem
      - $PWD/localhost-key.pem:/etc/nginx/conf.d/localhost-key.pem
  api:
    image: nginx:1.25.1-alpine-slim
    container_name: api
    ports:
      - 8081:80
    volumes:
      - ./index.html:/usr/share/nginx/html/index.html

コンテナを再作成する

コンテナを停止・削除します。

% docker compose down

コンテナを作成・起動します

% docker compose up -d

コンテナが動作していることを確認します。

% docker compose ps

以下のようにPORTSの値が変更されて表示されていれば正常に動作しています。

NAME                IMAGE                      COMMAND                  SERVICE             CREATED             STATUS              PORTS
api                 nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   api                 2 minutes ago       Up 2 minutes        0.0.0.0:8081->80/tcp
nginx               nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   nginx               2 minutes ago       Up 2 minutes        80/tcp, 0.0.0.0:8443->443/tcp

https://localhost:8443/ にアクセスして、同様の表示がされていれば成功です。

まとめ

今回の記事では、リバースプロキシをするためにcompose.yamlとdefault.confの具体的な設定方法を解説しました。

効率的に学習するならプログラミングスクールの検討もありです。

さらに詳しく学びたい方は、以下の書籍がおすすめです。

Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

nginx実践入門

Nginxの構築と運用に関する幅広い知識を得られます。リアルなユースケースを元にした具体例が豊富に紹介されており、初心者から上級者まで、あらゆるレベルのエンジニアにとって実際の問題解決に役立ちます。

Takaharu Niki

・Webエンジニア5年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
Docker
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました