ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker 4부 스웜(Swarm)
    programing 2017. 12. 13. 09:07


      스웜 클러스터 이해


    Swarm은 Docker를 실행하고 클러스터에 합류 한 컴퓨터 그룹입니다. 그런 일이 발생하면, 이전에 사용하던 Docker 명령을 계속 실행하지만, 이제는 관리자가 클러스터에서 실행합니다 . Swarm에있는 기계는 물리적 또는 가상 시스템일 수 있습니다. Swarm에 가입하면 노드라고 부릅니다.


    Swarm 관리자는 활용도가 가장 낮은 머신을 컨테이너로 채우는 "emptiest node"와 같은 컨테이너를 실행하기위한 몇 가지 전략을 사용할 수 있습니다. 또는 "global". 각 기계가 지정된 컨테이너의 인스턴스를 정확히 하나씩 가져옵니다. 웜 관리자가 이미 사용하고 있는 것과 마찬가지로 작성 전략에서 이 전략을 사용하도록 지시합니다.


    전체 관리자는 명령을 실행할 수 있는 Swarm 내의 유일한 기계이거나 다른 기계가 Swarm에 근로자로 참여할 수 있는 권한을 부여 합니다. 근로자는 수용 능력을 제공하기 위해 존재하며, 다른 기계에 무엇을 할 수 있고 할 수 없는 지를 말할 권한이 없습니다.


    지금까지 로컬 시스템에서 단일 호스트 모드로 Docker를 사용 해왔습니다. 그러나 Docker는 Swarm 모드 로 전환 될 수 있으며 , 이것이 Swarm 의 사용을 가능하게 합니다. 웜 모드를 즉시 활성화하면 현재 시스템이 웜 매니저가 됩니다. 그때부터 Docker는 현재 컴퓨터에서만 관리하는 것이 아니라 관리중인 명령에서 실행하는 명령을 내리게 됩니다.


      스웜 시작하기


    스웜은 여러 노드로 구성되며 물리적 또는 가상 시스템이 될 수 있습니다. 기본적인 개념은 간단합니다 : docker swarm init웜 모드를 활성화하고 현재 머신을 웜 매니저로 만든 다음 docker swarm join다른 머신에서 실행 하여 스웜을 직원으로 참여시킵니다. 아래에서 탭을 선택하여 다양한 상황에서 이것이 어떻게 진행되는지 확인하세요. VM을 사용하여 2대의 기계 클러스터를 신속하게 만들고 그것을 군대로 바꿀 수 있습니다.


      클러스터 만들기


    로컬 컴퓨터의 VM (MAC, LINUX, WINDOWS 7 및 8)

    먼저, 가상 머신 (VM)을 생성 할 수있는 하이퍼 바이저가 필요하므로 머신의 OS 용 Oracle VirtualBox 를 설치 하십세요.


    docker-machineVirtualBox 드라이버를 사용 하여 몇 가지 VM을 만듭니다.

    1
    2
    $ docker-machine create --driver virtualbox myvm1
    $ docker-machine create --driver virtualbox myvm2
    cs


    로컬 컴퓨터의 VM (WINDOWS 10)

    1
    2
    $ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1
    $ docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm2
    cs


    VM을 나열하고 IP 주소를 가져옵니다.

    이제, 두 개의 VM을 가지고 myvm1와 myvm2.

    이 명령을 사용하여 시스템을 나열하고 IP 주소를 가져옵니다.

    1
    $ docker-machine ls
    cs


    다음은이 명령의 출력 예입니다.

    1
    2
    3
    4
    $ docker-machine ls
    NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
    myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.2-ce   
    myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.2-ce
    cs


      스웜을 초기화하고 노드 추가하기


    첫 번째 기계는 관리자로 작동하며 관리 명령을 실행하고 작업자를 인증하여 웜에 가입 시키며 두 번째 시스템은 작업자가됩니다.


    docker-machine ssh. 다음 명령 myvm1 을 사용하여 swarm manager가되도록 지시 docker swarm init하세요.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
    Swarm initialized: current node <node ID> is now a manager.
     
    To add a worker to this swarm, run the following command:
     
      docker swarm join \
      --token <token> \
      <myvm ip>:<port>
     
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    cs


    포트 2377 및 2376

    항상 실행 docker swarm init및 docker swarm join모두에서 포트 2377 (떼 관리 포트), 또는 전혀 포트하고 기본을 보자.


    docker-machine lsDocker 데몬 포트 인 2376 포트 를 포함 하여 반환 된 컴퓨터 IP 주소 입니다. 이 포트를 사용하지 마세요 . 오류가 발생할 수 있습니다.


    1
    2
    3
    4
    5
    $ docker-machine ssh myvm2 "docker swarm join \
    --token <token> \
    <ip>:2377"
     
    This node joined a swarm as a worker.
    cs

    docker node ls이 스웜의 노드를 보려면 관리자를 실행하세요.

    1
    2
    3
    4
    $ docker-machine ssh myvm1 "docker node ls"
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
    brtu9urxwfd5j0zrmkubhpkbd     myvm2               Ready               Active
    rihwohkh3ph38fhillhhb84sk *   myvm1               Ready               Active              Leader
    cs


      덤프 클러스터에 앱 배포


    docker-machine웜 관리자에 쉘 구성

    지금까지 Docker를 배치 docker-machine ssh하여 VM과 통신했습니다. 또 다른 옵션은 docker-machine env <machine>현재 셸을 구성하여 VM의 Docker 데몬과 통신하도록 명령을 실행하는 것입니다. 이 방법은 로컬 docker-compose.yml파일을 사용하여 어디서나 복사 할 필요없이 "원격"으로 응용 프로그램을 배포 할 수 있으므로 다음 단계에서 더 잘 작동합니다 .


    입력 docker-machine env myvm1한 다음 출력의 마지막 줄에 제공된 명령을 복사하여 붙여 넣고 실행하여 셸이 대화 할 myvm1웜 관리자 를 구성합니다 .


    쉘을 구성하는 명령은 Mac, Linux 또는 Windows 중 어떤 것이 있는지에 따라 다르므로 아래 각 예제가 나와 있습니다.


    MAC 또는 LINUX에서 도커 시스템 쉘 환경

    docker-machine env myvm1을 클릭하여 대화 할 쉘을 구성하는 명령을 가져옵니다 myvm1.

    1
    2
    3
    4
    5
    6
    7
    $ docker-machine env myvm1
    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://192.168.99.100:2376"
    export DOCKER_CERT_PATH="/Users/sam/.docker/machine/machines/myvm1"
    export DOCKER_MACHINE_NAME="myvm1"
    # Run this command to configure your shell:
    # eval $(docker-machine env myvm1)
    cs


    WINDOWS에서 도커 시스템 쉘 환경

    docker-machine env myvm1을 클릭하여 대화 할 쉘을 구성하는 명령을 가져옵니다 myvm1.

    1
    2
    3
    4
    5
    6
    7
    8
    PS C:\Users\sam\sandbox\get-started> docker-machine env myvm1
    $Env:DOCKER_TLS_VERIFY = "1"
    $Env:DOCKER_HOST = "tcp://192.168.203.207:2376"
    $Env:DOCKER_CERT_PATH = "C:\Users\sam\.docker\machine\machines\myvm1"
    $Env:DOCKER_MACHINE_NAME = "myvm1"
    $Env:COMPOSE_CONVERT_WINDOWS_PATHS = "true"
    # Run this command to configure your shell:
    # & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
    cs


    myvm1 주어진 명령을 실행하여 쉘이 대화 할 수 있도록 구성하세요.

    1
    & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
    cs


    실행 옆에 별표로 표시된 활성 컴퓨터인지 docker-machine ls확인 myvm1하세요.

    1
    2
    3
    4
    PS C:PATH> docker-machine ls
    NAME    ACTIVE   DRIVER   STATE     URL                          SWARM   DOCKER        ERRORS
    myvm1   *        hyperv   Running   tcp://192.168.203.207:2376           v17.06.2-ce
    myvm2   -        hyperv   Running   tcp://192.168.200.181:2376           v17.06.2-ce
    cs


      스웜 매니저에 앱 배포


    이전과 마찬가지로 다음 명령을 실행해서 앱을 배포합니다 myvm1.

    1
    $ docker stack deploy -c docker-compose.yml getstartedla
    cs


    서비스(및 관련 컨테이너)가 둘 다 myvm1와 myvm2 사이에 분산되어 있음을 알 수 있습니다.

    1
    2
    3
    4
    5
    6
    7
    8
    $ docker stack ps getstartedlab
     
    ID            NAME                  IMAGE                   NODE   DESIRED STATE
    jq2g3qp8nzwx  getstartedlab_web.1   john/get-started:part2  myvm1  Running
    88wgshobzoxl  getstartedlab_web.2   john/get-started:part2  myvm2  Running
    vbb1qbkb0o2z  getstartedlab_web.3   john/get-started:part2  myvm2  Running
    ghii74p9budx  getstartedlab_web.4   john/get-started:part2  myvm1  Running
    0prmarhavs87  getstartedlab_web.5   john/get-started:part2  myvm2  Running
    cs


      클러스터 액세스


    myvm1 또는 myvm2의 IP 주소에서 응용 프로그램에 액세스 할 수 있습니다.


    사용자가 만든 네트워크는 네트워크간에 공유되며로드 균형 조정을 수행합니다. 실행 docker-machine ls하여 VM의 IP 주소를 가져오고 브라우저에서 새로 고침 (또는 새로 고침) curl 중 하나를 선택해서 접속해봅니다.

    5 개의 가능한 컨테이너 ID가 모두 무작위로 순환하여로드 밸런싱을 보여줍니다.


    두 IP 주소가 작동하는 이유는 한 무리의 노드가 수신 라우팅 메쉬에 참여한다는 것입니다 . 이렇게하면 실제로 컨테이너를 실행중인 노드가 무엇이든 관계없이 swarm의 특정 포트에 배포 된 서비스가 항상 해당 포트를 소유하도록 할 수 있습니다. 다음은 노드 군대의 my-web포트 8080에서 게시 된 서비스의 라우팅 메쉬가 어떻게 보이는지에 대한 다이어그램입니다.


    docker-compose.yml파일 을 변경하여 응용 프로그램의 크기를 조정 하세요.


    코드를 편집하여 응용 프로그램 동작을 변경 한 다음 새 이미지를 다시 작성하고 푸시합니다. (이렇게하려면 이전에 앱 을 제작하고 이미지를 게시하는 데 사용한 것과 동일한 단계를 따르세요.)


    두 경우 모두 단순히 docker stack deploy다시 실행 하여 변경 사항을 배포하면됩니다.


    사용했던 동일한 docker swarm join명령을 사용 하여 실제 또는 가상의 모든 시스템을이 스웜에 가입시킬 수 myvm2있으며 용량이 클러스터에 추가됩니다. docker stack deploy이후에 실행하면 앱에서 새로운 리소스를 활용합니다.


      전체코드 정리


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    docker-machine create --driver virtualbox myvm1 # Create a VM (Mac, Win7, Linux)
    docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 # Win10
    docker-machine env myvm1                # View basic information about your node
    docker-machine ssh myvm1 "docker node ls"         # List the nodes in your swarm
    docker-machine ssh myvm1 "docker node inspect <node ID>"        # Inspect a node
    docker-machine ssh myvm1 "docker swarm join-token -q worker"   # View join token
    docker-machine ssh myvm1   # Open an SSH session with the VM; type "exit" to end
    docker node ls                # View nodes in swarm (while logged on to manager)
    docker-machine ssh myvm2 "docker swarm leave"  # Make the worker leave the swarm
    docker-machine ssh myvm1 "docker swarm leave -f" # Make master leave, kill swarm
    docker-machine ls # list VMs, asterisk shows which VM this shell is talking to
    docker-machine start myvm1            # Start a VM that is currently not running
    docker-machine env myvm1      # show environment variables and command for myvm1
    eval $(docker-machine env myvm1)         # Mac command to connect shell to myvm1
    & "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression   # Windows command to connect shell to myvm1
    docker stack deploy -<file> <app>  # Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
    docker-machine scp docker-compose.yml myvm1:~ # Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
    docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   # Deploy an app using ssh (you must have first copied the Compose file to myvm1)
    eval $(docker-machine env -u)     # Disconnect shell from VMs, use native docker
    docker-machine stop $(docker-machine ls -q)               # Stop all running VMs
    docker-machine rm $(docker-machine ls -q) # Delete all VMs and their disk images
    cs


    ▲참조: https://docs.docker.com/get-started/part4/#recap-and-cheat-sheet-optional

    'programing' 카테고리의 다른 글

    UTF-8 코드  (0) 2018.01.04
    Docker 5부 스택(Stacks)  (0) 2017.12.17
    Xshell 소개 및 다운로드  (0) 2017.12.12
    Docker 3부 서비스  (0) 2017.12.09
    Docker 2부 앱 빌드 및 실행  (0) 2017.12.08
Designed by Tistory.