すべての問題の根源は、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)