SlideShare a Scribd company logo
1 of 141
Download to read offline
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
이도현
안녕하세요. 저는 현재 산업기능요원으로 일하고 있는
소프트웨어 엔지니어입니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
지난 3달간 신규 프로젝트를 진행하면서 저는
클라우드 인프라 구축 및 서버 개발자 역할을 맡았습니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
서버 개발 자체는 경험도 있고 익숙해서 큰 어려움은 없었는데
클라우드 인프라 구축을 직접해 본 건 처음해보는 일이라 초기에 많은 어려움을 겪었습니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
첫째로 공유된 자료가 많이 없어서 직접 부딪쳐가면서 몸으로 배워야 했고,
제가 선택한 방법이 과연 최선인지, 더 나은 방법은 없는지 끝없이 고민할 수 밖에 없었습니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
잘못된 방법으로 구축해버리는 바람에 데이터가 유실되거나
제가 잠든사이 서버가 죽었는데 자동으로 서비스가 복구되지 않는다면 사용자들에게 부정적인 영향을 미치니까요
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
제가 진행한 프로젝트가 금융 서비스라고 부르기는 어렵지만 나름대로 사용자의 자산을 다루는
서비스인 만큼 서버 가용성은 꼭 확보해야 하는 과제였습니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
만약 자신이 DevOps 개발자로 일해야 하는 상황이 왔는데
어디서부터 시작해야하 하는지 모르는 사람들을 위해 이 자료를 준비했습니다.
Docker및 Swarm Mode를
활용한 분산 서버 관리 A부터 Z까지 PART 1.
Docker 기본
Docker Swarm 으로 오케스트레이션 하기
아마존 클라우드에서 사용하기
CI/CD로 배포 자동화하기
제가 이야기할 주제는 크게 네가지입니다.
Docker 기본
Docker Swarm 으로 오케스트레이션 하기
아마존 클라우드에서 사용하기
CI/CD로 배포 자동화하기
이 번 1부에서는 Docker와 Docker Swarm에 대해 이야기하고
클라우드 플랫폼과 CI와 연동하는 부분은 따로 떼어 2부에서 추가적으로 다룰 예정입니다.
1부
2부
Docker 기본
Docker Swarm 으로 오케스트레이션 하기
아마존 클라우드에서 사용하기
CI/CD로 배포 자동화하기
1부 에서도 Docker Swarm의 심화 기능들을 분리하기 위해서
PART 1과 PART 2로 분리하였습니다.
PART 1, PART 2
Docker 기본
Docker Swarm 으로 오케스트레이션 하기
아마존 클라우드에서 사용하기
CI/CD로 배포 자동화하기
기본적인 내용을 다루는 PART 1의 내용은 이번 1부에서 다룰 것이고
조금 더 어려운 이야기를 하는 PART 2는 별도로 부록 형식으로 새로 슬라이드를 만들 예정입니다.
PART 1, PART 2
약간 원론적인 얘기이지만 도커에 대해 이야기하기 앞서
가상OS의 개념과 도커 이전의 가상화와 도커가 어떻게 다른지 설명드리겠습니다.
도커가 처음 발표된 건 2013년 이지만 본격적으로 상용화 단계를 거치고
개발자 커뮤니티에서 화제가 된건 불과 2-3년 전입니다.
제가 처음 개발자로 일했던 2012년에는
사내에 준비되어있는 서버 컴퓨터에 접속해서 서버를 구동하는 환경이었습니다.
왼쪽 그림처럼 하나의 서버에 웹서버를 설치해서 실행하곤 했는데요.
이런 방식에는 몇가지 불편한 점이 있습니다.
일단 서버 OS마다 웹서버 설치 및 실행 방법이 다 다릅니다.
apk, yum, rpm 등 리눅스 OS마다 여러 설치 방법이 있죠 설정법도 제각각입니다.
그리고 OS에 이미 다른 서버가 실행중이라면
여타 패키지 충돌, 포트, 설정등을 신경써야 합니다.
가상 OS를 사용하면 완벽히 격리된 공간에서 작업을 할 수 있습니다.
이 때문에 호스트가 어떤 환경에 있던간에 실행을 보장합니다.
마치 자바의 “Run Everywhere” 모토와 비슷하죠
또한 가상 이미지를 만들면 완벽한 복제본을 만들 수 있습니다.
이 복제본을 사용해서 서버를 쉽게 확장하고 관리할 수 있습니다.
이 그림은 도커 이전의 가상화기술과 도커의 차이점을 확연히 보여줍니다.
Hypervisor는 물리적 컴퓨터 위에 Guest OS를 설치해서 앱을 실행합니다.
Guest OS는 하나의 OS를 구성하는 커널 및 시스템 라이브러리 등을 가지고 있습니다.
반면 컨테이너 기반인 도커는 OS수준에서 가상화를 지원합니다.
도커 위에서 동작하는 컨테이너는 따로 커널을 설치하는게 아니라 호스트의 커널을 공유합니다.
그 위에서 필요한 시스템 라이브러리만 설치하면 되기 때문에
Hypervisor와 비교했을 때 이미지 빌드 및 실행이 빠릅니다.
빠르다
빌드도 빠르고(?) 실행도 빠르다
편하다
설치가 간편하고 여러개의 서버를 한번에 실행하는 것도 편하게 할 수 있다
안전하다
격리된 환경에서 설정을 잡을 수 있기 때문에 기존 자원과의 충돌이 없다
e. x.
이미 아파치 서버가 돌고있는 서버 컴퓨터에 아파치 환경에 새로운 웹환경을 만드는 건 꽤 어렵다
유연하다.
서버를 탄력적으로 설계 및 운영할 수 있다.
도커로 서버를 구성하면 얻을 수 있는 장점은
위와 같이 정리할 수 있습니다.
개인적으로는 서버의 구성을 유연하게 가질 수 있다는게 꽤 매력적으로 느꼈는데요.
빠르다
빌드도 빠르고(?) 실행도 빠르다
편하다
설치가 간편하고 여러개의 서버를 한번에 실행하는 것도 편하게 할 수 있다
안전하다
격리된 환경에서 설정을 잡을 수 있기 때문에 기존 자원과의 충돌이 없다
e. x.
이미 아파치 서버가 돌고있는 서버 컴퓨터에 아파치 환경에 새로운 웹환경을 만드는 건 꽤 어렵다
유연하다.
서버를 탄력적으로 설계 및 운영할 수 있다.
Micro Service vs Monolitic
서버의 구성을 이분법적으로 나누면 모놀리틱과 마이크로 서비스로 분류할 수 있습니다.
Monolitic
쇼핑몰
웹서버
장바구니
상품검색
회원관리
상품결제
배송관리
포인트관리
등등...
모놀리틱 구조란, 하나의 서버안에 모든 기능을 구현해놓은 형태를 말합니다.
편하게 개발할 수 있는 것 처럼 보이지만
Monolitic
쇼핑몰
웹서버
장바구니
상품검색
회원관리
상품결제
배송관리
포인트관리
등등...
일반적으로 시스템이 거대해지면 사이드 이펙트가 발생하기 쉽고
기능 추가 및 수정이 복잡해집니다.
Micro Service
장바
구니
장바
구니
장바
구니
결제
결제 결제 배송 배송
회원 상품 상품 상품
상품 상품 …
마이크로 서비스란, 필요한 기능을 서로다른 서버로 개발해서
하나로 결합해 시스템을 완성하는 것을 말합니다.
Micro Service
장바
구니
장바
구니
장바
구니
결제
결제 결제 배송 배송
회원 상품 상품 상품
상품 상품 …
서버를 확장할 때 전체 컴포넌트를 확장하지 않고
필요한 기능만 확장할 수 있습니다.
Micro Service
장바
구니
장바
구니
장바
구니
결제
결제 결제 배송 배송
회원 상품 상품 상품
상품 상품 …
각 서버마다 단위가 작기 때문에 개발, 테스트, 배포도
주기적으로 자주 할 수 있다는 장점이 있습니다.
Micro Service
장바
구니
장바
구니
장바
구니
결제
결제 결제 배송 배송
회원 상품2 상품2 상품2
상품2 상품2 …
새로운 기능을 배포할 때도 전체 기능을 다운시키지 않고
필요한 기능만 업데이트 할 수 있죠
Micro Service vs Monolitic
Docker love this!
도커를 사용하면 서버의 확장 및 설치가 간편해졌기 때문에
여러대의 서버를 관리하는것에 대한 부담이 훨씬 덜 해졌습니다.
Micro Service vs Monolitic
Docker love this!
이번 프로젝트에서도 메인 API, 관리자, 인증 서버, 푸시 서버, 이벤트 서버 등등
여러대의 마이크로 서비스들을 관리하고 있습니다.
이제 본격적으로 도커의 설치및 기본 사용법에 대해 다루겠습니다.
이 슬라이드를 보고 도커를 처음 접하신 분들을 위해 준비했습니다.
추후에 이어질 Docker Swarm에 대한 이해를 돕기위한 용어 설명 및
간단한 명령어만을 보여주기 때문에 좀 더 자세한 내용은 관련 홈페이지 및 다른 강의를 참고해주세요.
도커 공식 홈페이지에는 각 OS별 설치법이 나열되어있습니다.
저는 맥북에서 작업을 하기 때문에 홈페이지에서 제공하는 설치파일을 통해 도커를 설치했습니다.
https://docs.docker.com/docker-for-mac/install/#what-to-know-before-you-install
이미지 / 컨테이너
도커의 명령어를 배우려면 먼저 이미지와 컨테이너를 분리해서 바라볼 수 있어야 합니다.
이미지 = 클래스
컨테이너 = 객체
객체지향개발에서 쓰이는 말에 비유하면
이미지는 클래스로 컨테이너는 객체로 비유할 수 있습니다.
이미지 = 클래스
컨테이너 = 객체
서버의 구성 및 실행환경을 정의하는 이미지를 가지고
실제로 돌아가는 컨테이너를 여러개 만들 수 있습니다.
main.py
Hello, World!
도커 이미지를 생성하고 이미지로 컨테이너를 띄울 수 있도록
간단한 Hello, World예제를 준비했습니다.
main.py
Hello, World!
로컬호스트로 접속하면 Hello, World! 라는 기요미 문구를 보여주는
Flask 애플리케이션입니다
main.py
Hello, World!
이 예제를 실행하기 위해서 파이썬과 Flask를 설치할 필요는 없습니다.
어차피 도커 환경에서 다 설치하니까요.
Dockerfile
Hello, World!
Docker는 Dockerfile을 참조해서 명시되어있는
명령어들을 자동으로 수행한 뒤에 이미지를 빌드합니다.
Dockerfile
Hello, World!
이번 예제에서는 누군가 Nginx서버에서 Flask를 구동하는 환경을 만들어둔 덕분에
별다른 추가 설정없이 내려받아서 사용했습니다.
Dockerfile
Hello, World!
편하긴 하지만 이런 오픈된 이미지에는 악성코드가 심어져 있는 경우가 있기에
실제 운영환경에서는 ubuntu같은 이미지에서 시작하는 것을 권장합니다.
Dockerfile
Hello, World!
요즘에는 남의 서버에서 비트코인 채굴하려는 사람들이 많아서
이런식의 함정들이 종종 있습니다.. 조심해야겠죠
T
이미지 생성하기
$ cd ~/Projects/helloworld
$ docker build -t helloworld .
$ docker images
Terminal
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest 9cb9a8177c14 3 seconds ago 946MB
도커 이미지는 docker build 명령어를 통해 간단히 만들 수 있습니다.
빌드가 끝나고 난 뒤 docker images명령어를 실행하면 위와같이 설치된 이미지 목록이 나옵니다.
T
이미지 생성하기
$ cd ~/Projects/helloworld
$ docker build -t helloworld .
$ docker images
Terminal
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest 9cb9a8177c14 3 seconds ago 946MB
출력 결과로 helloworld라는 이미지가 생성되었음을 알 수 있습니다.
T
컨테이너 실행하기
$ docker run -d —p 3000:80 helloworld
Terminal
이제 docker run 명령어로 특정 이미지를 실행할 수 있습니다.
T
컨테이너 실행하기
$ docker run -d —p 3000:80 helloworld
Terminal
-d 옵션은 이 컨테이너를 백그라운드로 실행하겠다는 것을 의미합니다.
-d
T
컨테이너 실행하기
$ docker run -d —p 3000:80 helloworld
Terminal
-p 옵션으로 호스트의 포트와 도커 컨테이너 내부의 포트를 바인딩 할 수 있습니다.
도커 컨테이너 내부에서는 Nginx서버가 80으로 실행하고 있는데
-p
T
컨테이너 실행하기
$ docker run -d —p 3000:80 helloworld
Terminal
호스트에서는 포트 3000번으로 붙겠다는 의미입니다.
-p
T
컨테이너 실행하기
$ docker run -d —p 3000:80 helloworld
Terminal
마지막에는 실행시킬 이미지명을 명시합니다.
helloworld
T
실행중인 컨테이너 확인
$ docker ps
Terminal
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
36dac4a33de3 helloworld “/entrypoint.sh /sta…” 2 seconds ago
Up 1 second 443/tcp, 0.0.0.0:3000->80/tcp infallible_yonath
리눅스에서 ps명령어로 프로세스를 확인하듯
docker ps 명령어를 통해 실행중인 컨테이너들을 확인할 수 있습니다.
T
실행중인 컨테이너 확인
$ curl 127.0.0.1:3000
Terminal
Hello, World!
이제 해당 url로 접속하면 컨테이너가 실행되고 있음을 눈으로 확인할 수 있습니다.
이미지
공유하기
생성한 이미지를 다른 호스트에서 공유하려면 도커 이미지를 저장하는 서버가 필요합니다.
이미지
공유하기
이 이미지 저장소를 레지스트리라 부릅니다.
이 레지스트리는 설치해서 사용할 수 있고 클라우드 서비스인 도커 허브를 이용할 수도 있습니다.
이미지
공유하기
별도의 설정없이 도커 기본 명령어만을 사용하면 자동으로
이 Docker Hub에 이미지가 업로드 됩니다.
이미지
공유하기
튜토리얼의 진행을 위해서 Docker Hub에서 회원가입을 한 후 진행합니다.
T
이미지
공유하기
$ docker login
Terminal
id : test1234
pw : *****
Docker Hub에 가입이 완료되었으면 로그인 명령어를 통해
Docker Hub에 원격으로 접속합니다.
T
이미지
공유하기 $ docker tag helloworld <DockerHub ID>/helloworld
$ docker push cailhuiris/helloworld
Terminal
d61c69f2fa98: Pushed
52eb842a98fa: Pushed
847921f88ca8: Pushed
68119dafa79b: Layer already exists
aa2c2d8abe13: Layer already exists
cb48b94dec5c: Layer already exists
ac3971ed0cde: Layer already exists
754c98f4a299: Layer already exists
8fb1ed4b97da: Layer already exists
45b9ffccb837: Layer already exists
c73e4bc27fd5: Layer already exists
c31292db9897: Layer already exists
e3e5f300548e: Layer already exists
eddfc23cc6e4: Layer already exists
79d02735661d: Layer already exists
de7c712608b5: Layer already exists
8da2d25a1bd0: Layer already exists
7c95a319416c: Layer already exists
b7442a669f28: Layer already exists
. . .
그 다음 push 명령어를 사용하여 이미지를 허브에 업로드합니다.
별도의 설정을 거치지 않았기 때문에 자동으로 Docker Hub에 업로드 됩니다.
T
이미지
공유하기 $ docker tag helloworld cailhuiris/helloworld
$ docker push cailhuiris/helloworld
Terminal
d61c69f2fa98: Pushed
52eb842a98fa: Pushed
847921f88ca8: Pushed
68119dafa79b: Layer already exists
aa2c2d8abe13: Layer already exists
cb48b94dec5c: Layer already exists
ac3971ed0cde: Layer already exists
754c98f4a299: Layer already exists
8fb1ed4b97da: Layer already exists
45b9ffccb837: Layer already exists
c73e4bc27fd5: Layer already exists
c31292db9897: Layer already exists
e3e5f300548e: Layer already exists
eddfc23cc6e4: Layer already exists
79d02735661d: Layer already exists
de7c712608b5: Layer already exists
8da2d25a1bd0: Layer already exists
7c95a319416c: Layer already exists
b7442a669f28: Layer already exists
. . .
도커는 빌드 과정의 시간을 최소화 하기 위해서
이전에 생성된 이미지에서 변경된 부분만을 새로 빌드합니다.
T
$ docker tag helloworld cailhuiris/helloworld
$ docker push cailhuiris/helloworld
Terminal
d61c69f2fa98: Pushed
52eb842a98fa: Pushed
847921f88ca8: Pushed
68119dafa79b: Layer already exists
aa2c2d8abe13: Layer already exists
cb48b94dec5c: Layer already exists
ac3971ed0cde: Layer already exists
754c98f4a299: Layer already exists
8fb1ed4b97da: Layer already exists
45b9ffccb837: Layer already exists
c73e4bc27fd5: Layer already exists
c31292db9897: Layer already exists
e3e5f300548e: Layer already exists
eddfc23cc6e4: Layer already exists
79d02735661d: Layer already exists
de7c712608b5: Layer already exists
8da2d25a1bd0: Layer already exists
7c95a319416c: Layer already exists
b7442a669f28: Layer already exists
. . .
847921f88ca8: Pushed
de7c712608b5: Layer already exists
b7442a669f28: Layer already exists
-> helloworld.py
-> Nginx
-> Ubuntu Libraries
이미지
공유하기
서버에서 필요한 자원 중 변경된 부분만 새로 푸시하고
변경되지 않은 부분은 이전에 이미 빌드한 부분을 그대로 사용합니다.
*위에 적힌 부분은 예시로서 실제와는 다릅니다.
Docker Swarm
하나의 호스트에서 동작하는 도커 컨테이너는
build, run, stop, start 등의 명령어로도 충분히 관리할 수 있습니다.
로고 너무 귀여워..
Docker Swarm
하지만 다수의 호스트에서 다양한 종류의 컨테이너 서버를 다루어야 할 경우
기본 명령어로는 버거운 상황이 발생하는데
Docker Swarm
Docker Swarm을 사용하면 여러대의 분산 서버에서 어떤 컨테이너라도
쉽게 실행, 중지, 확장, 감소, 배포 등의 작업을 수행할 수 있습니다.
Docker에 기본적으로 내장되어있기 때문에
별도의 설치과정이 필요하지 않다.
Docker 1.12.0 이후 버전부터는 Swarm이 내장되어 있어서
별도의 설치과정이 필요하지 않아 바로 사용할 수 있습니다.
Docker에 기본적으로 내장되어있기 때문에
별도의 설치과정이 필요하지 않다.
보통 이런 멀티-호스트에서 컨테이너 배포 관리 하는 행위를 오케스트레이션이라고 부릅니다.
도커 스웜 말고도 수많은 오케스트레이션 툴들이 존재합니다.
대표적으로 구글에서 개발한 Kubernetes가 있습니다.
수백대의 서버를 운영하는게 아니라면 어려운 사용법을 공부하느라 피해입을 멘탈 손해가 도입의 이득보다
크기 때문에 처음엔 도커 스웜을 사용하는 것을 추천드립니다.
컨테이너의 배포 및 프로비저닝 자동화
컨테이너가 중지된 상황일 경우 재스케줄링
클러스터 내의 컨테이너의 로드 밸런싱
서비스 외부에 노출시키기
컨테이너와 호스트의 상태 모니터링
…
오케스트레이션 툴들이 자동으로 해주는 일을 위와 같이 나열할 수 있습니다.
앞으로 위와 같은 일들을 하는 걸 ‘오케스트레이션 한다’ 라고 부르겠습니다.
특정 컨테이너를 실행중인 호스트 발견
클러스터 내 네트워크 분리
컨테이너 스케일 아웃-인
롤링 업데이트
…
그 외에도 서버 개발자가 직접 위와 같은 일들을 할 수 있습니다.
Manager
Worker
Service
Routing Mesh
Ingress Network
Overlay Network
Bridge Network
Docker Swarm을 제대로 사용하고 이해하려면
위의 기본용어들을 잘 숙지하고 있어야 합니다.
Manager
Worker
Service
Routing Mesh
Ingress Network
Overlay Network
Bridge Network
이제 부터 하나씩 배워보도록 하겠습니다.
Manager 노드, Worker 노드
Manager
Worker
Manager
Worker
Worker
도커 스웜 내에서 존재하는 호스트는
매니저 노드, 워커 노드 둘 중 하나가 됩니다.
Manager 노드, Worker 노드
Manager
Worker
Manager
Worker
Worker
매니저 노드는 클러스터관리 및 컨테이너 오케스트레이의 의사결정을 하고
워커 노드는 매니저의 지시에 따라 컨테이너를 열심히 실행하는 노예 역할을 합니다.
Manager 노드, Worker 노드
Manager
Worker
Manager (Leader)
Worker
Worker
매니저 노드 중에서도 리더로 선출된 인싸가 주요 관리 업무를 맡고
나머지 매니저 노드는 리더가 가지고 있는 오케스트레이션 업무일지를 동일하게 유지합니다.
Manager 노드, Worker 노드
Worker
Worker
Worker
만약, 리더로 선출된 노드에 장애가 발생하면
다른 매니저 노드가 리더로 선출되서 기존 업무를 이어갑니다.
Manager (Leader)
실제로 매니저 노드와 워커 노드를 생성해 봅시다.
T
$ docker-machine create —-driver virtualbox manager1
Terminal (Mac)
T
$ docker-machine create —-driver hyperv manager1
Terminal (Windows)
Manager 노드, Worker 노드
docker-machine 명령어는 로컬에 도커 호스트를 설치하고 실행하는 명령어입니다.
도커에서 컨테이너를 관리하는 daemon 프로세스를 실행하는 가상머신을 실행합니다.
Manager 노드, Worker 노드
T
$ docker-machine create —-driver virtualbox manager1
Terminal (Mac)
T
$ docker-machine create —-driver hyperv manager1
Terminal (Windows)
설치하는 환경이 Mac이면 위의 명령어를,
Window라면 아래 명령어를 실행하면 됩니다.
Manager 노드, Worker 노드
T
$ docker-machine create —-driver virtualbox manager1
Terminal (Mac)
T
$ docker-machine create —-driver hyperv manager1
Terminal (Windows)
같은 방법으로 manager2, manager3, worker1, worker2, worker3
총 6개의 가상 호스트를 설치했습니다.
T
$ docker-machine create —-driver virtualbox manager2
$ docker-machine create —-driver virtualbox manager3
$ docker-machine create —-driver virtualbox worker1
$ docker-machine create —-driver virtualbox worker2
$ docker-machine create —-driver virtualbox worker3
Terminal
Manager 노드, Worker 노드
Manager 노드, Worker 노드
설치가 끝났으면 docker-machine ls 명령어로 실행중인
호스트의 이름과 IP를 확인할 수 있습니다.
T
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL
manager1 - virtualbox Running tcp://192.168.99.100:2376
manager2 - virtualbox Running tcp://192.168.99.101:2376
manager3 - virtualbox Running tcp://192.168.99.102:2376
worker1 - virtualbox Running tcp://192.168.99.103:2376
worker2 - virtualbox Running tcp://192.168.99.104:2376
worker3 - virtualbox Running tcp://192.168.99.105:2376
Terminal
Manager 노드, Worker 노드
ssh명령어로 매니저 노드에 접속해서
Swarm 클러스터를 만들어 줍니다.
T
$ docker-machine ip manager1
192.168.99.100
$ docker-machine ssh manager1
docker@manager1:~$ docker swarm init 
—-advertise-addr 192.168.99.100
To add a worker to this swarm, run the following command:
docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
To add a manager to this swarm,
run ‘docker swarm join-token manager’
and follow the instructions.
Terminal
Manager 노드, Worker 노드
최초로 docker swarm init 을 실행한 노드가 자동으로 매니저 노드가 됩니다.
T
$ docker-machine ip manager1
192.168.99.100
$ docker-machine ssh manager1
docker@manager1:~$ docker swarm init 
—-advertise-addr 192.168.99.100
To add a worker to this swarm, run the following command:
docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
To add a manager to this swarm,
run ‘docker swarm join-token manager’
and follow the instructions.
Terminal
$ docker-machine ip manager1
192.168.99.100
$ docker-machine ssh manager1
docker@manager1:~$ docker swarm init 
—-advertise-addr 192.168.99.100
To add a worker to this swarm, run the following command:
docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
To add a manager to this swarm,
run ‘docker swarm join-token manager’
and follow the instructions.
Manager 노드, Worker 노드
출력 결과가 알려주는 명령어를 다른 호스트에서 사용하면
생성된 스웜 클러스터에 워커 노드!로 참여할 수 있습니다.
T
Terminal
docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
$ docker-machine ip manager1
192.168.99.100
$ docker-machine ssh manager1
docker@manager1:~$ docker swarm init 
—-advertise-addr 192.168.99.100
To add a worker to this swarm, run the following command:
docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
To add a manager to this swarm,
run ‘docker swarm join-token manager’
and follow the instructions.
Manager 노드, Worker 노드
매니저 노드!로 참여하려면 하이라이트된 명령어를 실행하고
나오는 결과를 참고해서 따라하면 됩니다.
T
Terminal
docker swarm join-token manager
Manager 노드, Worker 노드
위와 같이 노가다해서 모든 노드를 클러스터에 참여 시켰습니다.
T
$ docker-machine ssh manager2
docker@manager2:~$ docker swarm join —-token 
SWMTKN……dwznw 192.168.99.100:2377 && exit
$ docker-machine ssh manager3
docker@manager3:~$ docker swarm join —-token 
SWMTKN……dwznw 192.168.99.100:2377 && exit
$ docker-machine ssh worker1
docker@worker1:~$ docker swarm join —-token 
SWMTKN……dg06n 192.168.99.100:2377 && exit
. . .
Terminal
Manager 노드, Worker 노드
보시면 워커 노드로 참여할 때와 매니저 노드로 참여할 때 토큰값이 다른 걸 알 수 있습니다.
T
$ docker-machine ssh manager2
docker@manager2:~$ docker swarm join —-token 
SWMTKN……dwznw 192.168.99.100:2377 && exit
$ docker-machine ssh manager3
docker@manager3:~$ docker swarm join —-token 
SWMTKN……dwznw 192.168.99.100:2377 && exit
$ docker-machine ssh worker1
docker@worker1:~$ docker swarm join —-token 
SWMTKN……dg06n 192.168.99.100:2377 && exit
. . .
Terminal
SWMTKN……dwznw
SWMTKN……dg06n
SWMTKN……dwznw
Manager 노드, Worker 노드
다시 manager1로 접속해서 위와 같이 연결된 노드 목록을 확인해 봅시다.
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Manager 노드, Worker 노드
최초로 클러스터를 생성한 manager1노드가 리더로 선출 된 것을 볼 수 있습니다.
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Tmanager1 Ready Leader
Manager 노드, Worker 노드
이렇게 해서 매니저와 워커의 역할로 나눠진 노드를 각각 3개씩 구성했습니다.
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Tmanager1 Ready Leader
Manager 노드, Worker 노드
이제 이전에 같이 만들었던 헬로월드 서버를
스웜 클러스터에 배포하려고 하는데
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Tmanager1 Ready Leader
Manager 노드, Worker 노드
단일 호스트에서는 단순히 docker run 명령어를 통해
한 개의 컨테이너만을 실행시켰지만
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Tmanager1 Ready Leader
Manager 노드, Worker 노드
분산 환경에서는 다수의 컨테이너를 한 번에 실행하고
확장 & 감소를 할 수 있어야 합니다.
T
$ docker-machine ssh manager1
docker@manager1:~$ docker node list
ID HOSTNAME STATUS MANAGER STATUS
r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader
s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable
v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable
mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready
dp2wzr8zgfp875atxtrc1pjgc worker2 Ready
icnigqqfj081skxi222h60lfi worker3 Ready
Terminal
Tmanager1 Ready Leader
Service
몇개의 컨테이너를 실행할 지, 어떤 서버에 할당할 지 등의 정보를 가지면서 분산 환경에서
실행되는 컨테이너들의 논리적 단위를 Service라고 부릅니다
Worker
Manager
Worker
Worker
HelloWorld Service
Number of node: 3
image: helloworld
port: 80->80
. . .
Service
이 서비스를 생성해서 헬로월드 서버를
각 노예들에게 배포하도록 하겠습니다.
Worker
Manager
Worker
Worker
HelloWorld Service
Number of node: 3
image: helloworld
port: 80->80
. . .
Service
서비스는 docker service create 명령어를 통해 생성할 수 있습니다.
T
docker@manager1:~$ docker service create 
--name=helloworld 
--publish=3000:80/tcp 
--constraint=node.role==worker 
--replicas=3 
--with-registry-auth 
<Docker Hub ID>/helloworld
Terminal
Service
명령어 옵션으로 클라우드 외의 노출할 포트, 컨테이너 개수 등을 설정할 수 있습니다.
T
docker@manager1:~$ docker service create 
--name=helloworld 
--publish=3000:80/tcp 
--constraint=node.role==worker 
--replicas=3 
--with-registry-auth 
<Docker Hub ID>/helloworld
Terminal
docker@manager1:~$ docker service create 
--name=helloworld 
--publish=3000:80/tcp 
--constraint=node.role==worker 
--replicas=3 
--with-registry-auth 
<Docker Hub ID>/helloworld
Service
명령어 옵션으로 클라우드 외에 노출할 포트, 컨테이너 개수 등
서비스의 각종 설정을 할 수 있습니다.
T
Terminal
-> 서비스 이름
-> 3000 포트를 80포트에 바인딩
-> 워커 노드에만 배포
-> 컨테이너 3개만 실행한다.
Service
docker ps 명령어와 비슷하게 docker service ps를 통해 클러스터 내에
실행중인 helloworld 컨테이너 정보를 볼 수 있습니다.
T
docker@manager1:~$ docker service ps helloworld
ID NAME IMAGE NODE
sdlh3fke7cje helloworld.1 helloworld:latest worker1
ib9xs0b6uypx helloworld.2 helloworld:latest worker2
rhogifxyvcjq helloworld.3 helloworld:latest worker3
Terminal
Service
총 3개의 컨테이너가 각 워커에 실행 중인 것을 알 수 있습니다.
T
docker@manager1:~$ docker service ps helloworld
ID NAME IMAGE NODE
sdlh3fke7cje helloworld.1 helloworld:latest worker1
ib9xs0b6uypx helloworld.2 helloworld:latest worker2
rhogifxyvcjq helloworld.3 helloworld:latest worker3
Terminal
Service
실제로 워커 하나의 IP를 조회 해본 뒤
브라우저로 접속해보면 서버가 실행중인 것을 확인할 수 있습니다.
T$ docker-machine ip worker1
192.168.99.103
Terminal
Service
현재 스웜 클러스터를 그림으로 표시하면 위와 같이 나타낼 수 있습니다.
Worker
Manager (Leader)
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Manager Manager
Docker Swarm
Service Scale-Out, Scale-In
서비스 단위로 컨테이너를 관리하면
간단한 명령어로 필요한 순간마다 컨테이너를 늘리거나 줄일 수 있습니다.
Service Scale-Out, Scale-In
scale 명령어를 사용해 기존에 3개만 실행했던 컨테이너를 5개 까지 확장하였습니다.
T
docker@manager1:~$ docker service scale helloworld=5
helloworld scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
Terminal
Service Scale-Out, Scale-In
scale 명령어 이후 스웜 클러스터를 도식화하면 위와 같습니다.
현재 워커 노드가 3개뿐이여서 하나의 노드가 두 개의 컨테이너를 실행하는 상황이 연출되었는데
Worker
Manager (Leader)
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Manager Manager
Docker Swarm
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
helloworld
(3000 -> 80)
Service Scale-Out, Scale-In
워커 노드가 많을 경우에는 각 노드에
컨테이너를 균등하게 배치합니다.
Worker
Manager (Leader)
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Manager Manager
Docker Swarm
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
helloworld
(3000 -> 80)
Service Update
현재 실행중인 컨테이너를 새로운 버전으로 배포하는 것도
도커 명령어로 손쉽게 할 수 있습니다.
Worker
Helloworld:1
(3000 -> 80)
Helloworld:2
(3000 -> 80)
Service Update
사실 저희 프로젝트에서 도커 스웜을 도입한 가장 큰 이유가 자동화의 매력이었는데요
Worker
Helloworld:1
(3000 -> 80)
Helloworld:2
(3000 -> 80)
Swarm 도입 이전
배포 프로세스
저희 팀은 도커 스웜 도입 이전에는 직접 AWS 클라우드에서 인스턴스를 생성해
새로운 버전의 도커를 실행해 인스턴스 자체를 교체하는 방식으로 배포를 진행했었습니다.
EC2 Instance
Helloworld:1
(Stopped)
신규 버전이 있을때마다 이렇게 노동했다!..
EC2 Instance
Helloworld:2
도커 스웜 도입 이후에는 CI툴을 이용해서 배포 자동화를 구축 했습니다.
CI Runner에서 매니저 노드에 접속해서 명령어하나만 호출해주면 되기 때문에
Swarm 도입 이후
배포 프로세스
소스 푸시 서비스 업데이트
명령어 호출
새로운 컨테이너로
교체
혹시나 배포 자동화를 고민하고 계신다면 쉽게 도입하실 수 있을 겁니다.
Swarm 도입 이후
배포 프로세스
소스 푸시 서비스 업데이트
명령어 호출
새로운 컨테이너로
교체
서버를 배포하는 방법을 보여드리기 위해 이전에 작성했던
Hello, World 서버에 한글화를 도입했습니다.
Service Update Example
main.py
같은 방식으로 도커 이미지를 생성하고
레지스트리에 업로드 합니다.
Service Update Example
T
$ docker build -t helloworld .
$ docker tag helloworld <Docker Hub ID>/helloworld
$ docker push <Docker Hub ID>/helloworld
Terminal
** <Docker Hub ID> 에는 본인 도커 허브 계정명을 적어주세요.
이제 매니저 노드에 접속해서 service update 명령어를 사용하면
컨테이너가 새로운 버전으로 배포된 걸 확인할 수 있습니다.
Service Update Example
T
docker@manager1:~$ docker service update 
--image <Docker Hub ID>/helloworld 
—-with-registry-auth helloworld
Terminal
CI 파이프라인으로 매니저 노드에서 이 명령어를 실행하면
배포 자동화 프로세스가 완성됩니다
Service Update Example
T
docker@manager1:~$ docker service update 
--image <Docker Hub ID>/helloworld 
—-with-registry-auth helloworld
Terminal
서비스를 업데이트 할 때 컨테이너를 동시에 교체해버리면 서버가 재시작 되는 시간동안
다운 타임이 발생하기 때문에 사용자 입장에서는 동작이 안되는 것 처럼 보입니다.
무중단 배포
Service Update Example
Docker Swarm에서는 컨테이너를 한번에 교체하지 않고
순차적으로 바꾸는 Rolling Update 전략을 지원합니다.
무중단 배포
Service Update Example
서비스 업데이트 명령어에 —update-delay 옵션을 추가 하면
전체 컨테이너가 교체되는 시간을 조절할 수 있습니다.
T
docker@manager1:~$ docker service update 
—-update-delay=120s 
--image <Docker Hub ID>/helloworld 
—-with-registry-auth helloworld
Terminal
—-update-delay=120s 
Service Update Example
바로
Worker1
helloworld:v0.1.1
(3000 -> 80)
명령어 실행 직 후
Worker1
helloworld:v0.1.0
(3000 -> 80)
Worker1
helloworld:v0.1.0
(3000 -> 80)
이렇게
Worker1
helloworld:v0.1.1
(3000 -> 80)
120초 후 Worker1
Worker1
helloworld:v0.1.0
(3000 -> 80)
helloworld:v0.1.1
(3000 -> 80)
말이죠
Worker1
helloworld:v0.1.1
(3000 -> 80)
240초 후
Worker1
Worker1
helloworld:v0.1.0
(3000 -> 80)
helloworld:v0.1.1
(3000 -> 80)
helloworld:v0.1.1
(3000 -> 80)
지금까지 서비스의 생성, 업데이트, 스케일 아웃 기능까지 간단하게 알아보았습니다.
지금은 도커 스웜의 재밌는 기능 하나를 소개하려고 합니다.
Routing Mesh
보통 사용자는 단일 엔드 포인트를 통해
서비스를 이용 합니다.
api.helloworld.com
123.123.123.123
Routing Mesh
다중 서버를 이용하는 경우엔
로드밸런서가 사용자 요청을 분배합니다.
Load Balancer
(123.123.123.123)
Server 1
Server 2
Server 3
Routing Mesh
만약 서버를 Docker Swarm으로 구성하는 경우에는
어떻게 단일 엔드 포인트를 제공할 수 있을까요?
Load Balancer
(123.123.123.123)
Server 1
Server 2
Server 3
Routing Mesh
Docker Swarm은 Routing Mesh라는 재밌는 프로토콜을 가지고 있습니다.
Load Balancer
(123.123.123.123)
Server 1
Server 2
Server 3
Routing Mesh
Routing Mesh는 Swarm 안의 어떤 노드에 요청을 해도
해당 컨테이너로 요청을 라우팅 하는 기능입니다.
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Managerport : 3000
URL : /
Routing Mesh
예를 들어 헬로월드 컨테이너를 실행하지 않는
매니저 노드에 3000번 포트로 요청을 보내도
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Managerport : 3000
URL : /
Routing Mesh
헬로월드 컨테이너를 다른 노드에서 찾아내
해당 노드로 요청을 라우트 합니다.
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Worker
helloworld
(3000 -> 80)
Managerport : 3000
URL : /
Routing Mesh
도커 스웜안에 존재하는 모든 노드는
로드밸런서를 하나씩 가지고 있습니다.
Routing Mesh
이 로드 밸런서는 기본적으로 라운드-로빈 방식으로 요청을 라우팅 하고
스웜 내의 모든 컨테이너의 위치 정보를 가지고 있습니다.
Routing Mesh
이렇게 도커 스웜 만으로도 자체적인 단일 엔드 포인트를 만들 수 있습니다.
Routing Mesh
Routing Mesh기능을 활성화 하려면
모든 노드가 서로에게 7946 TCP/UDP, 4789 UDP 포트를 허용 하면 됩니다.
Routing Mesh
Worker
Manager (Leader)
Worker Worker
Manager Manager
Docker Swarm
7946 TCP
7946 UDP
4789 UDP
7946 TCP
7946 UDP
4789 UDP
7946 TCP
7946 UDP
4789 UDP
7946 TCP
7946 UDP
4789 UDP
7946 TCP
7946 UDP
4789 UDP
7946 TCP
7946 UDP
4789 UDP
지금까지 도커 스웜의 설치 및 구성, 서버 배포, 업데이트, 스케일 아웃,
로드밸런서 등에 대해 다루었습니다.
사실 이 말고도 Network, Stack등 다루고 싶은 내용은 더 많았지만
이 이후부터는 조금 심화된 내용이라 PART 2에서 간단하게 나마 다루도록 하겠습니다.
감사합니다. ^^
이도현

More Related Content

What's hot

MariaDB, MySQL and Ansible: automating database infrastructures
MariaDB, MySQL and Ansible: automating database infrastructuresMariaDB, MySQL and Ansible: automating database infrastructures
MariaDB, MySQL and Ansible: automating database infrastructuresFederico Razzoli
 
Docker 사내교육 자료
Docker 사내교육 자료Docker 사내교육 자료
Docker 사내교육 자료Juneyoung Oh
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법pyrasis
 
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3Ji-Woong Choi
 
Docker 활용법: dumpdocker
Docker 활용법: dumpdockerDocker 활용법: dumpdocker
Docker 활용법: dumpdockerJaehwa Park
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...Vietnam Open Infrastructure User Group
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!pyrasis
 
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsi
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsiRoom 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsi
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsiVietnam Open Infrastructure User Group
 
Authentification TLS/SSL sous OpenVPN
Authentification TLS/SSL sous OpenVPNAuthentification TLS/SSL sous OpenVPN
Authentification TLS/SSL sous OpenVPNIsmail Rachdaoui
 
Konfigurasi ftp server pada debian 7
Konfigurasi ftp server pada debian 7Konfigurasi ftp server pada debian 7
Konfigurasi ftp server pada debian 7CyberSpace
 
왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법GeunCheolYeom
 
Qemu & KVM Guide #1 (intro & basic)
Qemu & KVM Guide #1 (intro & basic)Qemu & KVM Guide #1 (intro & basic)
Qemu & KVM Guide #1 (intro & basic)JungIn Jung
 
Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護Justin Lin
 
Ngrok을 이용한 Nginx Https 적용하기.pptx
Ngrok을 이용한 Nginx Https 적용하기.pptxNgrok을 이용한 Nginx Https 적용하기.pptx
Ngrok을 이용한 Nginx Https 적용하기.pptxwonyong hwang
 
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)충섭 김
 
Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기JeongHun Byeon
 
Cephfs Snapshot Mirroring
Cephfs Snapshot MirroringCephfs Snapshot Mirroring
Cephfs Snapshot MirroringVenky Shankar
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 

What's hot (20)

MariaDB, MySQL and Ansible: automating database infrastructures
MariaDB, MySQL and Ansible: automating database infrastructuresMariaDB, MySQL and Ansible: automating database infrastructures
MariaDB, MySQL and Ansible: automating database infrastructures
 
Docker 사내교육 자료
Docker 사내교육 자료Docker 사내교육 자료
Docker 사내교육 자료
 
Ansible 101
Ansible 101Ansible 101
Ansible 101
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법
 
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
[오픈소스컨설팅]Docker기초 실습 교육 20181113_v3
 
Docker 활용법: dumpdocker
Docker 활용법: dumpdockerDocker 활용법: dumpdocker
Docker 활용법: dumpdocker
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...
Unrevealed Story Behind Viettel Network Cloud Hotpot | Đặng Văn Đại, Hà Mạnh ...
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
 
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsi
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsiRoom 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsi
Room 1 - 2 - Nguyễn Văn Thắng & Dzung Nguyen - Proxmox VE và ZFS over iscsi
 
Authentification TLS/SSL sous OpenVPN
Authentification TLS/SSL sous OpenVPNAuthentification TLS/SSL sous OpenVPN
Authentification TLS/SSL sous OpenVPN
 
Konfigurasi ftp server pada debian 7
Konfigurasi ftp server pada debian 7Konfigurasi ftp server pada debian 7
Konfigurasi ftp server pada debian 7
 
왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법왕초보를 위한 도커 사용법
왕초보를 위한 도커 사용법
 
Qemu & KVM Guide #1 (intro & basic)
Qemu & KVM Guide #1 (intro & basic)Qemu & KVM Guide #1 (intro & basic)
Qemu & KVM Guide #1 (intro & basic)
 
Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護
 
Ngrok을 이용한 Nginx Https 적용하기.pptx
Ngrok을 이용한 Nginx Https 적용하기.pptxNgrok을 이용한 Nginx Https 적용하기.pptx
Ngrok을 이용한 Nginx Https 적용하기.pptx
 
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
쿠버네티스를 이용한 기능 브랜치별 테스트 서버 만들기 (GitOps CI/CD)
 
Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기Node.js API 서버 성능 개선기
Node.js API 서버 성능 개선기
 
Cephfs Snapshot Mirroring
Cephfs Snapshot MirroringCephfs Snapshot Mirroring
Cephfs Snapshot Mirroring
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 

Similar to Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]

[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)Ildoo Kim
 
Introduce Docker
Introduce DockerIntroduce Docker
Introduce DockerYongbok Kim
 
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편negabaro
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Nanha Park
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTHosang Jeon
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTLOGISPOT
 
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)CONNECT FOUNDATION
 
[Nomad connection]docker seminar 15.10.08
[Nomad connection]docker seminar 15.10.08[Nomad connection]docker seminar 15.10.08
[Nomad connection]docker seminar 15.10.08Nomad Connection, Inc.
 
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Clouddocker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea CloudJude Kim
 
[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1Ji-Woong Choi
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호용호 최
 
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXpressEngine
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Steve Shim
 
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정양재동 코드랩
 
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)Ji-Woong Choi
 
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container DayAmazon Web Services Korea
 

Similar to Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요] (20)

[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)[17.01.19] docker introduction (Korean Version)
[17.01.19] docker introduction (Korean Version)
 
Introduce Docker
Introduce DockerIntroduce Docker
Introduce Docker
 
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편aws/docker/rails를 활용한 시스템 구축/운용 - docker편
aws/docker/rails를 활용한 시스템 구축/운용 - docker편
 
Docker osc 0508
Docker osc 0508Docker osc 0508
Docker osc 0508
 
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
Deview 2013 :: Backend PaaS, CloudFoundry 뽀개기
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOT
 
Introduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOTIntroduction to Docker - LOGISPOT
Introduction to Docker - LOGISPOT
 
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)
[부스트캠퍼세미나]육진혁_(대충 도커 쓰자는 이야기)
 
[Nomad connection]docker seminar 15.10.08
[Nomad connection]docker seminar 15.10.08[Nomad connection]docker seminar 15.10.08
[Nomad connection]docker seminar 15.10.08
 
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Clouddocker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
 
[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호
 
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기
 
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
[9월 런치 세미나] 도커와 쿠버네티스 기술에 스며들다
 
AWS + Docker in Vingle
AWS + Docker in VingleAWS + Docker in Vingle
AWS + Docker in Vingle
 
Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1Docker 사용가이드 public v0.1
Docker 사용가이드 public v0.1
 
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
[W3C HTML5 2017] Docker & DevOps에서 Serverless & NoOps로의 여정
 
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
[오픈소스컨설팅]Docker on Cloud(Digital Ocean)
 
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
 

Docker 기본 및 Docker Swarm을 활용한 분산 서버 관리 A부터 Z까지 [전체모드에서 봐주세요]

  • 1. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1. 이도현
  • 2. 안녕하세요. 저는 현재 산업기능요원으로 일하고 있는 소프트웨어 엔지니어입니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 3. 지난 3달간 신규 프로젝트를 진행하면서 저는 클라우드 인프라 구축 및 서버 개발자 역할을 맡았습니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 4. 서버 개발 자체는 경험도 있고 익숙해서 큰 어려움은 없었는데 클라우드 인프라 구축을 직접해 본 건 처음해보는 일이라 초기에 많은 어려움을 겪었습니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 5. 첫째로 공유된 자료가 많이 없어서 직접 부딪쳐가면서 몸으로 배워야 했고, 제가 선택한 방법이 과연 최선인지, 더 나은 방법은 없는지 끝없이 고민할 수 밖에 없었습니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 6. 잘못된 방법으로 구축해버리는 바람에 데이터가 유실되거나 제가 잠든사이 서버가 죽었는데 자동으로 서비스가 복구되지 않는다면 사용자들에게 부정적인 영향을 미치니까요 Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 7. 제가 진행한 프로젝트가 금융 서비스라고 부르기는 어렵지만 나름대로 사용자의 자산을 다루는 서비스인 만큼 서버 가용성은 꼭 확보해야 하는 과제였습니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 8. 만약 자신이 DevOps 개발자로 일해야 하는 상황이 왔는데 어디서부터 시작해야하 하는지 모르는 사람들을 위해 이 자료를 준비했습니다. Docker및 Swarm Mode를 활용한 분산 서버 관리 A부터 Z까지 PART 1.
  • 9. Docker 기본 Docker Swarm 으로 오케스트레이션 하기 아마존 클라우드에서 사용하기 CI/CD로 배포 자동화하기 제가 이야기할 주제는 크게 네가지입니다.
  • 10. Docker 기본 Docker Swarm 으로 오케스트레이션 하기 아마존 클라우드에서 사용하기 CI/CD로 배포 자동화하기 이 번 1부에서는 Docker와 Docker Swarm에 대해 이야기하고 클라우드 플랫폼과 CI와 연동하는 부분은 따로 떼어 2부에서 추가적으로 다룰 예정입니다. 1부 2부
  • 11. Docker 기본 Docker Swarm 으로 오케스트레이션 하기 아마존 클라우드에서 사용하기 CI/CD로 배포 자동화하기 1부 에서도 Docker Swarm의 심화 기능들을 분리하기 위해서 PART 1과 PART 2로 분리하였습니다. PART 1, PART 2
  • 12. Docker 기본 Docker Swarm 으로 오케스트레이션 하기 아마존 클라우드에서 사용하기 CI/CD로 배포 자동화하기 기본적인 내용을 다루는 PART 1의 내용은 이번 1부에서 다룰 것이고 조금 더 어려운 이야기를 하는 PART 2는 별도로 부록 형식으로 새로 슬라이드를 만들 예정입니다. PART 1, PART 2
  • 13. 약간 원론적인 얘기이지만 도커에 대해 이야기하기 앞서 가상OS의 개념과 도커 이전의 가상화와 도커가 어떻게 다른지 설명드리겠습니다.
  • 14. 도커가 처음 발표된 건 2013년 이지만 본격적으로 상용화 단계를 거치고 개발자 커뮤니티에서 화제가 된건 불과 2-3년 전입니다.
  • 15. 제가 처음 개발자로 일했던 2012년에는 사내에 준비되어있는 서버 컴퓨터에 접속해서 서버를 구동하는 환경이었습니다.
  • 16. 왼쪽 그림처럼 하나의 서버에 웹서버를 설치해서 실행하곤 했는데요. 이런 방식에는 몇가지 불편한 점이 있습니다.
  • 17. 일단 서버 OS마다 웹서버 설치 및 실행 방법이 다 다릅니다. apk, yum, rpm 등 리눅스 OS마다 여러 설치 방법이 있죠 설정법도 제각각입니다.
  • 18. 그리고 OS에 이미 다른 서버가 실행중이라면 여타 패키지 충돌, 포트, 설정등을 신경써야 합니다.
  • 19. 가상 OS를 사용하면 완벽히 격리된 공간에서 작업을 할 수 있습니다. 이 때문에 호스트가 어떤 환경에 있던간에 실행을 보장합니다.
  • 20. 마치 자바의 “Run Everywhere” 모토와 비슷하죠
  • 21. 또한 가상 이미지를 만들면 완벽한 복제본을 만들 수 있습니다. 이 복제본을 사용해서 서버를 쉽게 확장하고 관리할 수 있습니다.
  • 22. 이 그림은 도커 이전의 가상화기술과 도커의 차이점을 확연히 보여줍니다.
  • 23. Hypervisor는 물리적 컴퓨터 위에 Guest OS를 설치해서 앱을 실행합니다. Guest OS는 하나의 OS를 구성하는 커널 및 시스템 라이브러리 등을 가지고 있습니다.
  • 24. 반면 컨테이너 기반인 도커는 OS수준에서 가상화를 지원합니다. 도커 위에서 동작하는 컨테이너는 따로 커널을 설치하는게 아니라 호스트의 커널을 공유합니다.
  • 25. 그 위에서 필요한 시스템 라이브러리만 설치하면 되기 때문에 Hypervisor와 비교했을 때 이미지 빌드 및 실행이 빠릅니다.
  • 26. 빠르다 빌드도 빠르고(?) 실행도 빠르다 편하다 설치가 간편하고 여러개의 서버를 한번에 실행하는 것도 편하게 할 수 있다 안전하다 격리된 환경에서 설정을 잡을 수 있기 때문에 기존 자원과의 충돌이 없다 e. x. 이미 아파치 서버가 돌고있는 서버 컴퓨터에 아파치 환경에 새로운 웹환경을 만드는 건 꽤 어렵다 유연하다. 서버를 탄력적으로 설계 및 운영할 수 있다. 도커로 서버를 구성하면 얻을 수 있는 장점은 위와 같이 정리할 수 있습니다.
  • 27. 개인적으로는 서버의 구성을 유연하게 가질 수 있다는게 꽤 매력적으로 느꼈는데요. 빠르다 빌드도 빠르고(?) 실행도 빠르다 편하다 설치가 간편하고 여러개의 서버를 한번에 실행하는 것도 편하게 할 수 있다 안전하다 격리된 환경에서 설정을 잡을 수 있기 때문에 기존 자원과의 충돌이 없다 e. x. 이미 아파치 서버가 돌고있는 서버 컴퓨터에 아파치 환경에 새로운 웹환경을 만드는 건 꽤 어렵다 유연하다. 서버를 탄력적으로 설계 및 운영할 수 있다.
  • 28. Micro Service vs Monolitic 서버의 구성을 이분법적으로 나누면 모놀리틱과 마이크로 서비스로 분류할 수 있습니다.
  • 29. Monolitic 쇼핑몰 웹서버 장바구니 상품검색 회원관리 상품결제 배송관리 포인트관리 등등... 모놀리틱 구조란, 하나의 서버안에 모든 기능을 구현해놓은 형태를 말합니다. 편하게 개발할 수 있는 것 처럼 보이지만
  • 31. Micro Service 장바 구니 장바 구니 장바 구니 결제 결제 결제 배송 배송 회원 상품 상품 상품 상품 상품 … 마이크로 서비스란, 필요한 기능을 서로다른 서버로 개발해서 하나로 결합해 시스템을 완성하는 것을 말합니다.
  • 32. Micro Service 장바 구니 장바 구니 장바 구니 결제 결제 결제 배송 배송 회원 상품 상품 상품 상품 상품 … 서버를 확장할 때 전체 컴포넌트를 확장하지 않고 필요한 기능만 확장할 수 있습니다.
  • 33. Micro Service 장바 구니 장바 구니 장바 구니 결제 결제 결제 배송 배송 회원 상품 상품 상품 상품 상품 … 각 서버마다 단위가 작기 때문에 개발, 테스트, 배포도 주기적으로 자주 할 수 있다는 장점이 있습니다.
  • 34. Micro Service 장바 구니 장바 구니 장바 구니 결제 결제 결제 배송 배송 회원 상품2 상품2 상품2 상품2 상품2 … 새로운 기능을 배포할 때도 전체 기능을 다운시키지 않고 필요한 기능만 업데이트 할 수 있죠
  • 35. Micro Service vs Monolitic Docker love this! 도커를 사용하면 서버의 확장 및 설치가 간편해졌기 때문에 여러대의 서버를 관리하는것에 대한 부담이 훨씬 덜 해졌습니다.
  • 36. Micro Service vs Monolitic Docker love this! 이번 프로젝트에서도 메인 API, 관리자, 인증 서버, 푸시 서버, 이벤트 서버 등등 여러대의 마이크로 서비스들을 관리하고 있습니다.
  • 37. 이제 본격적으로 도커의 설치및 기본 사용법에 대해 다루겠습니다. 이 슬라이드를 보고 도커를 처음 접하신 분들을 위해 준비했습니다.
  • 38. 추후에 이어질 Docker Swarm에 대한 이해를 돕기위한 용어 설명 및 간단한 명령어만을 보여주기 때문에 좀 더 자세한 내용은 관련 홈페이지 및 다른 강의를 참고해주세요.
  • 39. 도커 공식 홈페이지에는 각 OS별 설치법이 나열되어있습니다. 저는 맥북에서 작업을 하기 때문에 홈페이지에서 제공하는 설치파일을 통해 도커를 설치했습니다. https://docs.docker.com/docker-for-mac/install/#what-to-know-before-you-install
  • 40. 이미지 / 컨테이너 도커의 명령어를 배우려면 먼저 이미지와 컨테이너를 분리해서 바라볼 수 있어야 합니다.
  • 41. 이미지 = 클래스 컨테이너 = 객체 객체지향개발에서 쓰이는 말에 비유하면 이미지는 클래스로 컨테이너는 객체로 비유할 수 있습니다.
  • 42. 이미지 = 클래스 컨테이너 = 객체 서버의 구성 및 실행환경을 정의하는 이미지를 가지고 실제로 돌아가는 컨테이너를 여러개 만들 수 있습니다.
  • 43. main.py Hello, World! 도커 이미지를 생성하고 이미지로 컨테이너를 띄울 수 있도록 간단한 Hello, World예제를 준비했습니다.
  • 44. main.py Hello, World! 로컬호스트로 접속하면 Hello, World! 라는 기요미 문구를 보여주는 Flask 애플리케이션입니다
  • 45. main.py Hello, World! 이 예제를 실행하기 위해서 파이썬과 Flask를 설치할 필요는 없습니다. 어차피 도커 환경에서 다 설치하니까요.
  • 46. Dockerfile Hello, World! Docker는 Dockerfile을 참조해서 명시되어있는 명령어들을 자동으로 수행한 뒤에 이미지를 빌드합니다.
  • 47. Dockerfile Hello, World! 이번 예제에서는 누군가 Nginx서버에서 Flask를 구동하는 환경을 만들어둔 덕분에 별다른 추가 설정없이 내려받아서 사용했습니다.
  • 48. Dockerfile Hello, World! 편하긴 하지만 이런 오픈된 이미지에는 악성코드가 심어져 있는 경우가 있기에 실제 운영환경에서는 ubuntu같은 이미지에서 시작하는 것을 권장합니다.
  • 49. Dockerfile Hello, World! 요즘에는 남의 서버에서 비트코인 채굴하려는 사람들이 많아서 이런식의 함정들이 종종 있습니다.. 조심해야겠죠
  • 50. T 이미지 생성하기 $ cd ~/Projects/helloworld $ docker build -t helloworld . $ docker images Terminal REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest 9cb9a8177c14 3 seconds ago 946MB 도커 이미지는 docker build 명령어를 통해 간단히 만들 수 있습니다. 빌드가 끝나고 난 뒤 docker images명령어를 실행하면 위와같이 설치된 이미지 목록이 나옵니다.
  • 51. T 이미지 생성하기 $ cd ~/Projects/helloworld $ docker build -t helloworld . $ docker images Terminal REPOSITORY TAG IMAGE ID CREATED SIZE helloworld latest 9cb9a8177c14 3 seconds ago 946MB 출력 결과로 helloworld라는 이미지가 생성되었음을 알 수 있습니다.
  • 52. T 컨테이너 실행하기 $ docker run -d —p 3000:80 helloworld Terminal 이제 docker run 명령어로 특정 이미지를 실행할 수 있습니다.
  • 53. T 컨테이너 실행하기 $ docker run -d —p 3000:80 helloworld Terminal -d 옵션은 이 컨테이너를 백그라운드로 실행하겠다는 것을 의미합니다. -d
  • 54. T 컨테이너 실행하기 $ docker run -d —p 3000:80 helloworld Terminal -p 옵션으로 호스트의 포트와 도커 컨테이너 내부의 포트를 바인딩 할 수 있습니다. 도커 컨테이너 내부에서는 Nginx서버가 80으로 실행하고 있는데 -p
  • 55. T 컨테이너 실행하기 $ docker run -d —p 3000:80 helloworld Terminal 호스트에서는 포트 3000번으로 붙겠다는 의미입니다. -p
  • 56. T 컨테이너 실행하기 $ docker run -d —p 3000:80 helloworld Terminal 마지막에는 실행시킬 이미지명을 명시합니다. helloworld
  • 57. T 실행중인 컨테이너 확인 $ docker ps Terminal CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 36dac4a33de3 helloworld “/entrypoint.sh /sta…” 2 seconds ago Up 1 second 443/tcp, 0.0.0.0:3000->80/tcp infallible_yonath 리눅스에서 ps명령어로 프로세스를 확인하듯 docker ps 명령어를 통해 실행중인 컨테이너들을 확인할 수 있습니다.
  • 58. T 실행중인 컨테이너 확인 $ curl 127.0.0.1:3000 Terminal Hello, World! 이제 해당 url로 접속하면 컨테이너가 실행되고 있음을 눈으로 확인할 수 있습니다.
  • 59. 이미지 공유하기 생성한 이미지를 다른 호스트에서 공유하려면 도커 이미지를 저장하는 서버가 필요합니다.
  • 60. 이미지 공유하기 이 이미지 저장소를 레지스트리라 부릅니다. 이 레지스트리는 설치해서 사용할 수 있고 클라우드 서비스인 도커 허브를 이용할 수도 있습니다.
  • 61. 이미지 공유하기 별도의 설정없이 도커 기본 명령어만을 사용하면 자동으로 이 Docker Hub에 이미지가 업로드 됩니다.
  • 62. 이미지 공유하기 튜토리얼의 진행을 위해서 Docker Hub에서 회원가입을 한 후 진행합니다.
  • 63. T 이미지 공유하기 $ docker login Terminal id : test1234 pw : ***** Docker Hub에 가입이 완료되었으면 로그인 명령어를 통해 Docker Hub에 원격으로 접속합니다.
  • 64. T 이미지 공유하기 $ docker tag helloworld <DockerHub ID>/helloworld $ docker push cailhuiris/helloworld Terminal d61c69f2fa98: Pushed 52eb842a98fa: Pushed 847921f88ca8: Pushed 68119dafa79b: Layer already exists aa2c2d8abe13: Layer already exists cb48b94dec5c: Layer already exists ac3971ed0cde: Layer already exists 754c98f4a299: Layer already exists 8fb1ed4b97da: Layer already exists 45b9ffccb837: Layer already exists c73e4bc27fd5: Layer already exists c31292db9897: Layer already exists e3e5f300548e: Layer already exists eddfc23cc6e4: Layer already exists 79d02735661d: Layer already exists de7c712608b5: Layer already exists 8da2d25a1bd0: Layer already exists 7c95a319416c: Layer already exists b7442a669f28: Layer already exists . . . 그 다음 push 명령어를 사용하여 이미지를 허브에 업로드합니다. 별도의 설정을 거치지 않았기 때문에 자동으로 Docker Hub에 업로드 됩니다.
  • 65. T 이미지 공유하기 $ docker tag helloworld cailhuiris/helloworld $ docker push cailhuiris/helloworld Terminal d61c69f2fa98: Pushed 52eb842a98fa: Pushed 847921f88ca8: Pushed 68119dafa79b: Layer already exists aa2c2d8abe13: Layer already exists cb48b94dec5c: Layer already exists ac3971ed0cde: Layer already exists 754c98f4a299: Layer already exists 8fb1ed4b97da: Layer already exists 45b9ffccb837: Layer already exists c73e4bc27fd5: Layer already exists c31292db9897: Layer already exists e3e5f300548e: Layer already exists eddfc23cc6e4: Layer already exists 79d02735661d: Layer already exists de7c712608b5: Layer already exists 8da2d25a1bd0: Layer already exists 7c95a319416c: Layer already exists b7442a669f28: Layer already exists . . . 도커는 빌드 과정의 시간을 최소화 하기 위해서 이전에 생성된 이미지에서 변경된 부분만을 새로 빌드합니다.
  • 66. T $ docker tag helloworld cailhuiris/helloworld $ docker push cailhuiris/helloworld Terminal d61c69f2fa98: Pushed 52eb842a98fa: Pushed 847921f88ca8: Pushed 68119dafa79b: Layer already exists aa2c2d8abe13: Layer already exists cb48b94dec5c: Layer already exists ac3971ed0cde: Layer already exists 754c98f4a299: Layer already exists 8fb1ed4b97da: Layer already exists 45b9ffccb837: Layer already exists c73e4bc27fd5: Layer already exists c31292db9897: Layer already exists e3e5f300548e: Layer already exists eddfc23cc6e4: Layer already exists 79d02735661d: Layer already exists de7c712608b5: Layer already exists 8da2d25a1bd0: Layer already exists 7c95a319416c: Layer already exists b7442a669f28: Layer already exists . . . 847921f88ca8: Pushed de7c712608b5: Layer already exists b7442a669f28: Layer already exists -> helloworld.py -> Nginx -> Ubuntu Libraries 이미지 공유하기 서버에서 필요한 자원 중 변경된 부분만 새로 푸시하고 변경되지 않은 부분은 이전에 이미 빌드한 부분을 그대로 사용합니다. *위에 적힌 부분은 예시로서 실제와는 다릅니다.
  • 67. Docker Swarm 하나의 호스트에서 동작하는 도커 컨테이너는 build, run, stop, start 등의 명령어로도 충분히 관리할 수 있습니다. 로고 너무 귀여워..
  • 68. Docker Swarm 하지만 다수의 호스트에서 다양한 종류의 컨테이너 서버를 다루어야 할 경우 기본 명령어로는 버거운 상황이 발생하는데
  • 69. Docker Swarm Docker Swarm을 사용하면 여러대의 분산 서버에서 어떤 컨테이너라도 쉽게 실행, 중지, 확장, 감소, 배포 등의 작업을 수행할 수 있습니다.
  • 70. Docker에 기본적으로 내장되어있기 때문에 별도의 설치과정이 필요하지 않다. Docker 1.12.0 이후 버전부터는 Swarm이 내장되어 있어서 별도의 설치과정이 필요하지 않아 바로 사용할 수 있습니다.
  • 71. Docker에 기본적으로 내장되어있기 때문에 별도의 설치과정이 필요하지 않다. 보통 이런 멀티-호스트에서 컨테이너 배포 관리 하는 행위를 오케스트레이션이라고 부릅니다.
  • 72. 도커 스웜 말고도 수많은 오케스트레이션 툴들이 존재합니다. 대표적으로 구글에서 개발한 Kubernetes가 있습니다.
  • 73. 수백대의 서버를 운영하는게 아니라면 어려운 사용법을 공부하느라 피해입을 멘탈 손해가 도입의 이득보다 크기 때문에 처음엔 도커 스웜을 사용하는 것을 추천드립니다.
  • 74. 컨테이너의 배포 및 프로비저닝 자동화 컨테이너가 중지된 상황일 경우 재스케줄링 클러스터 내의 컨테이너의 로드 밸런싱 서비스 외부에 노출시키기 컨테이너와 호스트의 상태 모니터링 … 오케스트레이션 툴들이 자동으로 해주는 일을 위와 같이 나열할 수 있습니다. 앞으로 위와 같은 일들을 하는 걸 ‘오케스트레이션 한다’ 라고 부르겠습니다.
  • 75. 특정 컨테이너를 실행중인 호스트 발견 클러스터 내 네트워크 분리 컨테이너 스케일 아웃-인 롤링 업데이트 … 그 외에도 서버 개발자가 직접 위와 같은 일들을 할 수 있습니다.
  • 76. Manager Worker Service Routing Mesh Ingress Network Overlay Network Bridge Network Docker Swarm을 제대로 사용하고 이해하려면 위의 기본용어들을 잘 숙지하고 있어야 합니다.
  • 77. Manager Worker Service Routing Mesh Ingress Network Overlay Network Bridge Network 이제 부터 하나씩 배워보도록 하겠습니다.
  • 78. Manager 노드, Worker 노드 Manager Worker Manager Worker Worker 도커 스웜 내에서 존재하는 호스트는 매니저 노드, 워커 노드 둘 중 하나가 됩니다.
  • 79. Manager 노드, Worker 노드 Manager Worker Manager Worker Worker 매니저 노드는 클러스터관리 및 컨테이너 오케스트레이의 의사결정을 하고 워커 노드는 매니저의 지시에 따라 컨테이너를 열심히 실행하는 노예 역할을 합니다.
  • 80. Manager 노드, Worker 노드 Manager Worker Manager (Leader) Worker Worker 매니저 노드 중에서도 리더로 선출된 인싸가 주요 관리 업무를 맡고 나머지 매니저 노드는 리더가 가지고 있는 오케스트레이션 업무일지를 동일하게 유지합니다.
  • 81. Manager 노드, Worker 노드 Worker Worker Worker 만약, 리더로 선출된 노드에 장애가 발생하면 다른 매니저 노드가 리더로 선출되서 기존 업무를 이어갑니다. Manager (Leader)
  • 82. 실제로 매니저 노드와 워커 노드를 생성해 봅시다. T $ docker-machine create —-driver virtualbox manager1 Terminal (Mac) T $ docker-machine create —-driver hyperv manager1 Terminal (Windows) Manager 노드, Worker 노드
  • 83. docker-machine 명령어는 로컬에 도커 호스트를 설치하고 실행하는 명령어입니다. 도커에서 컨테이너를 관리하는 daemon 프로세스를 실행하는 가상머신을 실행합니다. Manager 노드, Worker 노드 T $ docker-machine create —-driver virtualbox manager1 Terminal (Mac) T $ docker-machine create —-driver hyperv manager1 Terminal (Windows)
  • 84. 설치하는 환경이 Mac이면 위의 명령어를, Window라면 아래 명령어를 실행하면 됩니다. Manager 노드, Worker 노드 T $ docker-machine create —-driver virtualbox manager1 Terminal (Mac) T $ docker-machine create —-driver hyperv manager1 Terminal (Windows)
  • 85. 같은 방법으로 manager2, manager3, worker1, worker2, worker3 총 6개의 가상 호스트를 설치했습니다. T $ docker-machine create —-driver virtualbox manager2 $ docker-machine create —-driver virtualbox manager3 $ docker-machine create —-driver virtualbox worker1 $ docker-machine create —-driver virtualbox worker2 $ docker-machine create —-driver virtualbox worker3 Terminal Manager 노드, Worker 노드
  • 86. Manager 노드, Worker 노드 설치가 끝났으면 docker-machine ls 명령어로 실행중인 호스트의 이름과 IP를 확인할 수 있습니다. T $ docker-machine ls NAME ACTIVE DRIVER STATE URL manager1 - virtualbox Running tcp://192.168.99.100:2376 manager2 - virtualbox Running tcp://192.168.99.101:2376 manager3 - virtualbox Running tcp://192.168.99.102:2376 worker1 - virtualbox Running tcp://192.168.99.103:2376 worker2 - virtualbox Running tcp://192.168.99.104:2376 worker3 - virtualbox Running tcp://192.168.99.105:2376 Terminal
  • 87. Manager 노드, Worker 노드 ssh명령어로 매니저 노드에 접속해서 Swarm 클러스터를 만들어 줍니다. T $ docker-machine ip manager1 192.168.99.100 $ docker-machine ssh manager1 docker@manager1:~$ docker swarm init —-advertise-addr 192.168.99.100 To add a worker to this swarm, run the following command: docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions. Terminal
  • 88. Manager 노드, Worker 노드 최초로 docker swarm init 을 실행한 노드가 자동으로 매니저 노드가 됩니다. T $ docker-machine ip manager1 192.168.99.100 $ docker-machine ssh manager1 docker@manager1:~$ docker swarm init —-advertise-addr 192.168.99.100 To add a worker to this swarm, run the following command: docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions. Terminal
  • 89. $ docker-machine ip manager1 192.168.99.100 $ docker-machine ssh manager1 docker@manager1:~$ docker swarm init —-advertise-addr 192.168.99.100 To add a worker to this swarm, run the following command: docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions. Manager 노드, Worker 노드 출력 결과가 알려주는 명령어를 다른 호스트에서 사용하면 생성된 스웜 클러스터에 워커 노드!로 참여할 수 있습니다. T Terminal docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377
  • 90. $ docker-machine ip manager1 192.168.99.100 $ docker-machine ssh manager1 docker@manager1:~$ docker swarm init —-advertise-addr 192.168.99.100 To add a worker to this swarm, run the following command: docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions. Manager 노드, Worker 노드 매니저 노드!로 참여하려면 하이라이트된 명령어를 실행하고 나오는 결과를 참고해서 따라하면 됩니다. T Terminal docker swarm join-token manager
  • 91. Manager 노드, Worker 노드 위와 같이 노가다해서 모든 노드를 클러스터에 참여 시켰습니다. T $ docker-machine ssh manager2 docker@manager2:~$ docker swarm join —-token SWMTKN……dwznw 192.168.99.100:2377 && exit $ docker-machine ssh manager3 docker@manager3:~$ docker swarm join —-token SWMTKN……dwznw 192.168.99.100:2377 && exit $ docker-machine ssh worker1 docker@worker1:~$ docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 && exit . . . Terminal
  • 92. Manager 노드, Worker 노드 보시면 워커 노드로 참여할 때와 매니저 노드로 참여할 때 토큰값이 다른 걸 알 수 있습니다. T $ docker-machine ssh manager2 docker@manager2:~$ docker swarm join —-token SWMTKN……dwznw 192.168.99.100:2377 && exit $ docker-machine ssh manager3 docker@manager3:~$ docker swarm join —-token SWMTKN……dwznw 192.168.99.100:2377 && exit $ docker-machine ssh worker1 docker@worker1:~$ docker swarm join —-token SWMTKN……dg06n 192.168.99.100:2377 && exit . . . Terminal SWMTKN……dwznw SWMTKN……dg06n SWMTKN……dwznw
  • 93. Manager 노드, Worker 노드 다시 manager1로 접속해서 위와 같이 연결된 노드 목록을 확인해 봅시다. T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal
  • 94. Manager 노드, Worker 노드 최초로 클러스터를 생성한 manager1노드가 리더로 선출 된 것을 볼 수 있습니다. T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal Tmanager1 Ready Leader
  • 95. Manager 노드, Worker 노드 이렇게 해서 매니저와 워커의 역할로 나눠진 노드를 각각 3개씩 구성했습니다. T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal Tmanager1 Ready Leader
  • 96. Manager 노드, Worker 노드 이제 이전에 같이 만들었던 헬로월드 서버를 스웜 클러스터에 배포하려고 하는데 T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal Tmanager1 Ready Leader
  • 97. Manager 노드, Worker 노드 단일 호스트에서는 단순히 docker run 명령어를 통해 한 개의 컨테이너만을 실행시켰지만 T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal Tmanager1 Ready Leader
  • 98. Manager 노드, Worker 노드 분산 환경에서는 다수의 컨테이너를 한 번에 실행하고 확장 & 감소를 할 수 있어야 합니다. T $ docker-machine ssh manager1 docker@manager1:~$ docker node list ID HOSTNAME STATUS MANAGER STATUS r3cdm4280fwopg8ttqmvuyl9k * manager1 Ready Leader s8v5rm3iajtn5i22m2x4uj5c1 manager2 Ready Reachable v3vhkxnkxxx2a1upqqksibouw manager3 Ready Reachable mj7nb6e8zz4dk0oi8p1so2zba worker1 Ready dp2wzr8zgfp875atxtrc1pjgc worker2 Ready icnigqqfj081skxi222h60lfi worker3 Ready Terminal Tmanager1 Ready Leader
  • 99. Service 몇개의 컨테이너를 실행할 지, 어떤 서버에 할당할 지 등의 정보를 가지면서 분산 환경에서 실행되는 컨테이너들의 논리적 단위를 Service라고 부릅니다 Worker Manager Worker Worker HelloWorld Service Number of node: 3 image: helloworld port: 80->80 . . .
  • 100. Service 이 서비스를 생성해서 헬로월드 서버를 각 노예들에게 배포하도록 하겠습니다. Worker Manager Worker Worker HelloWorld Service Number of node: 3 image: helloworld port: 80->80 . . .
  • 101. Service 서비스는 docker service create 명령어를 통해 생성할 수 있습니다. T docker@manager1:~$ docker service create --name=helloworld --publish=3000:80/tcp --constraint=node.role==worker --replicas=3 --with-registry-auth <Docker Hub ID>/helloworld Terminal
  • 102. Service 명령어 옵션으로 클라우드 외의 노출할 포트, 컨테이너 개수 등을 설정할 수 있습니다. T docker@manager1:~$ docker service create --name=helloworld --publish=3000:80/tcp --constraint=node.role==worker --replicas=3 --with-registry-auth <Docker Hub ID>/helloworld Terminal
  • 103. docker@manager1:~$ docker service create --name=helloworld --publish=3000:80/tcp --constraint=node.role==worker --replicas=3 --with-registry-auth <Docker Hub ID>/helloworld Service 명령어 옵션으로 클라우드 외에 노출할 포트, 컨테이너 개수 등 서비스의 각종 설정을 할 수 있습니다. T Terminal -> 서비스 이름 -> 3000 포트를 80포트에 바인딩 -> 워커 노드에만 배포 -> 컨테이너 3개만 실행한다.
  • 104. Service docker ps 명령어와 비슷하게 docker service ps를 통해 클러스터 내에 실행중인 helloworld 컨테이너 정보를 볼 수 있습니다. T docker@manager1:~$ docker service ps helloworld ID NAME IMAGE NODE sdlh3fke7cje helloworld.1 helloworld:latest worker1 ib9xs0b6uypx helloworld.2 helloworld:latest worker2 rhogifxyvcjq helloworld.3 helloworld:latest worker3 Terminal
  • 105. Service 총 3개의 컨테이너가 각 워커에 실행 중인 것을 알 수 있습니다. T docker@manager1:~$ docker service ps helloworld ID NAME IMAGE NODE sdlh3fke7cje helloworld.1 helloworld:latest worker1 ib9xs0b6uypx helloworld.2 helloworld:latest worker2 rhogifxyvcjq helloworld.3 helloworld:latest worker3 Terminal
  • 106. Service 실제로 워커 하나의 IP를 조회 해본 뒤 브라우저로 접속해보면 서버가 실행중인 것을 확인할 수 있습니다. T$ docker-machine ip worker1 192.168.99.103 Terminal
  • 107. Service 현재 스웜 클러스터를 그림으로 표시하면 위와 같이 나타낼 수 있습니다. Worker Manager (Leader) helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Manager Manager Docker Swarm
  • 108. Service Scale-Out, Scale-In 서비스 단위로 컨테이너를 관리하면 간단한 명령어로 필요한 순간마다 컨테이너를 늘리거나 줄일 수 있습니다.
  • 109. Service Scale-Out, Scale-In scale 명령어를 사용해 기존에 3개만 실행했던 컨테이너를 5개 까지 확장하였습니다. T docker@manager1:~$ docker service scale helloworld=5 helloworld scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged Terminal
  • 110. Service Scale-Out, Scale-In scale 명령어 이후 스웜 클러스터를 도식화하면 위와 같습니다. 현재 워커 노드가 3개뿐이여서 하나의 노드가 두 개의 컨테이너를 실행하는 상황이 연출되었는데 Worker Manager (Leader) helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Manager Manager Docker Swarm helloworld (3000 -> 80) Worker helloworld (3000 -> 80) helloworld (3000 -> 80)
  • 111. Service Scale-Out, Scale-In 워커 노드가 많을 경우에는 각 노드에 컨테이너를 균등하게 배치합니다. Worker Manager (Leader) helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Manager Manager Docker Swarm helloworld (3000 -> 80) Worker helloworld (3000 -> 80) helloworld (3000 -> 80)
  • 112. Service Update 현재 실행중인 컨테이너를 새로운 버전으로 배포하는 것도 도커 명령어로 손쉽게 할 수 있습니다. Worker Helloworld:1 (3000 -> 80) Helloworld:2 (3000 -> 80)
  • 113. Service Update 사실 저희 프로젝트에서 도커 스웜을 도입한 가장 큰 이유가 자동화의 매력이었는데요 Worker Helloworld:1 (3000 -> 80) Helloworld:2 (3000 -> 80)
  • 114. Swarm 도입 이전 배포 프로세스 저희 팀은 도커 스웜 도입 이전에는 직접 AWS 클라우드에서 인스턴스를 생성해 새로운 버전의 도커를 실행해 인스턴스 자체를 교체하는 방식으로 배포를 진행했었습니다. EC2 Instance Helloworld:1 (Stopped) 신규 버전이 있을때마다 이렇게 노동했다!.. EC2 Instance Helloworld:2
  • 115. 도커 스웜 도입 이후에는 CI툴을 이용해서 배포 자동화를 구축 했습니다. CI Runner에서 매니저 노드에 접속해서 명령어하나만 호출해주면 되기 때문에 Swarm 도입 이후 배포 프로세스 소스 푸시 서비스 업데이트 명령어 호출 새로운 컨테이너로 교체
  • 116. 혹시나 배포 자동화를 고민하고 계신다면 쉽게 도입하실 수 있을 겁니다. Swarm 도입 이후 배포 프로세스 소스 푸시 서비스 업데이트 명령어 호출 새로운 컨테이너로 교체
  • 117. 서버를 배포하는 방법을 보여드리기 위해 이전에 작성했던 Hello, World 서버에 한글화를 도입했습니다. Service Update Example main.py
  • 118. 같은 방식으로 도커 이미지를 생성하고 레지스트리에 업로드 합니다. Service Update Example T $ docker build -t helloworld . $ docker tag helloworld <Docker Hub ID>/helloworld $ docker push <Docker Hub ID>/helloworld Terminal ** <Docker Hub ID> 에는 본인 도커 허브 계정명을 적어주세요.
  • 119. 이제 매니저 노드에 접속해서 service update 명령어를 사용하면 컨테이너가 새로운 버전으로 배포된 걸 확인할 수 있습니다. Service Update Example T docker@manager1:~$ docker service update --image <Docker Hub ID>/helloworld —-with-registry-auth helloworld Terminal
  • 120. CI 파이프라인으로 매니저 노드에서 이 명령어를 실행하면 배포 자동화 프로세스가 완성됩니다 Service Update Example T docker@manager1:~$ docker service update --image <Docker Hub ID>/helloworld —-with-registry-auth helloworld Terminal
  • 121. 서비스를 업데이트 할 때 컨테이너를 동시에 교체해버리면 서버가 재시작 되는 시간동안 다운 타임이 발생하기 때문에 사용자 입장에서는 동작이 안되는 것 처럼 보입니다. 무중단 배포 Service Update Example
  • 122. Docker Swarm에서는 컨테이너를 한번에 교체하지 않고 순차적으로 바꾸는 Rolling Update 전략을 지원합니다. 무중단 배포 Service Update Example
  • 123. 서비스 업데이트 명령어에 —update-delay 옵션을 추가 하면 전체 컨테이너가 교체되는 시간을 조절할 수 있습니다. T docker@manager1:~$ docker service update —-update-delay=120s --image <Docker Hub ID>/helloworld —-with-registry-auth helloworld Terminal —-update-delay=120s Service Update Example
  • 124. 바로 Worker1 helloworld:v0.1.1 (3000 -> 80) 명령어 실행 직 후 Worker1 helloworld:v0.1.0 (3000 -> 80) Worker1 helloworld:v0.1.0 (3000 -> 80)
  • 125. 이렇게 Worker1 helloworld:v0.1.1 (3000 -> 80) 120초 후 Worker1 Worker1 helloworld:v0.1.0 (3000 -> 80) helloworld:v0.1.1 (3000 -> 80)
  • 126. 말이죠 Worker1 helloworld:v0.1.1 (3000 -> 80) 240초 후 Worker1 Worker1 helloworld:v0.1.0 (3000 -> 80) helloworld:v0.1.1 (3000 -> 80) helloworld:v0.1.1 (3000 -> 80)
  • 127. 지금까지 서비스의 생성, 업데이트, 스케일 아웃 기능까지 간단하게 알아보았습니다. 지금은 도커 스웜의 재밌는 기능 하나를 소개하려고 합니다. Routing Mesh
  • 128. 보통 사용자는 단일 엔드 포인트를 통해 서비스를 이용 합니다. api.helloworld.com 123.123.123.123 Routing Mesh
  • 129. 다중 서버를 이용하는 경우엔 로드밸런서가 사용자 요청을 분배합니다. Load Balancer (123.123.123.123) Server 1 Server 2 Server 3 Routing Mesh
  • 130. 만약 서버를 Docker Swarm으로 구성하는 경우에는 어떻게 단일 엔드 포인트를 제공할 수 있을까요? Load Balancer (123.123.123.123) Server 1 Server 2 Server 3 Routing Mesh
  • 131. Docker Swarm은 Routing Mesh라는 재밌는 프로토콜을 가지고 있습니다. Load Balancer (123.123.123.123) Server 1 Server 2 Server 3 Routing Mesh
  • 132. Routing Mesh는 Swarm 안의 어떤 노드에 요청을 해도 해당 컨테이너로 요청을 라우팅 하는 기능입니다. Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Managerport : 3000 URL : / Routing Mesh
  • 133. 예를 들어 헬로월드 컨테이너를 실행하지 않는 매니저 노드에 3000번 포트로 요청을 보내도 Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Managerport : 3000 URL : / Routing Mesh
  • 134. 헬로월드 컨테이너를 다른 노드에서 찾아내 해당 노드로 요청을 라우트 합니다. Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Worker helloworld (3000 -> 80) Managerport : 3000 URL : / Routing Mesh
  • 135. 도커 스웜안에 존재하는 모든 노드는 로드밸런서를 하나씩 가지고 있습니다. Routing Mesh
  • 136. 이 로드 밸런서는 기본적으로 라운드-로빈 방식으로 요청을 라우팅 하고 스웜 내의 모든 컨테이너의 위치 정보를 가지고 있습니다. Routing Mesh
  • 137. 이렇게 도커 스웜 만으로도 자체적인 단일 엔드 포인트를 만들 수 있습니다. Routing Mesh
  • 138. Routing Mesh기능을 활성화 하려면 모든 노드가 서로에게 7946 TCP/UDP, 4789 UDP 포트를 허용 하면 됩니다. Routing Mesh Worker Manager (Leader) Worker Worker Manager Manager Docker Swarm 7946 TCP 7946 UDP 4789 UDP 7946 TCP 7946 UDP 4789 UDP 7946 TCP 7946 UDP 4789 UDP 7946 TCP 7946 UDP 4789 UDP 7946 TCP 7946 UDP 4789 UDP 7946 TCP 7946 UDP 4789 UDP
  • 139. 지금까지 도커 스웜의 설치 및 구성, 서버 배포, 업데이트, 스케일 아웃, 로드밸런서 등에 대해 다루었습니다.
  • 140. 사실 이 말고도 Network, Stack등 다루고 싶은 내용은 더 많았지만 이 이후부터는 조금 심화된 내용이라 PART 2에서 간단하게 나마 다루도록 하겠습니다.