Docker コンテナから Localhost サービスにアクセスする
ホスト マシン上の MySQL インスタンスに接続する必要があるときに Docker コンテナ内で Nginx を実行することは、特に MySQL がローカルホストにのみバインドされている場合には困難になる可能性があります。この設定により、コンテナが標準のネットワーク方法を使用して MySQL サービスに直接アクセスできなくなります。
この記事では、このギャップを埋めるためのさまざまなソリューションを検討し、Docker コンテナーとホストのローカルホストで実行されているサービス間のシームレスな接続を可能にします。一般的な方法では不十分な理由について説明し、目的の接続を実現するための実践的な手順を示します。
指示 | 説明 |
---|---|
docker network create --driver bridge hostnetwork | ブリッジ ドライバーを使用してカスタム Docker ネットワークを作成し、コンテナーが同じネットワーク内で通信できるようにします。 |
host_ip=$(ip -4 addr show docker0 | grep -oP '(? | コンテナからホスト サービスに接続するために使用されるホストの docker0 インターフェイスの IP アドレスを抽出します。 |
docker exec -it nginx-container bash | 実行中の Nginx コンテナ内でインタラクティブな bash シェルを実行し、コマンドラインから直接アクセスします。 |
mysql -h $host_ip -u root -p | 抽出された IP アドレスを使用してホスト マシン上で実行されている MySQL サーバーに接続するために Nginx コンテナ内で使用されるコマンド。 |
networks: hostnetwork: external: true | 外部で作成された Docker ネットワークを使用するための Docker Compose の構成。 |
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" >echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf | MySQL リクエストをホスト マシンにプロキシするための新しい Nginx 構成を書き込みます。 |
nginx -s reload | Nginx サービスをリロードして、新しい構成の変更を適用します。 |
ホスト サービスにアクセスするための Docker と Nginx の構成
Nginx コンテナをホスト上で実行されている MySQL インスタンスに接続するには、まずネットワーク ブリッジを確立する必要があります。コマンド docker network create --driver bridge hostnetwork このカスタム ネットワークを作成し、同じネットワーク上のコンテナ間の通信を可能にします。次に、次を使用して、このネットワーク上で MySQL コンテナと Nginx コンテナを起動します。 docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest そして docker run --name nginx-container --network hostnetwork -d nginx:latest、 それぞれ。この設定により、コンテナーが相互に検出して通信できるようになります。 Nginx から MySQL に接続するには、ホストの IP アドレスが必要です。これは次のコマンドで取得できます。 host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')。このコマンドは、ホスト上の docker0 インターフェイスの IP アドレスを取得します。
次に使用するのは、 docker exec -it nginx-container bash Nginx コンテナで対話型シェルを開きます。ここから、次を使用して MySQL 接続を開始できます。 mysql -h $host_ip -u root -p、 どこ $host_ip ホストの IP アドレスです。あるいは、Docker Compose を使用すると、YAML ファイルでサービスとネットワークを定義することでプロセスが簡素化されます。の networks: hostnetwork: external: true 構成により、サービスが外部で作成されたネットワークを使用するようになります。最後に、MySQL リクエストをプロキシするように Nginx を設定するには、その設定ファイルを次のように更新します。 echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf そして、次を使用してNginxをリロードします nginx -s reload。この設定により、Nginx はホスト上で実行されている MySQL インスタンスにリクエストを転送できるようになります。
ネットワークブリッジ経由でDockerコンテナをホストのMySQLに接続する
Docker ネットワーク設定用のシェル スクリプト
# Create a Docker network
docker network create --driver bridge hostnetwork
# Run MySQL container with the created network
docker run --name mysql-container --network hostnetwork -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# Run Nginx container with the created network
docker run --name nginx-container --network hostnetwork -d nginx:latest
# Get the host machine's IP address
host_ip=$(ip -4 addr show docker0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
# Connect to MySQL from within the Nginx container
docker exec -it nginx-container bash
mysql -h $host_ip -u root -p
Docker Compose を使用して Nginx とホストの MySQL をリンクする
Docker Compose YAML 構成
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: nginx-container
networks:
- hostnetwork
mysql:
image: mysql:latest
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- hostnetwork
networks:
hostnetwork:
external: true
Docker ネットワークを使用してホスト MySQL に接続するための Nginx の構成
Nginx 構成と Docker ネットワーク コマンド
# Create a bridge network
docker network create bridge-network
# Run Nginx container with bridge network
docker run --name nginx-container --network bridge-network -d nginx:latest
# Run MySQL container on the host network
docker run --name mysql-container --network host -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
# Update Nginx configuration to point to MySQL host
docker exec -it nginx-container bash
echo "server { listen 80; location / { proxy_pass http://host.docker.internal:3306; } }" > /etc/nginx/conf.d/default.conf
nginx -s reload
Docker コンテナをホスト ローカル サービスに接続する
Docker コンテナでアプリケーションを実行する場合、ネットワークの分離により、ホストのローカルホストにバインドされたサービスにアクセスするのが困難になる場合があります。効果的なアプローチの 1 つは、Docker のホスト ネットワーキング モードを使用することです。でコンテナを起動することで、 --network host オプションを使用すると、コンテナーはホストのネットワーク スタックを共有し、ローカルホストにバインドされたサービスに直接アクセスできるようになります。ただし、このモードは移植性が低く、Docker Swarm や Kubernetes などのすべての環境でうまく機能しない可能性があります。
もう 1 つのアプローチは、Docker の組み込み DNS リゾルバーを使用することです。 host.docker.internal。この特別な DNS 名はホストの IP アドレスに解決され、コンテナーがホスト上のサービスと通信できるようになります。この方法は簡単で、ネットワーク管理の複雑さを回避できます。ただし、これは Windows および Mac の Docker でのみ利用可能であり、Linux では利用できません。 Linux ユーザーの場合、カスタム ブリッジ ネットワークを作成し、ルーティング ルールを手動で構成することが実行可能な解決策です。これには、 ip そして iptables コンテナ ネットワークからホストのローカルホスト インターフェイスにトラフィックをルーティングするコマンド。
Docker コンテナのホスト サービスへの接続に関するよくある質問
- どうやって使うのですか --network host Dockerのオプション?
- コンテナを実行するには docker run --network host ホストのネットワークスタックを共有します。
- とは host.docker.internal?
- これはホストの IP アドレスに解決される特別な DNS 名で、Windows および Mac の Docker で利用できます。
- 使ってもいいですか host.docker.internal Linuxでは?
- いいえ、この機能は Docker for Linux では使用できません。
- カスタム ブリッジ ネットワークを作成するにはどうすればよいですか?
- 使用 docker network create --driver bridge my-bridge-network カスタムブリッジネットワークを作成します。
- の目的は何ですか iptables 指示?
- Linux システム上のネットワーク パケット フィルタリングとルーティング ルールを管理します。
- Docker コンテナからホスト上の MySQL インスタンスに接続するにはどうすればよいですか?
- 使用 mysql -h host.docker.internal -u root -p Windows/Mac 上の Docker の場合は、Linux のルーティングを設定します。
- 使用上の制限は何ですか --network host?
- 移植性が低下する可能性があり、Kubernetes などの一部のオーケストレーターとは互換性がありません。
- MySQL 以外のホスト上の他のサービスにアクセスできますか?
- はい、同じ方法を使用して、ホスト上で実行されている任意のサービスに接続できます。
Docker からホスト サービスにアクセスする場合の最終的な考え方
Nginx コンテナからホスト上の MySQL インスタンスに接続するにはさまざまな方法が必要ですが、それぞれに独自の利点と制限があります。ホスト ネットワーク、特別な DNS 名、またはカスタム ネットワーク ブリッジを使用すると、効果的にギャップを埋めることができ、Docker コンテナとホスト サービス間のスムーズな通信を確保できます。これらの戦略を理解して実装することで、ネットワーク分離の課題を克服し、Docker 化された環境で堅牢な接続を維持できます。