Không thể liên kết đến một vùng chứa đang chạy được khởi động bởi docker-comp


99

Tôi đang thiết lập môi trường phát triển cục bộ của mình với các bộ chứa docker. Docker-compos.yml giống như sau

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

Nó bắt đầu mà không có lỗi. Và docker liệt kê 3 vùng chứa đang chạy

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

Tuy nhiên, khi tôi cố gắng liên kết đến các vùng chứa đang chạy đó từ một vùng chứa khác

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

Tôi gặp lỗi

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

Tôi cũng đã thử

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

Cùng một lỗi.

Vậy làm cách nào để tôi có thể liên kết đến một vùng chứa đang chạy được khởi động bởi docker-compos?

Câu trả lời:


196

Ok, đã tìm thấy câu trả lời cho nó. Trong trường hợp bất kỳ ai khác gặp phải vấn đề tương tự, chỉ cần làm

docker network ls

Lệnh này liệt kê tất cả các mạng docker. docker-comp sẽ tạo một mạng mới khi bạn chạy docker-compost. Trong trường hợp của tôi, mạng được đặt tên là myapp_default.

Lưu ý: Mạng ứng dụng của bạn được đặt tên dựa trên "tên dự án", dựa trên tên của thư mục mà nó nằm trong đó. Bạn có thể ghi đè tên dự án bằng cờ --project-name hoặc biến môi trường COMPOSE_PROJECT_NAME . Kết nối mạng trong Soạn thư

Vì vậy, cách chính xác để liên kết đến các vùng chứa đó là

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

9
Đối với những người không nhận thấy, bạn phải đặt --nettrước lệnh. Tôi đã gặp sự cố này khi cố gắng chạy hình ảnh docker redis chính thức.
mistertee

3
Tôi đã phải sử dụng cờ --network, thay vì --net. Sử dụng nó khi bắt đầu lệnh chạy. Tôi hi vọng cái này giúp được. Tham khảo có sẵn tại đây: docs.docker.com/engine/reference/run/#network-settings .
Erizo


2

Khi bạn sử dụng phiên bản định nghĩa dịch vụ 2 trở lên, hãy docker-composetạo mạng do người dùng xác định. Độ phân giải tên trong mạng do người dùng xác định hoạt động thông qua máy chủ DNS nhúng Docker. Đây là trích dẫn liên quan từ tài liệu :

Máy chủ DNS nhúng Docker cho phép phân giải tên cho các vùng chứa được kết nối với mạng [do người dùng xác định] nhất định. Điều này có nghĩa là bất kỳ vùng chứa nào được kết nối đều có thể ping một vùng chứa khác trên cùng một mạng bằng tên vùng chứa của nó.

Các vùng chứa cũng có sẵn bởi các bí danh mạng docker-composetạo ra. Nó có thể được xác minh bằng lệnh như:

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

Nó in ["db","$CONTAINER_ID"].

Cung cấp liên kết với --linksẽ không có bất kỳ ảnh hưởng nào trong trường hợp mạng do người dùng xác định hiện có. Bạn có thể chắc chắn và nhìn vào /etc/hosts, sẽ không có các dòng tương ứng.

Do đó, lệnh sau là đủ:

docker run -it --net myapp_default worker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.