소개 | Swarm은 펑크 록 밴드처럼 들립니다. 그러나 이는 실제로 새로운 오케스트레이션 메커니즘이거나 Docker의 기존 오케스트레이션 메커니즘이 개선된 것입니다. 간단히 말해서 이전 버전의 Docker를 사용하는 경우 Swarm을 수동으로 구성하여 Docker 클러스터를 생성해야 합니다. 버전 1.12부터 Docker 엔진은 원활한 클러스터 설정을 지원하기 위해 기본 구현(LCTT 주석: 아래 참조)을 통합합니다. 이것이 바로 이 글이 존재하는 이유입니다. |
이 튜토리얼에서는 오케스트레이션된 Docker가 무엇을 할 수 있는지 경험해 보겠습니다. 이 문서는 BnB와 같은 모든 세부 정보를 포함하거나 모든 답변을 제공하기 위한 것이 아니지만 클러스터링 경로를 시작하는 데 도움이 될 것입니다. 나의 리더십을 시작해 보겠습니다.
티저
기술 요약Docker의 상세하고 유용한 문서를 여기에 복사하는 것은 부끄러운 일이므로 기술에 대한 간략한 개요를 설명하겠습니다. 우리는 이미 Docker를 가지고 있습니다. 이제 더 많은 서버가 Docker 호스트로 사용되기를 원하지만 동시에 동일한 논리적 엔터티에 속하기를 원합니다. 즉, 클러스터를 설정하려고 합니다.
호스트 클러스터부터 시작해 보겠습니다. 호스트에서 Swarm 클러스터를 초기화하면 호스트가 클러스터의 관리자가 됩니다. 기술적 관점에서 보면 합의 그룹의 노드가 됩니다. 그 뒤에 있는 수학적 논리는 Raft 알고리즘을 기반으로 합니다. 관리자는 작업 예약을 담당합니다. 특정 작업은 Swarm 클러스터에 참여한 각 작업자 노드에 위임됩니다. 이러한 작업은 Node API에 의해 관리됩니다. API라는 단어가 싫지만 여기서는 꼭 사용해야겠습니다.
서비스 API는 이 구현의 두 번째 구성 요소입니다. 이를 통해 관리자 노드는 모든 Swarm 클러스터 노드에 분산 서비스를 생성할 수 있습니다. 이 서비스는 복제될 수 있습니다. 즉, 밸런싱 메커니즘을 통해 해당 서비스(LCTT Annotation: 이러한 서비스를 나타냄)가 클러스터에 배포됩니다.(LCTT Annotation: 복제 모드를 참조하며, 여러 컨테이너 인스턴스가 자동으로 클러스터의 일부에 작업을 예약합니다. ) 조건을 충족하는 노드) 또는 전역(LCTT 주석: 전역 모드를 나타냄)에 할당될 수 있습니다. 이는 각 노드가 컨테이너 인스턴스를 실행한다는 것을 의미합니다.
해야 할 숙제가 더 있지만 이 정보만으로도 시작하기에 충분합니다. 이제 실용적인 내용으로 넘어가겠습니다. 우리의 대상 플랫폼은 CentOS 7.2입니다. 흥미롭게도 이 튜토리얼을 작성하는 동안 저장소에는 Docker 버전 1.10만 있으므로 Swarm을 사용하려면 수동으로 업데이트해야 합니다. 이에 대해서는 다른 튜토리얼에서 논의하겠습니다. 기존 클러스터에 새 노드를 추가하는 방법을 다루는 후속 가이드가 있으며 비대칭 구성에는 Fedora를 사용합니다. 이 시점에서 올바른 구성이 설정되어 있고 작동 중인 클러스터가 실행 중인지 확인하십시오. (LCTT 주석: 첫 번째 노드의 Docker가 설치되어 Swarm 모드로 들어가는 것을 말하지만 Swarm up을 초기화하는 방법은 다루지 않았습니다. 여기까지는 클러스터지만 이에 대해서는 다음 장에서 다룰 것이므로 걱정하지 마세요.
이미지 및 서비스 구성로드 밸런싱된 Apache 서비스를 구성하고 여러 컨테이너 인스턴스를 사용하여 고유한 IP 주소를 통해 페이지 콘텐츠를 제공하려고 합니다. 매우 표준적입니다(LCTT 번역 주석: 이 로드 밸런싱된 웹 서버를 나타냄). 또한 이 예에서는 가용성, 중복성, 확장 및 성능 등 클러스터를 사용하려는 대부분의 이유를 강조합니다. 물론 네트워킹과 스토리지를 모두 고려해야 하지만 이는 이 가이드의 범위를 벗어납니다.
이 Dockerfile 템플릿은 실제로 공식 이미지 저장소의 httpd에서 찾을 수 있습니다. 시작하려면 간단한 설정만 하면 됩니다. 자신만의 이미지를 다운로드하거나 생성하는 방법은 시작하기 가이드를 참조하세요. 링크는 이 튜토리얼 상단에서 찾을 수 있습니다.
으아아아이미지가 생성되었습니다
다음 단계를 계속하기 전에 오류 없이 컨테이너 인스턴스를 시작하고 웹 서버에 연결할 수 있는지 확인해야 합니다(LCTT 주석: 다음 명령 사용). 연결할 수 있는지 확인하고 나면 분산 서비스 생성을 시작할 수 있습니다.
으아아아이 IP 주소를 브라우저에 입력하고 무슨 일이 일어나는지 확인하세요.
Swarm 초기화 및 구성다음 단계는 Swarm 클러스터를 시작하는 것입니다. 시작하려면 다음과 같은 가장 기본적인 명령이 필요하며 이는 Docker 블로그의 예와 매우 유사합니다.
으아아아우리는 여기서 무엇을 했나요? 우리는 5개의 컨테이너 인스턴스로 frontent라는 서비스를 만들었습니다. 동시에 호스트의 포트 80을 이러한 컨테이너의 포트 80에 바인딩합니다. 이 테스트에는 새로 생성된 Apache 이미지를 사용합니다. 그러나 위 명령을 컴퓨터에 직접 입력하면 다음 오류가 표시됩니다.
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
这意味着你没有将你的主机(节点)配置成一个 Swarm 管理者manager。你可以在这台主机上初始化 Swarm 集群或是让它加入一个现有的集群。由于我们目前还没有一个现成的集群,我们将初始化它(LCTT 译注:指初始化 Swarm 集群并使当前节点成为 manager):
docker swarm init Swarm initialized: current node (dm58mmsczqemiikazbfyfwqpd) is now a manager.
为了向这个 Swarm 集群添加一个工作者worker,请执行下面的指令:
docker swarm join \ --token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla 9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \ 10.0.2.15:2377
为了向这个 Swarm 集群添加一个管理者manager,请执行 docker swarm join-token manager 并按照指示操作。
操作后的输出不用解释已经很清楚明了。我们成功的创建了一个 Swarm 集群。新的节点们将需要正确的令牌token来加入这个 Swarm 集群。如果你需要配置防火墙,你还需找到它的 IP 地址和端口(LCTT 译注:指 Docker 的 Swarm 模式通讯所需的端口,默认 2377)。此外,你还可以向 Swarm 集群中添加管理者节点。现在,重新执行刚刚的服务创建指令:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest 6lrx1vhxsar2i50is8arh4ud1
现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 Vagrant 和 coreOS 中做的事情那样。毕竟它们的原理几乎相同。相同指导思想的不同实现罢了(LCTT 译注:笔者观点,无法苟同)。首先需要确保 docker ps 能够给出正确的输出。你应该能看到所创建服务的多个容器副本。
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cda532f67d55 my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.1.2sobjfchdyucschtu2xw6ms9a 75fe6e0aa77b my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.4.ag77qtdeby9fyvif5v6c4zcpc 3ce824d3151f my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.2.b6fqg6sf4hkeqs86ps4zjyq65 eda01569181d my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.5.0rmei3zeeh8usagg7fn3olsp4 497ef904e381 my-apache2:latest "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp frontend.3.7m83qsilli5dk8rncw3u10g5a
我也测试了不同的、非常规的端口,它们都能正常工作。对于你如何连接服务器和收取请求你将会有很多可配置的余地。你可以使用 localhost 或者 Docker 网络接口(笔者注:应该是指 Docker 的默认网桥 docker0,其网关为 172.17.0.1) 的 IP 地址的正确端口去访问。下面的例子使用了端口 1080:
Replicated Web service works
至此,这是一个非常粗略、简单的开始。真正的挑战是创建一个优化过的、可扩展的服务,但是它们需要一个准确的技术用例。此外,你还会用到 docker info 和 docker service(还有 inspect 和 ps)命令来详细了解你的集群是如何工作的。
可能会遇到的问题你可能会在把玩 Docker 和 Swarm 时遇到一些小的问题(也许没那么小)。比如 SELinux 也许会抱怨你正在执行一些非法的操作(LCTT 译注:指在强制访问控制策略中没有权限的操作)。然而,这些错误和警告应该不会对你造成太多阻碍。
SELinux alert
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest docker: 'service' is not a docker command.
docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag
关于这个错误已经有多个相关的讨论和帖子了。其实这个错误也许相当无辜。你也许是从浏览器粘贴的命令,在浏览器中的横线也许没被正确解析(笔者注:应该用 --name 而不是 -name)。就是这么简单的原因所导致的。 扩展阅读
关于这个话题还有很多可谈的,包含 1.12 版之前的 Swarm 集群实现(笔者注:旧的 Swarm 集群实现,下文亦作独立版本,需要 Consul 等应用提供服务发现),以及当前的 Docker 版本提供的(笔者注:新的 Swarm 集群实现,亦被称为 Docker 引擎的 Swarm 模式)。也就是说,请别偷懒花些时间阅读以下内容:
드디어 여기서 보게 됐네요. 이 시점에서 무엇인가를 배웠다는 보장은 없지만 이 기사가 여전히 유용할 것이라고 믿습니다. Swarm 클러스터 모드의 작동 방식과 수행할 수 있는 작업에 대한 몇 가지 기본 개념과 개요를 다룹니다. 또한 웹 서버의 이미지를 성공적으로 다운로드하고 생성한 다음 이를 기반으로 실행했습니다. 위의 실험은 단일 노드에서만 진행했지만 앞으로는 이에 대해 명확하게 설명하겠습니다(LCTT 번역: 다중 노드 Swarm 클러스터 작동을 설명하기 위해). 그리고 우리는 몇 가지 일반적인 문제를 해결했습니다.
이 가이드가 충분히 흥미로웠기를 바랍니다. 과거에 Docker에 관해 제가 작성한 기사와 결합하여 이 기사는 이미지, 네트워크 스택, 스토리지 및 클러스터를 작동하는 방법을 포함하여 적절한 설명을 제공해야 합니다. 그냥 워밍업이라고 생각하시면 됩니다. 새로운 Docker 튜토리얼을 즐기시고 뵙기를 기대합니다. 나는 내가 얼마나 기억하는지 통제할 수 없다.
좋은 하루 보내세요.
위 내용은 Docker Engine의 Swarm 모드를 빠르게 시작해보세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!