웹사이트 검색

Docker Swarm 및 Ubuntu 16.04를 사용하여 Docker 컨테이너 클러스터를 생성하는 방법


소개

Docker Swarm은 Docker 호스트 클러스터를 배포하기 위한 Docker 네이티브 솔루션입니다. 이를 사용하여 로컬 컴퓨터 또는 지원되는 클라우드 플랫폼에서 실행되는 Docker 호스트 클러스터를 신속하게 배포할 수 있습니다.

Docker 1.12 이전에는 Docker 호스트 클러스터를 설정하고 배포하려면 서비스 검색을 위해 Consul과 같은 외부 키-값 저장소를 사용해야 했습니다. 그러나 Docker 1.12에서는 Docker가 기본적으로 작동하는 메모리 내 키-값 저장소와 함께 제공되므로 외부 검색 서비스가 더 이상 필요하지 않습니다.

이 자습서에서는 DigitalOcean에서 Docker 1.12의 Swarm 기능을 사용하여 Docker 머신 클러스터를 배포하는 방법을 배웁니다. 클러스터의 각 Docker 노드는 Ubuntu 16.04를 실행합니다. 수십, 수백 또는 수천 개의 Docker 호스트로 구성된 클러스터를 실행할 수 있지만 이 자습서에서 설정할 클러스터는 총 3개의 클러스터 멤버에 대해 관리자 노드와 두 개의 작업자 노드로 구성됩니다. . 이 자습서를 완료하면 클러스터에 더 많은 노드를 쉽게 추가할 수 있습니다.

전제 조건

이 자습서에는 다음이 필요합니다.

  • Docker가 설치된 로컬 머신. 로컬 컴퓨터는 모든 Linux 배포 또는 Windows 또는 macOS를 실행할 수 있습니다. Windows 및 macOS의 경우 Ubuntu 16.04에서 Docker를 설치 및 사용하는 방법 지침을 사용하여 Docker를 설치합니다.
  • DigitalOcean API 토큰입니다. 없는 경우 이 가이드를 사용하여 생성하세요. 토큰을 생성할 때 읽기-쓰기 범위가 있는지 확인하십시오. 이것이 기본값이므로 생성하는 동안 옵션을 변경하지 않으면 읽기-쓰기 기능을 갖게 됩니다. 명령줄에서 더 쉽게 사용하려면 해당 문서에 제공된 대로 토큰을 변수에 할당해야 합니다.
  • 3개의 호스트를 생성하는 데 사용할 로컬 컴퓨터에 설치된 Docker 머신. Windows 및 macOS에서 Docker 설치에는 Docker Machine이 포함됩니다. Ubuntu 16.04를 로컬에서 실행 중인 경우 설치 지침은 Ubuntu 16.04에서 Docker Machine으로 원격 Docker 호스트를 프로비저닝 및 관리하는 방법을 참조하세요.

1단계 - 클러스터 노드 프로비저닝

클러스터용 Docker 호스트를 여러 개 생성해야 합니다. 다음 명령은 Docker화된 단일 호스트를 프로비저닝합니다. 여기서 $DOTOKEN은 DigitalOcean API 토큰으로 평가되는 환경 변수입니다.

  1. docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name

한 번에 하나의 호스트를 프로비저닝하면서 최소 3개의 노드로 구성된 클러스터를 설정하기 위해 그렇게 해야 한다고 상상해 보십시오.

간단한 Bash 스크립팅과 함께 이 명령을 사용하여 여러 Docker 호스트를 프로비저닝하는 프로세스를 자동화할 수 있습니다. 로컬 컴퓨터에서 이 명령을 실행하여 node-1, node-2node-3라는 세 개의 Docker 호스트를 만듭니다.

  1. for i in 1 2 3; do docker-machine create --driver digitalocean \
  2. --digitalocean-image ubuntu-16-04-x64 \
  3. --digitalocean-access-token $DOTOKEN node-$i; done

명령이 성공적으로 완료된 후 DigitalOcean 대시보드를 방문하거나 다음 명령을 입력하여 모든 머신이 생성되었는지 확인할 수 있습니다.

  1. docker-machine ls

출력은 다음과 유사해야 하며 노드의 IP 주소를 찾기 위한 빠른 참조 역할을 해야 합니다.

Output
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS node-1 - digitalocean Running tcp://111.111.111.111:2376 v1.12.2 node-2 - digitalocean Running tcp://111.111.111.112:2376 v1.12.2 node-3 - digitalocean Running tcp://111.111.222.222:2376 v1.12.2

이 시점에서 세 개의 Dockerized 호스트가 모두 생성되었으며 각 호스트의 IP 주소가 있습니다. 또한 모두 Docker 1.12.x를 실행하고 있지만 아직 Docker 클러스터의 일부는 아닙니다. 다음 단계에서는 노드가 클러스터의 구성원으로 작동하도록 방화벽 규칙을 구성하고 노드 중 하나를 선택하여 Docker Swarm 관리자로 만들고 나머지는 Docker Swarm 작업자로 구성합니다.

2단계 - Docker Swarm 트래픽을 허용하도록 방화벽 규칙 구성

클러스터에는 관리자 역할을 하는 노드가 하나 이상 있어야 하지만 프로덕션 설정의 경우 3개의 관리자가 권장됩니다. 이 설정에서는 첫 번째 노드를 선택하고 Swarm 관리자로 만듭니다. 다른 두 노드는 작업자 노드가 됩니다.

클러스터가 제대로 작동하려면 클러스터의 일부가 될 노드에서 특정 네트워크 포트를 열어야 합니다. 이는 해당 포트를 통한 트래픽을 허용하도록 방화벽을 구성하는 것을 수반합니다. 해당 작업을 수행하는 데 사용할 수 있는 세 가지 다른 방화벽 응용 프로그램이 있으므로 각 방화벽 응용 프로그램의 노드에서 실행해야 하는 명령은 별도의 문서에 설명되어 있습니다. 이 가이드에 따라 각 호스트에 대한 방화벽을 구성하십시오. 관리자에서 적절한 포트를 연 다음 반복하여 두 클라이언트 노드에서 포트를 엽니다.

이 단계를 완료한 후 클러스터 관리자를 초기화할 수 있습니다.

3단계 - 클러스터 관리자 초기화

node-1이 클러스터 관리자가 되기로 결정했으므로 로컬 컴퓨터에서 노드에 로그인합니다.

  1. docker-machine ssh node-1

이제 해당 특정 노드에 로그인했다는 사실을 반영하도록 명령 프롬프트가 변경됩니다. 노드를 Swarm 관리자로 구성하려면 다음 명령을 입력하십시오.

  1. docker swarm init --advertise-addr node_ip_address

node_ip_address는 노드의 IP 주소입니다. docker-machine ls의 출력이나 DigitalOcean 대시보드에서 가져올 수 있습니다.

다음과 같은 출력이 표시됩니다.

Output
Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \ 111.111.111.111:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

출력에는 노드의 ID(이 예에서는 a35hhzdzf4g95w0op85tqlow1)와 다른 노드를 클러스터에 추가하는 방법에 대한 지침이 있습니다.

이제 관리자가 구성된 Docker Swarm이 있습니다. 나머지 노드를 작업자로 추가해 보겠습니다.

4단계 - 클러스터에 노드 추가

이 단계를 완료하려면 다른 터미널을 열고 지금은 Swarm 관리자에 로그인하는 데 사용한 터미널 탭이나 창을 그대로 두십시오.

먼저 로컬 시스템에서 node-2에 연결합니다.

  1. docker-machine ssh node-2

그런 다음 이 명령을 실행합니다. 여기서 your_swarm_token은 이전 단계에서 클러스터를 생성할 때 받은 토큰이고 manager_node_ip_address는 Swarm 관리자의 IP입니다.

  1. docker swarm join \
  2. --token your_swarm_token \
  3. manager_node_ip_address:2377

명령이 성공적으로 실행되면 다음 응답이 표시됩니다.

Output
This node joined a swarm as a worker.

node-2에서 로그아웃한 다음 node-3로 이 프로세스를 반복하여 클러스터에 추가합니다. .

이제 두 개의 작업자 노드를 클러스터에 추가했습니다. 방화벽 규칙이 올바르게 구성된 경우 이제 모든 노드가 동기화되어 작동하는 Docker Swarm이 있습니다.

5단계 - 클러스터 관리

관리자 및 작업자 노드가 클러스터에 할당된 후 모든 Docker Swarm 관리 명령은 관리자 노드에서 실행되어야 합니다. 따라서 관리자를 추가하는 데 사용한 터미널로 돌아가 다음 명령을 입력하여 클러스터의 모든 구성원을 봅니다.

  1. docker node ls

출력은 다음과 유사해야 합니다.

Output
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active 6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader

이 출력은 우리가 3노드 Docker Swarm과 해당 노드(관리자 및 작업자 2개)를 다루고 있음을 보여줍니다. 관리자 노드에서 실행할 수 있는 다른 관리 명령을 보려면 다음을 입력하십시오.

  1. docker node --help

클러스터에 대한 자세한 정보를 보려면 관리자 또는 작업자에서 다음 명령을 사용할 수 있습니다(일반 Docker 명령).

  1. docker info

출력은 이러한 종류여야 하며 클러스터의 상태(활성 또는 보류 중), 클러스터의 노드 수 및 특정 노드가 관리자인지 작업자인지 여부를 나타내야 합니다.

Output
... Network: bridge host null overlay Swarm: active NodeID: a35hhzdzf4g95w0op85tqlow1 Is Manager: true ClusterID: f45u0lh7ag4qsl4o56yfbls31 Managers: 1 Nodes: 3 Orchestration: Task History Retention Limit: 5 Raft: Snapshot Interval: 10000 Heartbeat Tick: 1 Election Tick: 3 Dispatcher: Heartbeat Period: 5 seconds CA Configuration: Expiry Duration: 3 months Node Address: 104.236.239.4 Runtimes: runc Default Runtime: runc Security Options: apparmor seccomp Kernel Version: 4.4.0-38-generic Operating System: Ubuntu 16.04.1 LTS OSType: linux ...

작업자 노드에서 동일한 명령을 반복하면 Is Manager 줄에 false가 표시되어야 합니다.

팁: 언제든지 클러스터에서 노드를 추가하거나 제거할 수 있습니다. 또한 작업자 노드를 관리자로 승격하고 관리자를 작업자로 전환할 수 있습니다.

이제 클러스터에서 서비스를 실행해 보겠습니다.

6단계 - Docker Swarm에서 서비스 실행

이제 Docker Swarm이 실행 중이므로 테스트 컨테이너를 실행하고 관리자가 이를 처리하는 방법을 살펴보겠습니다. Docker Engine 1.12 이상을 실행하는 머신에서 컨테이너는 docker service 명령을 사용하여 서비스로 배포됩니다. 그리고 docker node 명령과 마찬가지로 docker service 명령은 관리자 노드에서만 실행할 수 있습니다.

이제 공식 Nginx 컨테이너 이미지를 사용하여 웹 서버 서비스를 배포해 보겠습니다.

  1. docker service create -p 80:80 --name webserver nginx

이 명령에서는 어디에서나 기본 Nginx 페이지에 액세스할 수 있도록 Nginx 컨테이너의 포트 80을 클러스터의 포트 80에 매핑합니다.

클러스터에서 실행 중인 서비스를 보려면 다음을 입력하십시오.

  1. docker service ls

출력은 이 형식이어야 합니다. REPLICAS 열은 실행 중인 서비스 인스턴스 수를 보여줍니다.

Output
ID NAME REPLICAS IMAGE COMMAND 0ymctkanhtc1 webserver 1/1 nginx

docker service ps 다음에 서비스 이름을 사용하여 서비스가 실행 중인 노드를 확인할 수 있습니다.

  1. docker service ps webserver

출력은 다음과 유사해야 합니다.

Output
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago

이 예에서 webserver 서비스는 node-1에서 실행 중입니다. 기본 포트에서 실행되는 웹 서버이므로 브라우저에서 http://node-1_ip_address로 이동하여 액세스할 수 있습니다. 시도 해봐. Nginx의 기본 페이지가 표시됩니다.

메시 네트워킹의 마법으로 노드에서 실행되는 서비스는 클러스터의 다른 모든 노드에서 액세스할 수 있습니다. 예를 들어 이 Nginx 서비스는 실행 중인 노드뿐만 아니라 클러스터에 있는 모든 노드의 IP 주소로 브라우저를 지정하여 액세스할 수도 있습니다. 시도 해봐.

Docker Swarm의 또 다른 기능은 서비스 확장, 즉 서비스의 추가 인스턴스를 가동하는 기능입니다. 이전에 시작한 webserver 서비스를 5개의 인스턴스로 확장한다고 가정합니다. 이렇게 하려면 다음 명령을 입력하기만 하면 시스템이 4개의 인스턴스를 더 생성합니다.

  1. docker service scale webserver=5

그리고 docker service ps의 출력에는 새 인스턴스가 시작된 노드가 표시됩니다.

Output
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago 1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago 2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago

이는 4개의 새 인스턴스 중 2개가 node-3에서 시작되었고, 하나는 node-1에서 시작되었고 다른 하나는 node-2에서 시작되었음을 보여줍니다. 코드>.

마지막으로 서비스가 다운되면 자동으로 동일한 노드에서 다시 시작하거나 원래 노드를 더 이상 사용할 수 없는 경우 다른 노드에서 다시 시작합니다.

결론

Docker Engine 1.12 및 새로운 Swarm 모드를 사용하여 Docker Swarm을 설정하는 것이 얼마나 쉬운지 확인했습니다. 또한 클러스터에서 몇 가지 관리 작업을 수행하는 방법도 살펴보았습니다. 하지만 아직 더 있습니다. 사용 가능한 Docker Swarm 명령을 보려면 Swarm 관리자에서 다음 명령을 실행하십시오.

  1. docker swarm --help

Docker Swarm에 대한 자세한 내용은 DigitaloOcean의 Docker 관련 기사를 참조하십시오.