各コンテナには独自のローカルホストがあります
各サービスは独自のコンテナで実行されます。 Ubuntuコンテナの観点からは、redisはローカルホストでリッスンしていません。
Dockerネットワークを使用する
コンテナーが通信できるようにするには、コンテナーが同じDockerネットワーク上にある必要があります。これは3つのステップで構成されています:
- Dockerネットワークを作成する
- コンテナに名前を付けます
- 作成したネットワークにコンテナを接続します
これにより、コンテナは、ホスト名であるかのように名前を使用して相互に通信できます。
この猫の皮を剥ぐ方法は複数あります...この回答では2つを見ていきますが、私がよく知らない方法が他にもいくつかあると思います(たとえば、KubernetesやSwarmを使用するなど)。
手作業で行う
docker network
を使用して、このアプリケーションのネットワークを作成できます コマンド。
# Show the current list of networks
docker network ls
# Create a network for your app
docker network create my_redis_app
redisコンテナを実行するときは、名前があり、このネットワーク上にあることを確認してください。必要に応じて、ポートを外部に(macOSに)公開できます(-p
を使用) )、ただし、他のコンテナがredisと通信するためだけに必要なわけではありません。
docker run -d -p 6379:6379 --name redis_server --network my_redis_app <IMAGE ID>
次に、Ubuntuコンテナを実行します。必要に応じて名前を付けることもできますが、この例ではサービスが実行されていないため、この例では気にしません。
docker run -it --network my_redis_app ubuntu bash
これで、Ubuntuコンテナー内から、redis_server
という名前を使用してredisにアクセスできるようになります。 、DNS名であるかのように。
作成を使用して行う
YAMLファイル(IMO)に書き込む方が簡単なため、Composeを使用してこのようなセットアップを構築する傾向があります。上記の例をdocker-compose.yml形式で書き直しました:
version: '2'
services:
redis:
image: <IMAGE ID>
networks:
- my_redis_app
ports: 6379:6379
ubuntu:
image: ubuntu:latest
networks:
- my_redis_app
networks:
my_redis_app:
driver: bridge
これが適切な場所にあると、docker-compose up -d redis
を実行できます。 特定のDockerネットワークを使用してredisサービスをオンラインにします。まだ存在しない場合は、Composeがネットワークを作成します。
Ubuntuコンテナをそのように実行することはあまり意味がありません...もちろんインタラクティブです。ただし、redisを実行したら、ある種のアプリケーションコンテナを追加し、おそらくnginxのようなWebプロキシを追加することを想定しています...他のコンテナをservices
に配置するだけです。 同様に、それらをすべて一緒に管理できます。
ubuntu
以降 インタラクティブであるため、インタラクティブに実行できます:
# without -d, container is run interactively
docker-compose run ubuntu bash
そして今Ubuntuでは、その名前を使用してredisに接続できるはずです。この例では単にredis
。