Docker-compose tarafından başlatılan çalışan bir kapsayıcıya bağlanılamaz


100

Yerel geliştirme ortamımı docker container'larla kuruyorum. Docker-compose.yml aşağıdaki gibidir

version: '2'

services:
  db:
    image: mongo:3
  mq:
    image: rabbitmq:3
  api:
    build: .
    image: my_app/api
    ports:
      - "3000:3000"
    links:
      - db
      - mq
    environment:
      - NODE_ENV=development

Hatasız başlar. Docker, çalışan 3 kapsayıcıyı listeler

docker-compose up -d
docker ps

e90e5a8b5d33        my_app/api    "/usr/local/bin/node "   0.0.0.0:3000->3000/tcp               my_app_api_1
42bfcd971b16        mongo:3       "/entrypoint.sh mongo"   27017/tcp                            my_app_db_1
a0685a816c47        rabbitmq:3    "/docker-entrypoint.s"   4369/tcp, 5671-5672/tcp, 25672/tcp   my_app_mq_1

Ancak, başka bir konteynerden çalışan kapsayıcılara bağlanmaya çalıştığımda

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it worker 

Hata alıyorum

 docker: Error response from daemon: Cannot link to /my_app_mq_1, as it does not belong to the default network.

Ben de denedim

 docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net default worker 

Aynı hata.

Peki docker-compose tarafından başlatılan çalışan bir kapsayıcıya nasıl bağlanabilirim?

Yanıtlar:


197

Tamam, cevabını buldum. Başka birinin aynı problemle karşılaşması durumunda, sadece

docker network ls

Bu komut, tüm docker ağlarını listeler. docker-compose, docker-compose up'ı çalıştırdığınızda yeni bir ağ oluşturur. Benim durumumda, ağ myapp_default olarak adlandırılır.

Not: Uygulamanızın ağına, içinde yaşadığı dizinin adını temel alan "proje adı" temelinde bir ad verilir. Proje adını --project-name bayrağı veya COMPOSE_PROJECT_NAME ortam değişkeniyle geçersiz kılabilirsiniz. . Oluşturmada Ağ İletişimi

Dolayısıyla, bu kapsayıcılara bağlanmanın doğru yolu

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 

9
Fark etmeyenler --netiçin komutun önüne koymalısınız . Resmi redis docker görüntüsünü çalıştırmaya çalışırken bu sorunla karşılaştım.
bay

3
--Net yerine --network bayrağını kullanmak zorunda kaldım. Çalıştır komutunun başlangıcında kullanın. Umarım bu yardımcı olur. Referans burada mevcuttur: docs.docker.com/engine/reference/run/#network-settings .
Erizo


2

Hizmet tanımı sürüm 2 ve daha fazlasını kullandığınızda, docker-composekullanıcı tanımlı ağ oluşturur. Kullanıcı tanımlı bir ağda ad çözümlemesi, Docker gömülü DNS sunucusu aracılığıyla çalışır. İşte belgelerden ilgili alıntı :

Docker gömülü DNS sunucusu, belirli bir [kullanıcı tanımlı] ağa bağlı kapsayıcılar için ad çözümlemeyi etkinleştirir. Bu, bağlı herhangi bir konteynerin aynı ağdaki başka bir konteynere konteyner adıyla ping atabileceği anlamına gelir.

Kapsayıcılar, docker-composeoluşturan ağ takma adları tarafından da kullanılabilir . Aşağıdaki gibi komutlarla doğrulanabilir:

docker inspect \
  -f '{{json .NetworkSettings.Networks.myapp_default.Aliases}}' my_app_db_1

Yazdırır ["db","$CONTAINER_ID"].

--linkMevcut kullanıcı tanımlı ağ durumunda bağlantıların sağlanması herhangi bir etkiye sahip olmayacaktır. İlgili /etc/hostssatırlara sahip olmayacağından emin olabilir ve bakabilirsiniz .

Bu nedenle aşağıdaki komut yeterlidir:

docker run -it --net myapp_default worker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.