Tidak dapat menautkan ke penampung yang sedang berjalan yang dimulai oleh docker-compose

99

Saya menyiapkan lingkungan pengembangan lokal saya dengan kontainer buruh pelabuhan. Docker-compose.yml seperti berikut

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

Ini dimulai tanpa kesalahan. Dan buruh pelabuhan mencantumkan 3 kontainer yang sedang berjalan

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

Namun ketika saya mencoba untuk menautkan ke container yang sedang berjalan dari container lain

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

Saya mendapatkan kesalahan

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

Saya juga sudah mencoba

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

Kesalahan yang sama.

Jadi bagaimana saya bisa menautkan ke container yang sedang berjalan yang dimulai dengan docker-compose?

Kebangkitan Byte
sumber

Jawaban:

196

Oke, temukan jawabannya. Jika ada orang lain yang menemukan masalah yang sama, lakukan saja

docker network ls

Perintah ini mencantumkan semua jaringan buruh pelabuhan. docker-compose akan membuat jaringan baru saat Anda menjalankan docker-compose. Dalam kasus saya, jaringan tersebut dinamai sebagai myapp_default.

Catatan: Jaringan aplikasi Anda diberi nama berdasarkan "nama proyek", yang didasarkan pada nama direktori tempatnya berada. Anda dapat mengganti nama proyek dengan tanda --project-name atau variabel lingkungan COMPOSE_PROJECT_NAME . Jaringan di Compose

Jadi cara yang benar untuk menautkan ke penampung tersebut adalah

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Kebangkitan Byte
sumber
9
Bagi mereka yang tidak memperhatikan Anda harus meletakkan --netsebelum perintah. Saya mengalami masalah ini saat mencoba menjalankan gambar buruh pelabuhan redis resmi.
simpanan
3
Saya harus menggunakan flag --network, bukan --net. Gunakan di awal perintah jalankan. Saya harap ini membantu. Referensi tersedia di sini: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

perintah saya untuk menjalankan tautan

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
Gabriel Borges Oliveira
sumber
2

Saat Anda menggunakan definisi layanan versi 2 dan lebih banyak, docker-composemembuat jaringan yang ditentukan pengguna. Resolusi nama dalam jaringan yang ditentukan pengguna bekerja melalui server DNS tertanam Docker. Berikut kutipan terkait dari dokumentasi :

Server DNS tertanam Docker memungkinkan resolusi nama untuk kontainer yang terhubung ke jaringan [yang ditentukan pengguna] tertentu. Ini berarti bahwa penampung yang terhubung dapat melakukan ping ke penampung lain di jaringan yang sama menggunakan nama penampungnya.

Penampung juga tersedia oleh alias jaringan yang docker-composemembuat. Itu dapat diverifikasi dengan perintah seperti:

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

Ini mencetak ["db","$CONTAINER_ID"].

Menyediakan tautan dengan --linktidak akan berpengaruh apa pun jika ada jaringan yang ditentukan pengguna. Anda dapat memastikan dan melihat /etc/hosts, yang tidak akan memiliki garis yang sesuai.

Dengan demikian perintah berikut sudah cukup:

docker run -it --net myapp_default worker
saaj
sumber