[docker] docker-compose로 시작된 실행중인 컨테이너에 연결할 수 없습니다.
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로 시작된 실행중인 컨테이너에 어떻게 연결할 수 있습니까?
답변
좋아, 그것에 대한 답을 찾았습니다. 다른 사람이 같은 문제를 겪을 경우에는
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
답변
링크 실행 명령
docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
답변
서비스 정의 버전 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