docker-compose로 시작된 실행중인 컨테이너에 연결할 수 없습니다.


99

Docker 컨테이너를 사용하여 로컬 개발 환경을 설정하고 있습니다. 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

오류없이 시작됩니다. Docker는 실행중인 컨테이너 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 

같은 오류입니다.

그렇다면 docker-compose로 시작된 실행중인 컨테이너에 어떻게 연결할 수 있습니까?

답변:


196

좋아, 그것에 대한 답을 찾았습니다. 다른 사람이 같은 문제를 겪을 경우에는

docker network ls

이 명령은 모든 Docker 네트워크를 나열합니다. docker-compose는 docker-compose up을 실행할 때 새 네트워크를 만듭니다. 제 경우에는 네트워크 이름이 myapp_default로 지정됩니다.

참고 : 앱의 네트워크에는 '프로젝트 이름'을 기반으로 이름이 지정되며, 이는 위치하는 디렉토리의 이름을 기반으로합니다. --project-name 플래그 또는 COMPOSE_PROJECT_NAME 환경 변수를 사용하여 프로젝트 이름을 재정의 할 수 있습니다. . Compose의 네트워킹

따라서 이러한 컨테이너에 연결하는 올바른 방법은

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

9
눈치 채지 못한 사람들을 --net위해 명령 앞에 넣어야합니다 . 공식 redis 도커 이미지를 실행하려고 할 때이 문제가 발생했습니다.
mistertee

3
--net 대신 --network 플래그를 사용해야했습니다. 실행 명령을 시작할 때 사용하십시오. 이게 도움이 되길 바란다. 참조는 docs.docker.com/engine/reference/run/#network-settings에서 확인할 수 있습니다 .
Erizo


2

서비스 정의 버전 2 이상을 docker-compose사용하는 경우 사용자 정의 네트워크를 생성합니다. 사용자 정의 네트워크의 이름 확인은 Docker 내장 DNS 서버를 통해 작동합니다. 다음은 문서 의 관련 인용문입니다 .

Docker 내장 DNS 서버는 주어진 [사용자 정의] 네트워크에 연결된 컨테이너의 이름 확인을 활성화합니다. 이는 연결된 컨테이너가 컨테이너 이름으로 동일한 네트워크의 다른 컨테이너를 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.