Drocker Swarm(Swarm Mode) 튜토리얼을 만들어 보려고 합니다.

AWS에서 Docker Swarm (Swarm Mode) 튜토리얼Getting started with swarm mode을 만들어 봤기 때문에 일본어로 정리했다.

뭘 좋아해요?

  • 노드(서버)에서 Docker 서비스의 디버깅/업데이트 가능
  • 각 노드에 대한 공개 방문Swarm Load Balancer 적당한 노드에 대한 용기 분배 요청
  • 한 용기가 이동하지 않은 노드에 접근해도 다른 노드의 용기는 응답을 되돌려줍니다
  • 내부 서비스 간의 공개 전시도 Swarm Load Balancer가 한 것 같다
  • 서비스 제공Rolling Update
  • (다른 비슷한 OSS에 비해) 매우 간단하고 처리하기 쉽다

  • ※ docker.com 공식 발표Swarm Load Balancer.

    알 수 없는 일


    Rollling Update는 처리 중인 요청이 모두 완료되면 업데이트를 시작할 수 있습니까?
    AWS에서 말하는 ELB>Connection Draining의 동작인가요?
    누가 알려주세요~m()m

    자습서 요약


    Getting started with swarm mode 여러 가지 간단한 설명을 하겠습니다.
  • 모두 AWSAmazon Linux 2017.03.1 (ami-bbf2f9dc)에서 확인
  • sudo가 귀찮아서 alias docker='sudo docker'했어요.
  • 포트 열기(Security Groups)


    각 서버의 포트를 엽니다.AWS의 Security Groups는 다음과 같습니다.
    합의
    포트 범위
    출처
    Remarks
    TCP
    8080
    0.0.0.0/0
    Nginx 컨테이너용 공개 포트
    TCP
    22
    0.0.0.0/0
    SSH 연결
    TCP
    2377
    {self-group-id}
    Swarm 클러스터 관리를 위한 통신
    TCP
    7946
    {self-group-id}
    Routing mesh ( Swarm Load Balancer )
    UDP
    7946
    {self-group-id}
    Routing mesh ( Swarm Load Balancer )
    UDP
    4789
    {self-group-id}
    Routing mesh ( Swarm Load Balancer )

    부트 노드(서버)


    AWS Constore에서 3개의 인스턴스를 시작합니다.예를 들면 아래의 느낌.
    Terminal 3개를 미리 열어두면 SSH로 로그인한 후 단계가 수월합니다.
    과업
    Unix Hostname
    IP
    manager
    ip-172-30-1-100
    172.30.1.100
    worker1
    ip-172-30-1-200
    172.30.1.200
    worker2
    ip-172-30-1-201
    172.30.1.201
    Hostname은 알기 쉽게 쓰여졌다.절차상 중요하지 않다

    시작 관리자 노드


    관리자 노드172.30.1.100에서 다음 명령을 실행합니다.
    $ docker swarm init --advertise-addr 172.30.1.100
    
    Swarm initialized: current node (udhy6l2u7e2tjo3tstmnz6tiu) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join \
        --token SWMTKN-1-67w211zr8eu6h86cfdy09liwlbc6id4nlxrwr0d8u8fcn1x95u-93n335bihesdnwz6650y2ynmy \
        172.30.1.100:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    작업 노드를 관리자 노드로 이동


    worker1 노드172.30.1.200,worker2 노드172.30.1.201에서 다음 명령을 실행합니다.
    저는 --token ... 매번 다르다고 생각해요. 선착순으로 출력된 콘솔을 복사하세요.
    $ docker swarm join \
      --token SWMTKN-1-67w211zr8eu6h86cfdy09liwlbc6id4nlxrwr0d8u8fcn1x95u-93n335bihesdnwz6650y2ynmy \
      172.30.1.100:2377
    
    This node joined a swarm as a worker.
    

    Swarm의 노드 상태 확인


    다음 명령을 사용하여 Swarm의 노드 상태를 확인할 수 있습니다.worker 노드에서도 현재 있는 노드*가 있음을 확인할 수 있습니다.
    $ docker node ls
    
    ID                           HOSTNAME         STATUS  AVAILABILITY  MANAGER STATUS
    udhy6l2u7e2tjo3tstmnz6tiu *  ip-172-30-1-100  Ready   Active        Leader
    zsj8brmyynj67bqlw4qhvpgn9    ip-172-30-1-200  Ready   Active
    p2jfiueccxcqmtt1wqe4r5kvd    ip-172-30-1-201  Ready   Active
    

    디자인 서비스


    명령docker service create {イメージ}을 처리합니다.
    $ docker service create \
      --replicas 3 \
      --name redis \
      --update-delay 10s \
      redis:3.0.6
    
    q9b5a65fkms8oix50bt487j5c
    
    명령docker service ps {サービス名}에서 확인합니다.세 개의 용기가 각각 다른 노드에서 운행한다.
    $ docker service ps redis
    
    ID            NAME     IMAGE        NODE             DESIRED STATE  CURRENT STATE               ERROR  PORTS
    2jwzoi4i2r3d  redis.1  redis:3.0.6  ip-172-30-1-100  Running        Running about a minute ago         
    1a402z122056  redis.2  redis:3.0.6  ip-172-30-1-200  Running        Running about a minute ago         
    thhbs8870wnk  redis.3  redis:3.0.6  ip-172-30-1-201  Running        Running about a minute ago 
    

    서비스 제공


    명령docker service update --image {イメージ} {サービス名}에서 진행Rolling Update.
    $ docker service update --image redis:3.0.7 redis
    
    redis
    
    낡은 컨테이너가 폐기된 것을 알고 새 컨테이너로 바뀌었다.기본적으로 컨테이너마다 업데이트됩니다.
    $ docker service ps redis
    
    ID            NAME         IMAGE        NODE             DESIRED STATE  CURRENT STATE            ERROR  PORTS
    imw1jzgdshta  redis.1      redis:3.0.7  ip-172-30-1-100  Running        Running 24 seconds ago          
    2jwzoi4i2r3d   \_ redis.1  redis:3.0.6  ip-172-30-1-100  Shutdown       Shutdown 25 seconds ago         
    vr5u12jfpe07  redis.2      redis:3.0.7  ip-172-30-1-200  Running        Running 36 seconds ago          
    1a402z122056   \_ redis.2  redis:3.0.6  ip-172-30-1-200  Shutdown       Shutdown 36 seconds ago         
    py37p0ip7mgs  redis.3      redis:3.0.7  ip-172-30-1-201  Running        Running 12 seconds ago          
    thhbs8870wnk   \_ redis.3  redis:3.0.6  ip-172-30-1-201  Shutdown       Shutdown 13 seconds ago 
    

    서비스 삭제


    명령docker service rm {サービス名} 서비스 폐기.
    $ docker service rm redis
    
    redis
    
    아니에요.
    $ docker service ps redis
    
    Error: No such service: redis
    
    실제로 컨테이너를 버리는 데 몇 초가 걸리기 때문에 docker ps 로컬 노드의 정지 처리 중인 컨테이너를 확인할 수 있다

    Routing mesh (Swarm Load Balancer)


    Swarm 노드Swarm Load Balancer에서 실행하면 서비스의 공개 포트(전격 호스트 OS의 포트)에 대한 접근이 자동으로 적당한 용기에 분배된다.

    ※ docker.공식 발표.그림의 IP 주소는 이 기사의 IP 주소와 다릅니다.떳떳하지 못하다
    2개의 컨테이너로 Nginx 서비스를 시작합니다.호스트 OS의 :8080를 공개 포트에 할당합니다.
    $ docker service create \
      --name my-web \
      --publish 8080:80 \
      --replicas 2 \
      nginx
    
    utj6pvxbcw7wjlqhlaylf2wyg
    
    세 노드 중 두 노드(worker1,worker2)가 용기를 분리했다.
    $ docker service ps my-web
    
    ID            NAME      IMAGE         NODE             DESIRED STATE  CURRENT STATE          ERROR  PORTS
    rom8aei8b8ye  my-web.1  nginx:latest  ip-172-30-1-200  Running        Running 7 seconds ago         
    5sd5szh49gvg  my-web.2  nginx:latest  ip-172-30-1-201  Running        Running 7 seconds ago 
    
    디버그된 노드 (worker1)의 Nginx에 접근하기 위해 curl 를 사용해 보십시오.
    $ curl 172.30.1.200:8080
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...
    
    용기가 완전히 움직이지 않는 노드 (관리자) 도 마찬가지로 방문하여 반환에 잘 응답합니다!
    $ curl 172.30.1.100:8080
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    ...
    

    좋은 웹페이지 즐겨찾기