MENU
Language

既存のDockerでNginxが動作している環境に新しいアプリを追加し、サブドメインでアクセスする方法

既存のDockerでNginxが動作している環境に新しいアプリを追加し、サブドメインでアクセスできるようにするには、以下の手順を進めることで設定できます。

補足)以下の例では、XServerVPSのDifyアプリイメージを利用中の環境で行なっています。

目次

1.手順概要

  1. 新しいアプリケーション用のコンテナを作成
  2. 既存のNginxコンテナに新しいサブドメインの設定を追加
  3. Nginxコンテナを再起動または設定をリロード
  4. サブドメインのDNS設定を更新

2. 新しいアプリケーション用のコンテナを作成Flaskの例)

以下では、新しいFlaskアプリケーション用のDockerイメージを作成してコンテナを起動します。

アプリケーションディレクトリの準備

例)

/var/www/test-app/
  ├── app.py
  ├── requirements.txt
  └── Dockerfile

Flaskアプリケーションの例
app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello from the new app!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5002)

下記のような、シンプルな文字を表示する例です。

この例では、portの5000、5001が既に使用していたため、5002に設定しています。適宜変更してください。

requirements.txt Flaskを指定。

flask

ローカル環境で実行確認

cd /var/www/test-app
python3 app.py

動作確認後、使用したポートは解放する。

ポートの解放手順

使用中のポートを確認

sudo lsof -i :<ポート番号>

: ポート5002を確認する場合

sudo lsof -i :5002

出力例

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3   1234  root   4u   IPv4 123456      0t0  TCP *:5002 (LISTEN)
  • COMMAND: 使用中のプロセス(例: python3)。
  • PID: プロセスID(例: 1234)。
  • NAME: ポート状態(例: *:5002)。

現在リッスン中のすべてのポートを確認

sudo netstat -tuln

ポートを使用しているプロセスを解放する

確認したプロセスを停止してポートを解放します。

プロセスIDを指定して停止

sudo kill -9 <PID>

: PIDが1234の場合

sudo kill -9 1234

Dockerfileの作成

Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Dockerイメージのビルド

cd /var/www/test-app
docker build -t test-app:latest .

Dockerコンテナの起動

*ポート番号は5002を使用していますが、任意で変更してください。

docker run -d --name test-app --network docker_default -p 5002:5002 test-app:latest 

docker run
役割: 新しいコンテナを作成し、指定されたイメージを基にコンテナを起動します。

(エラーなどで一度削除が必要な場合は、docker rm test-appでコンテナを削除をしてから再度、起動を行う)

(参考)コンテナの停止、再開、一時停止、一時停止から再開

docker stop <container-name-or-id>
docker start <container-name-or-id>
docker pause <container-name-or-id>
docker unpause <container-name-or-id>

Dockerコンテナがサーバー再起動時に自動的に起動するように設定 *任意

Dockerコンテナがサーバー再起動時に自動的に起動するように設定するには、restartポリシー を使用します。以下に具体的な設定方法を解説します。

--restartオプションの使用

コンテナを作成または起動する際に、--restart オプションを指定します。

再起動ポリシーの種類

オプション説明
noコンテナは再起動しません(デフォルト設定)。
alwaysコンテナが終了した場合、またはホストが再起動した場合に常に再起動します。
unless-stoppedコンテナが手動で停止されない限り再起動します。ホストが再起動しても自動で再起動します。
on-failure[:max-retries]コンテナがエラーコードを返して終了した場合に再起動します。オプションで再試行回数を指定可能(例: on-failure:3)。

コマンド例1 既存のコンテナに再起動ポリシーを設定

今回の例では既にコンテナを作成済みのため、必要に応じてこちらの例を実施してください。

docker update --restart always test-app

コマンド例2 新しいコンテナを作成する場合に、--restart オプションを指定

docker run -d --name test-app --restart always -p 80:80 my-image
  • --restart always:
    • サーバーが再起動した場合、またはコンテナが終了した場合に自動的に再起動します。
  • -d: バックグラウンドでコンテナを実行。
  • -p 80:80: ホストのポート80をコンテナのポート80にマッピング。

その他:docker-compose.yml を使用して再起動ポリシーを設定

今回の例では詳しく説明していませんが、docker-compose.yml を使用して再起動ポリシーを設定することもできます。

3. Docker内のNginxコンテナに新しいサブドメインの設定を追加

コンテナの確認

起動中のDockerコンテナを確認します。

docker ps -a

結果の例)

CONTAINER ID   IMAGE                              COMMAND                  CREATED        STATUS                  PORTS                                                                      NAMES
zzc7350b9zzz   test-app:latest                    "python app.py"          49 seconds ago   Up 48 seconds         0.0.0.0:5002->5002/tcp, :::5002->5002/tcp                                  test-app
aa5d33b5eaaa   nginx:latest                       "sh -c 'cp /docker-e…"   39 hours ago   Up 39 hours             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-nginx-1
bbd832a5fbbb   langgenius/dify-api:0.12.0         "/bin/bash /entrypoi…"   39 hours ago   Up 39 hours             5001/tcp                                                                   docker-api-1
cca53ba58ccc   langgenius/dify-api:0.12.0         "/bin/bash /entrypoi…"   39 hours ago   Up 39 hours             5001/tcp                                                                   docker-worker-1
dd1ccb13addd   postgres:15-alpine                 "docker-entrypoint.s…"   39 hours ago   Up 39 hours (healthy)   5432/tcp                                                                   docker-db-1
eea03d60feee   redis:6-alpine                     "docker-entrypoint.s…"   39 hours ago   Up 39 hours (healthy)   6379/tcp                                                                   docker-redis-1
fff55980ffff   ubuntu/squid:latest                "sh -c 'cp /docker-e…"   39 hours ago   Up 39 hours             3128/tcp                                                                   docker-ssrf_proxy-1
gg3369aa7ggg   langgenius/dify-sandbox:0.2.10     "/main"                  39 hours ago   Up 39 hours (healthy)                                                                              docker-sandbox-1
hhc32ee36hhh   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   39 hours ago   Up 39 hours                                                                                        docker-weaviate-1
ii39ca8f2iii   langgenius/dify-web:0.12.0         "/bin/sh ./entrypoin…"   39 hours ago   Up 39 hours             3000/tcp                                                                   docker-web-1

Nginxコンテナ内での作業

Docker内のNginx(docker-nginx-1)に設定を追加するため、コンテナにアクセスして設定ファイルを編集します。

Nginxコンテナに入る

docker exec -it docker-nginx-1 bash

設定ファイルの場所を確認

コンテナ内でNginxの設定ファイルを確認します。通常は以下のディレクトリに配置されています:

ls /etc/nginx/conf.d/

結果の例)

default.conf  default.conf.template

カスタム設定ファイルを作成

Nginxの設定ディレクトリ(例: /etc/nginx/conf.d/)にカスタム設定ファイルを追加します。

nano /etc/nginx/conf.d/custom.conf

新しいサブドメインの設定を追加
サブドメイン(例: test.example.com)にリバースプロキシを設定します。

server {
    listen 80;
    server_name test.example.com;

    location / {
        proxy_pass http://test-app:5002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

補足

  • proxy_pass http://test-app:5002;: コンテナ名 test-app とポート 5002 を指定。
  • proxy_set_header: クライアント情報をリバースプロキシ経由でアプリに渡す設定。
  • ポート番号はこの例では5002としていますが、任意で変更してください。

Nginxの再読み込み

カスタム設定を適用するためにNginxを再読み込みします。

nginx -s reload

Nginxコンテナから出る

exit

4. 関連するコンテナのネットワークを確認

Nginxのネットワーク確認

docker inspect <nginx-container-name>

例)

docker inspect docker-nginx-1

Nginx ネットワークID、ネットワーク名のみ確認する方法

docker inspect -f '{{range $key, $value := .NetworkSettings.Networks}}{{if $value.NetworkID}}{{$value.NetworkID}}{{else}}<no-id>{{end}}:{{$key}}{{"\n"}}{{end}}' docker-nginx-1

バックエンド(test-appネットワークID、ネットワーク名のみ確認する方法

docker inspect -f '{{range $key, $value := .NetworkSettings.Networks}}{{if $value.NetworkID}}{{$value.NetworkID}}{{else}}<no-id>{{end}}:{{$key}}{{"\n"}}{{end}}' test-app

Nginx ネットワークとバックエンド(test-appのネットワークが一致していることを確認します。
ネットワークが異なる場合は、次のポイントを確認して、ネットワークが一致するように対応します。

トラブルシューティング:ネットワークが異なる場合

もしNginxとtest-appが異なるネットワークに属している場合、両方を同じネットワークに接続します。

Nginxと追加したアプリ(例:test-app)が同一のネットワークになるようにコンテナを接続

構文:docker_default のネットワークに接続

docker network connect docker_default <nginx-container-name>

設定例)

Nginxを docker_default に接続:
(既にNginxがdocker_default に接続している場合は不要)

例)コンテナ名=docker-nginx-1

docker network connect docker_default docker-nginx-1

test-appdocker_default に接続:

docker network connect docker_default test-app

トラブルシューティング:test-appコンテナが起動しているか確認

test-appが正常に動作していない場合、エラーが発生します。下記の手順でコンテナの状態を確認して、コンテナを再開します。

コンテナの状態を確認

docker ps -a

コンテナがExited状態の場合、再起動

docker start test-app

コンテナのログを確認

test-appExited状態の場合、ログを確認してエラー内容を特定します。

docker logs test-app

エラーが発生している場合は、コンテナをデバッグモードで起動

エラーの原因を特定するために、コンテナを対話モードで起動します。

docker run -it --rm --network docker_default test-app:latest sh

手動でアプリケーションを実行

python3 app.py

エラーを確認して、修正を行なった後に、再起動

docker start test-app

5. Nginxコンテナからtest-appへの接続確認

Nginxコンテナ内で、test-app が名前解決できるかテストします。

Nginxコンテナに入る

docker exec -it docker-nginx-1 sh

test-app の名前解決テスト

ping test-app

pingコマンドが実行できない場合は、次のcurl を使用して接続確認

curl を使用して接続確認

Nginxコンテナがcurlコマンドをサポートしている場合、curltest-appに接続できるか確認します。

コマンド

curl http://test-app:5002

Nginxコンテナから出る

exit

6. Nginxコンテナを再起動または設定をリロード

Nginx設定をテスト

Nginxコンテナの設定ファイルのテストを行います。

docker exec <nginx-container-name> nginx -t

例)

docker exec docker-nginx-1 nginx -t

設定をリロード

Nginxを再起動またはリロードします。

docker exec <nginx-container-name> nginx -s reload

例)

docker exec docker-nginx-1 nginx -s reload

7. サブドメインのDNS設定を更新

DNSレコードの設定

サブドメイン test.example.com がNginxのホストサーバーを指すように設定します。

  1. Aレコードの設定
    • test.example.com → NginxホストのIPアドレス。
  2. CNAMEレコードの設定(オプション)

反映までの時間の目安
ネームサーバーの変更 : 数時間から72時間程度
DNSレコードの登録、変更、追加、削除 : 数時間から24時間程度

確認の方法については、こちらもご覧ください。

8. 動作確認

サブドメインにアクセス
ブラウザで http://test.example.com にアクセスし、新しいアプリケーションが表示されることを確認します。

ログの確認
Nginxのログを確認して問題がないか確認します。

docker logs <nginx-container-name>

例)

docker logs docker-nginx-1
docker logs test-app

6. Docker Composeを利用する場合(オプション)

Docker Compose は、複数の Docker コンテナを簡単に管理・運用するためのツールです。
Docker Composeを使用して既存のNginxと新しいアプリケーションを一括で管理できます。
ここでは詳細については、記載しませんが、簡単に特徴を説明します。

主な特徴

  1. 複数のサービスを一括管理
    • Webサーバー、データベース、キャッシュなどの複数コンテナを docker-compose.yml ファイルで定義し、まとめて起動・停止できます。
  2. シンプルなコマンド
    • docker compose up などの簡単なコマンドで、環境全体をセットアップ。
  3. 環境の再現性
    • docker-compose.yml を使えば、どのマシンでも同じ環境を構築可能。
  4. ネットワークとデータ永続化
    • コンテナ間のネットワークを自動構築し、データを永続化するボリュームの管理も可能。

9. まとめ

  • アプリケーションコンテナの作成:
    • 新しいアプリケーションをDockerコンテナとして作成。
  • Nginxの設定:
    • サブドメインごとにリバースプロキシを設定。
  • DNS設定:
    • サブドメインがNginxホストを指すように設定。
  • Docker Composeを活用:
    • すべてのサービスを一括で管理。

この手順で、サブドメインを使用して新しいアプリケーションにアクセスできるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

AIアーティスト | エンジニア | ライター | 最新のAI技術やトレンド、注目のモデル解説、そして実践に役立つ豊富なリソースまで、幅広い内容を記事にしています。フォローしてねヾ(^^)ノ

コメント

コメントする

目次