すべての問題の根源は、Docker Compose を使用して npm コンテナを起動したことによるものです。オンラインの他のチュートリアルでは、docker0 ゲートウェイを使用してアクセスできることがわかりましたが、Docker Compose でデプロイされたコンテナはすべて同じサブネットに存在しないため、docker0 ゲートウェイにアクセスできませんでした。自分の知識が浅く、経験が少なかったため、長い間困惑していました。
Docker ネットワークのホストモードとブリッジモード#
Docker を使用するためには、Docker の 2 つの基本的なネットワークモードについて理解する必要があります。これにより、問題が発生した場合のデバッグ方法がわかります。
ホストモード#
ホストモードでは、Docker コンテナはホストマシン上で直接実行されるアプリケーションのように動作します。ポートマッピングの設定は必要ありません。なぜなら、ホストマシンのポートを直接使用するためです。このモードの利点は、ホストマシンからコンテナへのアクセス
、コンテナからホストマシンへのアクセス
、コンテナからコンテナへのアクセス
がすべてlocalhost:port
または127.0.0.1:port
を使用して直接アクセスできることです。単純に言えば、ホストモードではコンテナネットワークの概念がないと考えることができます。また、トラフィックの転送が不要なため、ネットワークパフォーマンスが最も高速です。欠点も明らかです。ホストマシンとコンテナネットワークの間には隔離がなく、ポートの使用には注意が必要です。ネットワーク隔離のないコンテナアプリケーションは、Docker の目的ではありませんよね?
ブリッジモード#
NAT モードでは、Docker コンテナが作成される際にネットワークモードが指定されていない場合、デフォルトでbridge
モードになります。コンテナが作成されると、appname_default
という名前のネットワークが自動的に作成されます。このモードの利点は、ホストマシンとコンテナネットワークが隔離されていることです。docker0
ゲートウェイを使用して相互にアクセスできます。また、NAT
を使用するため、異なるコンテナアプリケーションのネットワークを自由に構成できます。たとえば、一部のアプリケーションは同じサブネット内にあり、他のアプリケーションは別のサブネット内にあることができます。欠点は、NAT
がトラフィックの転送を必要とするため、ネットワークパフォーマンスがやや低下すること、またホストマシンからコンテナへ
、コンテナからコンテナへ
のアクセスは比較的簡単ですが、コンテナからホストマシンへ
のアクセスはやや複雑です。
どちらのモードも絶対的な利点や欠点はありません。より多くのシナリオに適用されることがあります。
NPM の 2 つのネットワークモードの設定#
コンテナを実行するためにdocker
コマンドラインを使用している場合、他のコンテナにアクセスするためにdocker0
ゲートウェイ:ポート(例:172.17.0.1:port
)を直接使用できます。
docker compose
の設定ファイルを使用してコンテナを起動している場合、私はあなたが私と同じネットワークの問題に直面していると信じています。つまり、172.13.0.1:port
で他のコンテナにアクセスできず、ホストマシンにもアクセスできません。これはnpm
にとって致命的です。なぜなら、それによってnpm
が無意味になるからです。
Docker Compose のhost
モード#
host
モードを使用すると、npm の設定が最も簡単になります。コンテナの数が少なく、ポートの競合もなく、詳細に注意を払う必要がない場合、このモードが最適です。行う必要があるのは、各docker-compose.yml
ファイルにnetwork_mode: "host"
という行を追加するだけです。これにより、npm
の設定のhostname/IP
フィールドにlocalhost
または127.0.0.1
を入力することで、他のコンテナやホストマシンのアプリケーションに直接アクセスできます。
Docker Compose のbridge
モード#
bridge
モードでは、2 つの通信方法があります。
- Docker コマンドラインを使用して内部ネットワークを構築する
利点は、設定ファイルを変更する必要がないことですが、コンテナを停止するたびにネットワークを再度サブネットに追加する必要があります。- ネットワークを作成する:
$ docker network create npm
- 他のコンテナをネットワークに追加する:
$ docker network connect npm <コンテナ名>
npm
ネットワーク内のコンテナと IP を確認する:$ docker network inspect npm
コンテナ名
を使用して相互にアクセスできます。たとえば、alist
という名前のコンテナがネットワークに参加している場合、npm
コンテナ内でping alist
を使用してアクセスできます。npm
のhostname/IP
フィールドにもコンテナ名
を使用できます。
- ネットワークを作成する:
docker-compose.yml
でネットワークを構成する
例:npm
のdocker-compose.yml
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
networks:
- npm
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
npm:
driver: bridge
alist
のdocker-compose.yml
version: '3.3'
services:
alist:
restart: always
volumes:
- '.data/alist:/opt/alist/data'
networks:
- npm
ports:
- '5244:5244'
environment:
- PUID=0
- PGID=0
- UMASK=022
container_name: alist
image: 'xhofe/alist-aria2:latest'
networks:
npm:
driver: bridge
もしnpm
ネットワークが他の方法で既に作成されている場合、外部リンクの形式で使用できます。
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
networks:
- npm
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
npm:
external: true
Docker Compose のlink
モード#
あまり使用していませんので、公式ドキュメントを参照してください。
お楽しみください!#
Docker は素晴らしいです。使いこなせば問題ありません。
参考:[Docker ネットワーク公式ドキュメント](Networking in Compose | Docker Docs)