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


115

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

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

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

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

답변:


58

최신 정보

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 컨테이너를 확장하는 방법

2
그래서 기본적으로 ambasador 패턴을 포함하지 않는 호스트 간 컨테이너를 연결하거나 docker를 우회하고 lxc와 직접 대화하는 방법이 아직 없습니다.
user3012759 dec.

@ user3012759 Ambassador Pattern은 유일하게 확립 된 기본 방식이지만 Swarm (알파)은 Docker 스케줄러를 대체하여 작동하는 또 다른 기본 방식입니다. 답장을 늦게 보내서 미안해.
lyschoening

SkyDock 은 다중 호스트 지원을 포함하지 않습니다 (아직 : 2015 년 3 월) . 등록자 (SkyDNS와 함께 작동 할 수있는 간단한 프로젝트)는 수행하지만 구성은 더 수동적입니다 (서비스에는 호스트 포트에 매핑 된 포트가 있어야 함).
turtlemonvh

6
떼에 대한 피상적 조사에 따르면 호스트 간 연결이 아닌 클러스터 관리에 중점을 둡니다. 이 단점은 명확 부두 노동자 자신의 데모에 의해 진술된다 youtube.com/watch?v=M4PFY6RZQHQ&t=3m37s
브루노 Bronosky을

1
@lyschoening Docker는 답변을 업데이트 할 수있는 네이티브 멀티 호스트 네트워킹 을 발표했습니다
Thomasleveil 2015-06-29

15

업데이트 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가 구현하면 더 간단한 방법으로 수행 할 수있을 때까지 기다릴 수 있습니다.


2
최근 libswarm에는 많은 활동이 없었습니다. 도커 팀이 다른 방향으로 움직이고 있는지 궁금합니다.
Raman

12

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

여기서 흥미로운 것은

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

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

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

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


내가 이해 한 바에 따르면 weave는 서비스 연결을 위해 컨테이너 내부 에서 작동하는 네트워크 오버레이 이고 swarm은 인프라 오케스트레이션을 위해 docker CLI를 확장하는 클러스터링 기술입니다. 인프라 연결은 무리 밖에서 (예 : 일반 스위치 사용) 수행되어야하며, Weave 외부에서 서비스 오케스트레이션 (예 : Mesos / Kubernetes 사용)이 필요합니다. 이것이 어떻게 작동하는지에 대한 당신의 생각과 일치합니까?
Henrik

내가 보는 방법은 다음과 같습니다. docker compose는 컨테이너 연결 및 오케스트레이션에 관한 것이고, docker swarm은 많은 docker 호스트에서 docker를 실행하는 것에 관한 것입니다. socketplane (현재 docker 소유) 및 weave는 모두 오버레이 네트워크입니다. Socketplane은 VM의 오버레이 (예 : openstack)에 일반적으로 사용되는 openvswitch를 기반으로합니다. 반면에 Weave는 도커 전용입니다. 이 모든 것 중에서 Mesos / Kubernetes / Lattice는 docker CLI와는 다소 다른 사용자 경험과 확장 성 수준을 가진 docker swarm을 대체합니다.
Stuart Charlton

7

최신 정보

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

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


6

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


1
그것은 참으로 아주 좋은 해결책입니다. 나는 그것을 만났다. 내가 걱정하는 것은이 기사가 어제 게시되었으며 Docker 패치가 필요하다는 것입니다. (최근 게시 된 시간을 감안할 때 해당 패치가 Docker에 병합되는지 확인하기 위해 잠시 기다릴 것입니다.)
lyschoening

Docker는 초기 개발 단계에 있으며 모든 요구 사항이 아직 명확하지 않고 정의 된 요구 사항이 모두 구현되지는 않았습니다. 따라서 패치가 필요합니다.
paweloque 2014.01.22

2
이것은 대답이 아닙니다. 링크 된 기사에서 답을 복사하십시오. 그것이 SO 표준입니다.
Bruno Bronosky 2015

6

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

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

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


서비스 감지는 어떻게 하시겠습니까? 한 시스템에 Redis가 있고 다른 시스템에 클라이언트 애플리케이션이있는 경우 클라이언트 애플리케이션이 Redis 서비스의 IP를 어떻게 얻습니까?
lyschoening

동일한 방식으로 단일 호스트에서 수행합니다. 새로 시작된 서비스에 IP / 포트를 제공하거나 키 / 값 저장소 (예 : etcd)를 사용하거나 서비스가 쿼리 할 수있는 DNS를 사용합니다. 기존의 많은 서비스가 수정없이 사용할 수 있기 때문에 DNS를 사용하는 것을 좋아합니다.
noteed

1

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

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


1

docker swarm을 1.14사용하면 다음을 수행 할 수 있습니다.

  • --hostname태그를 사용하여 호스트 이름을 컨테이너에 지정했지만 작동하지 않았고 컨테이너가 할당 된 호스트 이름으로 서로 핑할 수 없습니다.

  • 컴퓨터에 서비스 할당 --constraint 'node.hostname == <host>'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.