[docker] 호스트간에 Docker 서비스를 연결하는 방법은 무엇입니까?

Docker를 사용하면 여러 컨테이너의 서버가 링크 및 서비스 검색을 통해 서로 연결할 수 있습니다 . 그러나 내가 볼 수있는이 서비스 검색은 호스트 로컬입니다. 다른 컴퓨터에서 호스팅되는 다른 서비스를 사용하는 서비스를 구현하고 싶습니다.

CoreOS의jumpers , 본질적으로 다른 컴퓨터로 프록시하는 호스트 로컬 서비스,이 사용 사례를 지원하려는 것으로 보이는 Docker 배포를 관리하기위한 전체 github 프로젝트 와 같이 Docker에서이 문제를 해결하기위한 몇 가지 접근 방식 이 있습니다. .

개발 속도를 감안할 때 현재의 모범 사례를 따르는 것은 어렵습니다. 따라서 내 질문은 본질적으로 다음과 같습니다.

  1. Docker의 호스트 간 연결을위한 현재 주요 방법은 무엇입니까 (있는 경우)
  2. Docker 시스템에서 직접이 기능을 지원할 계획이 있습니까?


답변

최신 정보

Docker는 최근 Docker 오케스트레이션을위한 Swarm 이라는 새로운 도구를 발표 했습니다 .

Swarm을 사용하면 여러 개의 docker 데몬을 “결합”할 수 있습니다. 먼저 swarm을 만들고 한 시스템에서 swarm 관리자를 시작하고 docker 데몬이 swarm의 식별자를 사용하여 swarm 관리자에 “join”하도록합니다. 도커 클라이언트는 마치 일반 도커 서버 인 것처럼 떼 관리자에 연결합니다.

컨테이너가 Swarm으로 시작되면 정의 된 제약 조건을 충족하는 자유 노드에 자동으로 할당됩니다. 다음 예제는 블로그 게시물에서 가져온 것입니다.

$ docker run -d -P -e constraint:storage=ssd mysql

지원되는 제약 조건 중 하나는 "node"컨테이너를 특정 호스트 이름에 고정 할 수 있다는 것입니다. 떼는 또한 노드 간의 링크를 해결합니다.

내 테스트에서 나는 Swarm 이 고정 된 위치에서 볼륨으로 아직 잘 작동하지 않는다는 인상을 받았기 때문에 (또는 적어도 이들을 연결하는 과정이 매우 직관적이지 않음), 이것은 명심해야 할 사항입니다.

Swarm 은 현재 베타 단계입니다.


최근까지 Ambassador Pattern 은 원격 호스트 서비스 검색에 대한 유일한 Docker 네이티브 접근 방식이었습니다. 이 패턴은 계속 사용할 수 있으며 패턴이 프록시 역할을하는 하나 이상의 추가 컨테이너로 구성된다는 점에서 일반 Docker 이상의 마법이 필요하지 않습니다.

또한 Docker 클러스터를 지원하기위한 여러 타사 확장이 있습니다. 타사 솔루션에는 다음이 포함됩니다.

  • 두 개의 호스트에 Docker 네트워크 브리지 연결, 경량 및 다양한 솔루션이 있지만 일반적으로 몇 가지주의 사항이 있습니다.
  • DNS 기반 검색 (예 : skydock 및 SkyDNS 사용)
  • Shipyard 와 같은 Docker 관리 도구 및 Docker 오케스트레이션 도구. 광범위한 목록은이 질문을 참조하십시오. 프로덕션에서 Docker 컨테이너를 확장하는 방법

답변

업데이트 3

Libswarm은 swarm 으로 이름이 바뀌 었으며 이제 별도의 응용 프로그램입니다.

다음은 시작점으로 사용할 github 페이지 데모입니다.

# create a cluster
$ swarm create
6856663cdefdec325839a4b7e1de38e8

# on each of your nodes, start the swarm agent
#  <node_ip> doesn't have to be public (eg. 192.168.0.X),
#  as long as the other nodes can reach it, it is fine.
$ swarm join --token=6856663cdefdec325839a4b7e1de38e8 --addr=<node_ip:2375>

# start the manager on any machine or your laptop
$ swarm manage --token=6856663cdefdec325839a4b7e1de38e8 --addr=<swarm_ip:swarm_port>

# use the regular docker cli
$ docker -H <swarm_ip:swarm_port> info
$ docker -H <swarm_ip:swarm_port> run ...
$ docker -H <swarm_ip:swarm_port> ps
$ docker -H <swarm_ip:swarm_port> logs ...
...

# list nodes in your cluster
$ swarm list --token=6856663cdefdec325839a4b7e1de38e8
http://<node_ip:2375>

업데이트 2

공식적인 접근 방식은 이제 libswarm 을 사용 하는 것입니다. 여기 에서 데모를 참조 하십시오.

최신 정보

openvswitch 호스트는 동일한 접근 방식을 사용하여 docker에서 통신 하는 데 좋은 요점 이 있습니다 .

서비스 검색을 허용하기 위해 skydock 이라는 DNS 기반의 흥미로운 접근 방식이 있습니다.

도 있습니다 스크린 캐스트는 .


이것은 또한 퍼즐의 동일한 조각을 사용하지만 위에 vlan을 추가하는 좋은 기사입니다.

http://fbevmware.blogspot.it/2013/12/coupling-docker-and-open-vswitch.html

패치는 솔루션의 견고성과 관련이 없습니다. Docker는 실제로 Linux 컨테이너의 일종의 DSL 일 뿐이며이 기사의 두 솔루션은 일부 Docker 자동 설정을 우회하고 Linux 컨테이너로 직접 대체합니다.

따라서 솔루션을 안전하게 사용하고 Docker가 구현하면 더 간단한 방법으로 수행 할 수있을 때까지 기다릴 수 있습니다.


답변

Weave 는 TCP / UDP를 통한 가상 이더넷 스위치 역할을하는 새로운 Docker 가상 네트워크 기술입니다. 호스트에서 Weave를 실행하는 Docker 컨테이너 만 있으면됩니다.

여기서 흥미로운 것은

  • 링크 대신 가상 네트워크에서 고정 IP / 호스트 이름을 사용하십시오.
  • 호스트는 완전한 연결이 필요하지 않으며, 사용 가능한 피어를 기반으로 메시가 형성되며, 패킷은 이동해야하는 곳으로 다중 홉으로 라우팅됩니다.

이것은 다음과 같은 흥미로운 시나리오로 이어집니다.

  • WAN을 통해 가상 네트워크를 만듭니다. Docker 컨테이너는 자신이 어떤 실제 네트워크에 있는지 알거나 신경 쓰지 않습니다.
  • 컨테이너를 다른 물리적 Docker 호스트로 이동하면 Weave가 그에 따라 피어를 감지합니다.

예를 들어, 랩톱과 호스트 당 두 개의 명령을 사용하는 몇 개의 클라우드 (EC2) 호스트에서 다중 노드 Cassandra 클러스터를 생성하는 방법에 대한 예제 가이드 가 있습니다. AWS CloudFormation을 사용하여 CoreOS 클러스터를 시작하고 / home / core에 weave를 설치하고 랩톱 방랑자 도커 VM을 설치하고 한 시간 이내에 클러스터를 가동했습니다. 내 노트북은 방화벽이 있지만 Weave는 괜찮은 것처럼 보였고 EC2 피어에 연결하기 만하면됩니다.


답변

최신 정보

Docker 1.12에는 소위 스웜 모드가 포함되어 있으며 service추상화 도 추가 됩니다. 아마도 모든 사용 사례에 대해 충분히 성숙하지는 않지만 계속 관찰하는 것이 좋습니다. 스웜 모드는 적어도 멀티 호스트 설정에 도움이되며 반드시 링크를 더 쉽게 만들지는 않습니다. Docker 내부 DNS 서버 (1.11 이후)는 컨테이너 이름이 잘 알려진 경우 액세스하는 데 도움이됩니다. 즉, Swarm 컨텍스트에서 생성 된 이름을 다루기가 쉽지 않습니다.


Docker 1.9 릴리스를 사용하면 다중 호스트 네트워킹 이 내장됩니다 . 또한 작업 클러스터를 쉽게 프로비저닝 할 수 있는 예제 스크립트 를 제공합니다.

모든 호스트의 다른 Docker 엔진에서 상태를 공유 할 수있는 K / V 저장소 (예 : Consul)가 필요합니다. 모든 Docker 엔진은 해당 K / V 저장소로 구성되어야하며 Swarm을 사용하여 호스트를 연결할 수 있습니다.

그런 다음 다음과 같은 새 오버레이 네트워크를 만듭니다.

$ docker network create --driver overlay my-network

이제 네트워크 이름을 실행 매개 변수로 사용하여 컨테이너를 실행할 수 있습니다.

$ docker run -itd --net=my-network busybox

이미 실행 중일 때 네트워크에 연결할 수도 있습니다.

$ docker network connect my-network my-container

자세한 내용은 설명서 에서 확인할 수 있습니다 .


답변

다음 문서는 여러 호스트에서 도커 컨테이너를 연결하는 방법을 잘 설명합니다. http://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/


답변

Open vSwitch 또는 Tinc를 사용하여 여러 Docker 서브넷을 함께 연결할 수 있습니다. 나는 그것을 수행하는 방법을 보여주기 위해 Gists를 준비했습니다.

--link옵션 및 앰배서더 패턴 대신이 솔루션을 사용하는 이점 은 더 투명하다는 것입니다. 추가 컨테이너가 필요하지 않으며 더 중요한 것은 호스트에서 포트를 노출 할 필요가 없다는 것입니다. 실제로 --linkDocker가 다중 호스트 (또는 다중 데몬) 설정에 대한 더 좋은 이야기를 얻기 전에 임시 해킹 옵션이 될 것이라고 생각합니다 .

참고 : 내 첫 번째 요점을 가리키는 또 다른 답변이 있다는 것을 알고 있지만 그 답변을 편집하거나 댓글을 달 수있는 카르마가 충분하지 않습니다.


답변

위에서 언급했듯이 Weave 는 호스트간에 Docker 컨테이너를 연결하는 실행 가능한 솔루션입니다. 내 자신의 경험을 바탕으로 설정하는 것은 매우 간단합니다. 이제 DNS 이름으로 컨테이너의 주소를 지정할 수있는 DNS 서비스 도 있습니다 .

반면에 호스트에 컨테이너를 연결하기위한 CoreOS의 Flannel과 Juniper의 Opencontrail이 있습니다.