既存のDockerでNginxが動作している環境に新しいアプリを追加し、サブドメインでアクセスできるようにするには、以下の手順を進めることで設定できます。
補足)以下の例では、XServerVPSのDifyアプリイメージを利用中の環境で行なっています。
1.手順概要
- 新しいアプリケーション用のコンテナを作成
- 既存のNginxコンテナに新しいサブドメインの設定を追加
- Nginxコンテナを再起動または設定をリロード
- サブドメインの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-app
を docker_default
に接続:
docker network connect docker_default test-app
トラブルシューティング:test-app
コンテナが起動しているか確認
test-app
が正常に動作していない場合、エラーが発生します。下記の手順でコンテナの状態を確認して、コンテナを再開します。
コンテナの状態を確認
docker ps -a
コンテナがExited
状態の場合、再起動
docker start test-app
コンテナのログを確認
test-app
がExited
状態の場合、ログを確認してエラー内容を特定します。
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
コマンドをサポートしている場合、curl
でtest-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のホストサーバーを指すように設定します。
- Aレコードの設定
test.example.com
→ NginxホストのIPアドレス。
- 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と新しいアプリケーションを一括で管理できます。
ここでは詳細については、記載しませんが、簡単に特徴を説明します。
主な特徴
- 複数のサービスを一括管理
- Webサーバー、データベース、キャッシュなどの複数コンテナを
docker-compose.yml
ファイルで定義し、まとめて起動・停止できます。
- Webサーバー、データベース、キャッシュなどの複数コンテナを
- シンプルなコマンド
docker compose up
などの簡単なコマンドで、環境全体をセットアップ。
- 環境の再現性
docker-compose.yml
を使えば、どのマシンでも同じ環境を構築可能。
- ネットワークとデータ永続化
- コンテナ間のネットワークを自動構築し、データを永続化するボリュームの管理も可能。
9. まとめ
- アプリケーションコンテナの作成:
- 新しいアプリケーションをDockerコンテナとして作成。
- Nginxの設定:
- サブドメインごとにリバースプロキシを設定。
- DNS設定:
- サブドメインがNginxホストを指すように設定。
- Docker Composeを活用:
- すべてのサービスを一括で管理。
この手順で、サブドメインを使用して新しいアプリケーションにアクセスできるようになります。
コメント