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

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

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

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

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

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

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

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



답변

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.


답변

이 답변은 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가 “준비”될 때까지 기다리지 않으며 시작될 때까지만 대기합니다. 서비스가 준비 될 때까지 기다려야하는 경우이 문제에 대한 자세한 내용 및 해결 전략은 시작 순서 제어를 참조하십시오.


답변

[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


답변