docker_compose.yml에서 링크와 depend_on의 차이점


292

Docker Compose의 작성 파일 문서 에 따르면 :

  • depends_on -서비스 간의 의존성을 표현합니다.
  • links-다른 서비스의 컨테이너에 연결하고 depend_on 과 같은 방식으로 서비스 간의 종속성표현 합니다.

다른 컨테이너에 연결하는 목적을 이해하지 못하므로 두 옵션의 차이점은 여전히 ​​어려워 보입니다.

예가 있으면 훨씬 쉬울 것이지만 찾을 수는 없습니다.

컨테이너 B를 컨테이너 A와 연결하면 컨테이너 B가 컨테이너 A의 셸 내부에서 "핑 가능"하다는 것을 알았습니다.

ping B컨테이너 A 내부에서 실행 bash하여 다음과 같은 결과를 얻었습니다 (인터넷의 이미지 참조).

여기에 이미지 설명을 입력하십시오


6
--link플래그는 이제 Docker의 더 이상 사용되지 않는 레거시 기능이며 설명서에는 "결국 제거 될 수 있습니다"라는 Docker : 레거시 컨테이너 링크가 나와 있습니다 . Docker 네트워크 기능 또는 docker compose 방법 을 사용하지 않는 것이 좋습니다 . 나는 이것이이 기능에 대해 배우는 사람에게 도움이 될 것이라고 생각했습니다.
스타

답변:


122

links옵션이 더 이상 사용되지 않으면 게시물을 업데이트해야합니다 .

기본적으로 links환경 변수를 추가하여 다른 컨테이너가 컨테이너에 접근 할 수있게하는 기본 목적이에 포함되어 있기 때문에 더 이상 필요하지 않습니다 network. 컨테이너가 동일한 네트워크에 배치되면 컨테이너 이름과 다른 별명을 호스트로 사용하여 서로 연결할 수 있습니다.

를 들어 docker run, --link도되지 않으며 사용자 정의 네트워크에 의해 교체해야합니다.

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_on시작 순서 (및 암시 적으로 이미지 당기기 순서)를 나타내며 이는 부작용입니다 links.


13
일반적인 StackOverflow, 실제로 가장 좋은 1 점 답변을 찾으려면 147 및 43 점 아래로 스크롤 해야하는 이유는 무엇입니까?
u8it

3
@ u8it 시간과 인터넷의 본질입니다.
Michael Cole

docker-compose에서 동일한 작업을 수행하는 방법은 무엇입니까? 도커 작성을 사용하면 모든 서비스가 이미 동일한 네트워크에 있으며 아무것도 추가 할 필요가 없다고 생각합니다. 컨테이너 중 하나가 준비 상태가 아닌 컨테이너에 연결하려고하면 컨테이너 간 연결이 작동하지 않습니다.
makkasi

docker-compose 버전 3 문서 docs.docker.com/compose/compose-file/#links 에서 더 이상 사용되지 않는 링크에 대한 정보를 볼 수 없습니다 . 우리는 네트워크와 depend_on을 공유했기 때문에 옵션이 너무 유용하지는 않지만 문서를 올바르게 읽으면 더 이상 사용되지 않습니다 (도커 컨테이너의 --link 플래그 만 언급).
rideronthestorm

참고 : 동일한 네트워크의 컨테이너 (실제로 서비스)는 컨테이너 이름이 아닌 서비스 이름으로 액세스 할 수 있습니다. 공식 문서 : docs.docker.com/compose/networking/#links
GarryOne

194

이 답변은 docker-compose 버전 2에 대한 것이며 버전 3 에서도 작동합니다.

depend_on을 사용하면 여전히 데이터에 액세스 할 수 있습니다.

docker docs Docker Compose 및 Django 를 보면 여전히 다음과 같이 데이터베이스에 액세스 할 수 있습니다.

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

링크와 depend_on의 차이점은 무엇입니까?

연결:

데이터베이스의 컨테이너를 만들 때 예를 들면 다음과 같습니다.

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

그리고 당신은 찾을 수 있습니다

"HostPort": "32777"

즉, 로컬 호스트 포트 32777 (컨테이너의 3306)에서 데이터베이스를 연결할 수 있지만이 포트는 컨테이너를 다시 시작하거나 제거 할 때마다 변경됩니다. 따라서 링크를 사용하여 항상 데이터베이스에 연결하고 어떤 포트인지 알 필요가 없습니다.

web:
  links:
   - db

depend_on :

Giorgio Ferraris Docker-compose.yml 에서 멋진 블로그를 찾았습니다 .V1에서 V2까지

docker-compose가 V2 파일을 실행하면 파일에 정의 된 모든 컨테이너간에 네트워크를 자동으로 구축하며 모든 컨테이너는 docker-compose.yml 파일에 정의 된 이름을 사용하여 다른 컨테이너를 즉시 참조 할 수 있습니다.

따라서 더 이상 링크가 필요하지 않습니다. 링크는 DB 컨테이너와 웹 서버 컨테이너 사이의 네트워크 통신을 시작하는 데 사용되었지만 이미 docker-compose에 의해 수행됩니다.

최신 정보

depend_on

서비스 간 특급 의존성 :

  • docker-compose up종속성 순서대로 서비스를 시작합니다. 다음 예에서 db 및 redis는 웹보다 먼저 시작됩니다.
  • docker-compose up SERVICESERVICE의 종속성이 자동으로 포함됩니다. 다음 예제에서 docker-compose up 웹은 db 및 redis를 생성하고 시작합니다.

간단한 예 :

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

참고 : depend_on은 웹을 시작하기 전에 db 및 redis가 "준비"될 때까지 기다리지 않으며 시작될 때까지만 대기합니다. 서비스가 준비 될 때까지 기다려야하는 경우이 문제에 대한 자세한 내용 및 해결 전략은 시작 순서 제어를 참조하십시오.


답이 파일 v1 작성 용임을 명확히하기 위해 내 대답을 업데이트했습니다.
Xiongbing Jin

1
이것은 여전히 ​​버전 3에 유효합니까?
fabiomaia

네, 살펴볼 수 있습니다https://docs.docker.com/compose/compose-file/compose-versioning/
Windsooon

"이것은 로컬 호스트 포트 32777 (컨테이너의 3306)에서 데이터베이스를 연결할 수 있음을 의미하지만 docker-compose-file에서 포트 바인딩을 지정하지 않으면 컨테이너를 다시 시작하거나 제거 할 때마다이 포트가 변경됩니다" . 그리고이 질문은 docker-compose에 관한 것이므로 docker run여기에 있는 예제 는 완전히 관련이 없다고 생각합니다. 그렇게 컨테이너가 어떻게 실행되는지는 아닙니다. 내가 무엇을 놓치고 있습니까?
앤드류 Savinykh

예, 포트를 지정하면 맞습니다. 내 docker run 예제는 포트 번호를 하드 코딩하는 대신 depend_on 또는 링크를 사용해야하는 이유를 지적하고 싶습니다. 포트 번호를 지정하지 않으면 매번 변경되기 때문입니다. 나는 이것이 사람들이 depend_on 또는 링크에 대해 더 많이 이해할 수 있다고 생각합니다.
Windsooon

50

[2016 년 9 월 업데이트] :이 답변은 docker compose 파일 v1 (아래의 샘플 작성 파일에 표시)에 대한 것입니다. v2의 경우 @Windsooon의 다른 답변을 참조하십시오.

[원래 답변] :

문서에서 매우 분명합니다. depends_on컨테이너 생성의 의존성과 순서를 결정하고 links이것들뿐만 아니라

링크 된 서비스의 컨테이너는 별명과 동일한 호스트 이름 또는 별명이 지정되지 않은 경우 서비스 이름으로 도달 할 수 있습니다.

예를 들어 다음 docker-compose.yml파일을 가정 합니다.

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

를 사용 하면 포트 5432가 이미지에 노출되어 있다고 가정 하고 links내부 코드 web가를 사용하여 데이터베이스에 액세스 할 수 있습니다 . 사용 된 경우 에는 불가능하지만 컨테이너의 시작 순서는 정확합니다.db:5432dbdepends_on


예를 들어 주시겠습니까? 그 부분은 내가 아직도 확실하지 않은 부분이기 때문입니다. 더 구체적으로 만들 수있는 다른 작성 파일 옵션이있을 수 있습니다. 추가 세부 사항을 제공하십시오. 감사!
itsjef

대단히 감사합니다! 알았어 마지막 질문입니다. 그래서 내 특별한 경우에는 레일 응용 프로그램을 배포하고 있습니다. 사용해야합니까 links, depends_on아니면 둘 중 하나입니까? 현재 docker-compose.yml사용 depends_on하고있는 것이 잘 작동하는 것 같습니다. :)
itsjef

당신이 직접을 통해 다른 컨테이너에 액세스 할 필요가없는 경우 name:port다음 depends_onOK입니다.
Xiongbing Jin

9
이름 : 포트는 노출을 사용할 때 연결하지 않아도 작동합니다.
Amit Goldstein

7
"depends_on이 사용 된 경우에는 불가능하지만 컨테이너의 시작 순서는 정확합니다." 이것은 정확하지 않습니다. depend_on을 사용하면 작동합니다. 여전히 사용중인 데이터베이스 호스트 이름 db에서에 액세스 할 수 있습니다 web.
prog. Dusan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.