2014-02-24 7 views
19

지금까지 Mesos, Marathon 및 Docker를 사용하여 서버 및 컨테이너를 관리하는 데 큰 성공을 거두었습니다. 그러나 조금 더 나아가서 haproxy 컨테이너를 시작하는 각 메인 도커 서비스에 자동으로 연결하거나 단일 부모 컨테이너에서만 링크되고 사용할 수있는 다른 데몬 기반 서비스와 컨테이너 서비스를 제공하는 것과 같은 일을 시작하고 싶습니다.Mesos/Marathon이있는 연결된 도커 컨테이너

일반적으로 헬퍼 서비스를 먼저 시작한 다음 실제 서비스를 시작할 때 헬퍼에 연결하면 모든 것이 정상적으로 작동합니다. 이 모델은 마라톤과 메소스에 어떻게 들어 맞습니까? 이제 적어도 컨테이너 작업은 단일 컨테이너로 간주됩니다.

나는 호스트가 발견 할 수있는 호스트에서 헬퍼 서비스를 먼저 시작한 다음 호스트 이름 = 헬퍼 서비스의 호스트 이름 인 제약 조건을 실제 서비스에 추가했지만 리소스 제공과 관련된 문제가있는 것으로 보입니다 해당 리소스에 대한 경쟁 조건이 포함됩니다.

도커에 "딥 (embed)"또는 "딥 링크"기능을 제공하거나 도커 컨테이너를 시작하는 실행 프로그램 스크립트를 제공 할 생각입니다.

나는이 길을 찾아 가기 전에 다른 누군가가이 문제를 해결했는지, 아니면 내가 끔찍한 일로 생각하고 있는지 알아보기를 원했다.

감사합니다.

답변

26

당신은 미지의 영역에서 방황하고 있습니다! ☺

여기에는 여러 가지 방법이 있습니다. 그리고 그 중 어느 것도 완벽하지는 않지만 오케스트레이션 후크 덕분에 향후 Docker 버전에서 상황이 개선 될 것입니다.

좋은 방법은 오래된 서비스 검색 및 등록을 사용하는 것입니다. I.E., 서비스가 시작되면 공개적으로 사용 가능한 주소를 알아 내고 예를 들어 사육사, Etcd 또는 심지어 Redis. Docker가 임의의 포트를 사용하는 대신 포트 X : X를 항상 매핑하는 등 일부 규칙을 채택하지 않는 한 공개적으로 사용 가능한 주소를 알아내는 서비스는 사소한 것이 아니기 때문에 외부에서 등록해야 할 수도 있습니다. 이는 사용자의 오케스트레이션 계층 (이 경우 Mesos)이 컨테이너를 시작한 다음 호스트와 포트를 찾아 서비스 검색 시스템에 배치한다는 것을 의미합니다. 나는 Marathon에 익숙하지 않지만, 당신은 그것을 위해 갈고리를 등록 할 수 있어야합니다. 그런 다음 다른 컨테이너는 서비스 발견 레지스트리의 엔드 포인트 주소를 간단하고 간단하게 검색합니다.

또한 컨테이너의 DNS 이름을 Skydns에 자동으로 등록하는 Skydock을 볼 수도 있습니다. 그러나 현재는 단일 호스트이므로이 아이디어가 마음에 들면 다중 호스트 및 SRV 레코드를 지원하도록 확장해야합니다.

또 다른 접근법은 "잘 알려진 진입 점"을 사용하는 것입니다. 이는 사실 서비스 검색의 단순화 된 사례입니다. 즉, 서비스가 미리 설정된 호스트 및 포트에서 항상 실행되도록하여 해당 주소를 정적으로 사용할 수 있음을 의미합니다. 물론 이것은 (테스트/준비 목적으로 환경을 재생산하고 싶을 때 더 힘들어 질 것이기 때문에) 좋지 않지만 서비스 검색에 대한 단서가 없다면 시작일 수 있습니다.

Pipework을 사용하여 여러 호스트에서 하나 이상의 (또는 여러 개의) 가상 네트워크를 만들고 컨테이너를 바인딩 할 수도 있습니다. 배관 작업을 통해 수동으로 IP 주소를 할당하거나 DHCP를 통해 자동으로 IP 주소를 할당 할 수 있습니다. 그러나이 방법은 권장하지 않지만 컨테이너를 기존 네트워크 아키텍처 (예 : VLAN ...)에 연결하려는 경우 적합합니다.

어떤 솔루션을 사용하든 관계없이 링크를 사용하고 있다고 가장하는 것이 좋습니다. 나는. (임의의 예) my-postgresql-db:5432에 연결하도록 앱 구성을 하드 코딩하는 대신 (마치 링크 인 것처럼) 환경 변수 DB_PORT_5432_TCP_ADDRDB_PORT_5432_TCP_PORT을 사용하고 컨테이너 시작시 해당 변수를 설정하십시오. 그렇게하면 서비스 발견 등을하지 않고 컨테이너를보다 단순한 환경으로 "축소"하면 쉽게 노력없이 링크를 대체 할 수 있습니다.

+2

나에게 중요한 한 가지는 컨테이너의 지역성입니다. 나는 상대적으로 쉽게 다른 컨테이너를 찾을 수있는 일종의 발견을 할 수 있지만, 컨테이너를 그룹 (각각 nginx + 레일 + 자격 증명 데몬)으로 시작하는 마라톤을 각자의 컨테이너에서 시작하도록하는 것 이상의 최적화를 찾고 있습니다. 분명히 패치를 제출해야합니다. 마라톤을 도커로보기보다는해야합니까? –

+0

제가 제대로 이해했는지 확인하기 위해 - "마라톤에서 각자 호스트의 컨테이너 (...) 그룹을 시작하도록 강요하는 것입니까?" 나는. 컨테이너가 서로 다른 호스트에 있어야합니까? – jpetazzo

+0

죄송합니다. 그룹을 단일 호스트에두고 싶습니다. 예를 들어 각 서비스에 연결된 로컬 haproxy가 필요합니다. 여기서 적절한 경로는 마라톤에서 추가 인수를 취하고, 포크 자체를 포크하고, 하나의 조각이 죽으면 전체 그룹이 다시 시작되도록 만드는 자식을 관리하는 방법을 알고있는 커스텀 메스 실행자라고 생각합니다. –