ไม่สามารถเชื่อมโยงไปยังคอนเทนเนอร์ที่กำลังทำงานซึ่งเริ่มต้นโดยนักเทียบท่าเขียน


103

ฉันกำลังตั้งค่าสภาพแวดล้อมการพัฒนาท้องถิ่นของฉันด้วยคอนเทนเนอร์นักเทียบท่า docker-compose.yml ดังต่อไปนี้

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

เริ่มต้นโดยไม่มีข้อผิดพลาด และนักเทียบท่าแสดง 3 คอนเทนเนอร์ที่กำลังทำงานอยู่

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

อย่างไรก็ตามเมื่อฉันพยายามเชื่อมโยงไปยังคอนเทนเนอร์ที่กำลังทำงานอยู่จากคอนเทนเนอร์อื่น

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

ฉันได้รับข้อผิดพลาด

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

ฉันยังได้ลอง

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

ข้อผิดพลาดเดียวกัน

ฉันจะเชื่อมโยงไปยังคอนเทนเนอร์ที่กำลังทำงานโดยเริ่มจากนักเทียบท่าได้อย่างไร

คำตอบ:


202

โอเคพบคำตอบแล้ว เผื่อว่าใครเจอปัญหาเดียวกันให้ทำ

docker network ls

คำสั่งนี้แสดงรายการเครือข่ายนักเทียบท่าทั้งหมด นักเทียบท่าเขียนจะสร้างเครือข่ายใหม่เมื่อคุณเรียกใช้นักเทียบท่าเขียนขึ้น ในกรณีของฉันเครือข่ายตั้งชื่อเป็น myapp_default

หมายเหตุ: เครือข่ายของแอปของคุณตั้งชื่อตาม“ ชื่อโปรเจ็กต์” ซึ่งอิงตามชื่อของไดเร็กทอรีที่อยู่คุณสามารถแทนที่ชื่อโปรเจ็กต์ด้วยแฟล็ก - ชื่อโปรเจ็กต์หรือตัวแปรสภาพแวดล้อม COMPOSE_PROJECT_NAME . เครือข่ายในการเขียน

ดังนั้นวิธีที่ถูกต้องในการเชื่อมโยงไปยังคอนเทนเนอร์เหล่านั้นคือ

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

9
สำหรับผู้ที่ไม่สังเกตเห็นคุณต้องใส่--netคำสั่งก่อน ฉันพบปัญหานี้เมื่อพยายามเรียกใช้อิมเมจนักเทียบท่า redis อย่างเป็นทางการ
mistertee

3
ฉันต้องใช้แฟล็ก --network แทน - net ใช้เมื่อเริ่มต้นคำสั่ง run ฉันหวังว่านี่จะช่วยได้. อ้างอิงสามารถใช้ได้ที่นี่: docs.docker.com/engine/reference/run/#network-settings
Erizo


2

เมื่อคุณใช้เซอร์วิสนิยามเวอร์ชัน 2 ขึ้นไปdocker-composeสร้างเครือข่ายที่ผู้ใช้กำหนดเอง การแก้ปัญหาชื่อในเครือข่ายที่ผู้ใช้กำหนดจะทำงานผ่านเซิร์ฟเวอร์ DNS ในตัวของ Docker นี่คือคำพูดที่เกี่ยวข้องจากเอกสาร :

เซิร์ฟเวอร์ DNS แบบฝังตัวของ Docker เปิดใช้งานการแก้ปัญหาชื่อสำหรับคอนเทนเนอร์ที่เชื่อมต่อกับเครือข่าย [ผู้ใช้กำหนดเอง] ที่กำหนด ซึ่งหมายความว่าคอนเทนเนอร์ที่เชื่อมต่อใด ๆ สามารถ ping คอนเทนเนอร์อื่นบนเครือข่ายเดียวกันโดยใช้ชื่อคอนเทนเนอร์

นอกจากนี้ยังมีคอนเทนเนอร์โดยนามแฝงเครือข่ายที่docker-composeสร้าง สามารถตรวจสอบได้โดยคำสั่งเช่น:

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

["db","$CONTAINER_ID"]มันพิมพ์

การให้ลิงก์--linkจะไม่มีผลใด ๆ ในกรณีที่มีเครือข่ายที่ผู้ใช้กำหนดเองที่มีอยู่ คุณสามารถตรวจสอบและดูได้/etc/hostsซึ่งจะไม่มีบรรทัดที่ตรงกัน

ดังนั้นคำสั่งต่อไปนี้จึงเพียงพอ:

docker run -it --net myapp_default worker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.