Docker Services
· Version : Docker
이 문서는 Docker 공식 문서를 번역한 내용이며 필자의 생각과 의견이 반영되어 있습니다. 자세한 내용은 원문을 참고 바랍니다.
Prerequisites
Docker Services 학습하기 전에 아래 사항이 선행되어야 한다.
· Docker Install : https://docs.docker.com/install/
· Docker Orientation : http://sqlmvp.kr/221419558020
· Docker Containers : http://sqlmvp.kr/221423910065
· 레지스트리에 푸시하여 작성한 friendlyhello이미지를 게시했는지 확인한다. 이번 포스트에서는 레지스트리에 공유된 이미지를 사용한다.
· 이미지가 배포된 컨테이너가 잘 작동하는지 확인한다. 아래 명령어를 사용하여 컨테이너를 실행하고 정상적으로 브라우저에서 접속이 되어야 한다. Username, reop 위치는 각 사용자에 따라 변경하여 사용한다.
docker run -p 4000:80 username/repo:tag |
Introduction
이번 포스트에서는 응용프로그램을 확장하고 로드밸런스를 활성화 한다. 이렇게 하려면 분산 응용 프로그램의 계층 구조에서 하나의 수준 높은 서비스로 이동해야 한다.
Stack |
Service (이번 포스트 위치) |
Container (http://sqlmvp.kr/221423910065) |
About Services
분산 응용프로그램에서 응용 프로그램의 다른 부분을 “서비스”라고 한다. 예를 들어 비디오 공유사이트를 상상할 경우 데이터베이스에 데이터를 저장하는 응용 프로그램, 사용자 업로드 프로그램, 프론트엔드를 위한 서비스 등이 포함된다. 서비스는 실제로 “프로덕션 컨테이너”이다. 서비스는 하나의 이미지만 실행하지만 이미지를 실행하는 방법을 체계화 한다. 즉 어떤 포트를 사용해야 하는지, 얼마나 많은 컨테이너 복제본을 실행해야 서비스에 필요한 용량이 있는지, 서비스를 확장한다면 해당 소프트웨어를 실행하는 컨테이너 인스턴스 수가 변경되어 프로세스의 서비스에 더 많은 컴퓨팅 리스스가 할당된다.
다행히도 Docker 플랫폼으로 서비스를 정의, 실행 및 확장하는 것은 매우 쉽다. docker-compose.yml 파일을 작성하여 사용할 수 있다.
Your first docker-compose.yml file
docker-compose.yml파일은 Docker 컨테이너가 프로덕션 환경에서 어떻게 작동 해야하는지 정의하는 YAML 파일이다. 아래 내용을 docker-compose.yml 파일로 저장한다. Part2에서 만든 이미지를 레지스트리로 푸시한 다음 username/repo:tag 경로를 사용자에 맞게 수정하여 .yml을 작성해야 한다.
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet: |
docker-compose.yml 파일은 Docker에게 다음을 수행하도록 지시한다.
· 2단계에서 업로드한 이미지를 레지스트리에서 가져온다.
· 해당 이미지의 5개 인스턴스를 web이라는 서비스로 실행하고 각 이미지를 최대 10% CPU(모든코어)와 50MB의 RAM으로 제한한다.
· 컨테이너가 실패하면 즉시 다시 시작한다.
· 호스트 포트 4000을 Web의 포트 80에 매핑한다.
· Webnet이라는 로드 균형 조정된 네트워크를 통해 포트 80을 공유하도록 Web컨테이너를 지시. Webnet 내부적으로 컨테이너 자체는 임시 포트에서 Web의 포트 80에 게시된다.
· 기본 설정 (로드 밸런싱 오버레이 네트워크)으로 webnet 네트워크를 정의한다.
Run your new load-balanced app
docker stack deploy 명령을 사용하려면 먼저 다음을 실행한다.
docker swarm init |
참고 : Docker swarm init를 실행하지 않으면 “이 노드는 군집 관리자가 아닙니다”라는 오류가 발생한다. |
이제 실행해본다. 앱 이름을 지정해야 한다. 여기에 getstartedlab를 지정하였다.
docker stack deploy -c docker-compose.yml getstartedlab |
단일 서비스 스택은 배포된 이미지의 컨테이너 인스턴스 5개를 하나의 호스트에서 실행한다. 아래 명령어는 애플리케이션에서 하나의 서비스에 대한 ID를 얻는다.
docker service ls |
앱 이름 앞에 web서비스 출력을 찾는다. 이 예제와 동일한 이름을 지정하면 이름은 getstartedlab_web이다. 서비스ID는 복제본 수, 이미지 이름 및 노출된 포트와 함께 나열된다.
서비스에서 실행되는 단일 컨테이너를 태스크라고 한다. 작업에는 docker-compose.yml에서 정의한 replica개수의 고유한ID가 나타난다.
docker service ps getstartedlab_web |
서비스에 의해 필터링되지는 않지만 시스템의 모든 컨테이너를 나열하면 작업도 표시된다.
docker container ls -q |
Curl -r http://localhost:4000연속으로 여러 번 실행하거나 브라우저에서 해당 URL로 이동하여 몇 번 새로 고침을 한다.
어느 쪽이든 컨테이너ID가 변경되면서 로드 밸런싱이 되는것을 확인할 수 있다. 각 요청 마다 5개의 작업 컨테이너 중 하나가 라운드 로빈 방식으로 응답하도록 선택된다. 컨테이너ID는 이전 명령 (docker container ls -q)의 출력과 일치 한다.
Slow response times? 네트워크 구성환경에 따라 컨테이너가 http 요청에 응답하는데 최대 30초가 걸릴 수 있다. 이는 Docker 또는 Swarm 성능을 나타내는 것이 아니라 자습서의 뒷 부분에서 다룰 Unis Redis 종속성을 나타낸다. 당분간 방문자 카운터는 같은 이유로 작동하지 않는다. 아직 데이터를 유지하는 서비스를 추가하지 않았다. |
Scale the app
docker-compose.yml의 replicas 값을 변경하고 변경 사항을 저장한 다음 docker stack deploy 명령을 다시 실행하여 응용 프로그램을 확장할 수 있다.
docker stack deploy -c docker-compose.yml getstartedlab |
Docker는 전체 업데이트를 수행하므로 먼저 스택을 떼어 내거나 컨테이너를 제거할 필요가 없다. 이제 docker container ls -q를 다시 실행하여 배포된 인스턴스가 재구성 된 것을 확인한다. 복제본을 확장하면 더 많은 태스크가 생겨서 더 많은 컨테이너가 시작된다.
Take down the app and the swarm
· docker stack rm을 사용하여 앱을 다운 시킨다.
docker stack rm getstartedlab |
· Swarm을 다운 시킨다.
docker swarm leave --force |
Docker를 사용하여 앱을 실행하고 확장 할 수 있다. 이번 포스트에서는 프로덕션 환경에서 컨테이너를 실행하는 방법에 대해서 전체적으로 학습하였다. 다음으로 Docker 시스템 클러스터에서 애플리케이션을 실행하는 방법에 대해서 학습한다.
참고 : 이와 같은 파일 작성은 Docker로 응용 프로그램을 정의하는데 사용되며 Docker Cloud를 사용하여 클라우드 공급자에게 업로드 하거나 Docker Enterprise에서 선택한 하드웨어 또는 클라우드 공급자에 업로드 할 수 있다. |
Recap and cheat sheet
이.페이지에서 다룬 내용은 아래와 같다.(동영상)
· https://asciinema.org/a/b5gai4rnflh7r0kie01fx6lip
다시 말하면 docker rum을 입력하는 동안 충분히 간단하다. 프로덕션에서 컨테이너의 실제 구현은 이를 서비스로 실행한다. 서비스는 compose파일에서 컨테이너의 동작을 정의하며 이 파일을 사용하여 앱을 확장, 제한 및 재배포 할 수 있다. 서비스를 시작한 명령과 동일한 명령인 docker stack deploy 사용하여 서비스가 변경될 때 해당 서비스의 변경 사항을 적용 할 수 있다.
이번 포스트에서 학습 한 명령어이다.
docker stack ls # List stacks or apps docker stack deploy -c <composefile> <appname> # Run the specified Compose file docker service ls # List running services associated with an app docker service ps <service> # List tasks associated with an app docker inspect <task or container> # Inspect task or container docker container ls -q # List container IDs docker stack rm <appname> # Tear down an application docker swarm leave --force # Take down a single node swarm from the manager |
2018-12-26 / Sungwook Kang / http://sqlmvp.kr
services, replicas, scale, ports, compose, compose file, stack, networking
'SW Engineering > DevOps, SRE' 카테고리의 다른 글
Docker Stack (0) | 2019.03.26 |
---|---|
Docker Swarms (0) | 2019.03.26 |
Build an image and run it as one container (0) | 2019.03.26 |
Docker Orientation and Setup (0) | 2019.03.26 |
Docker란 무엇인가? (0) | 2019.03.26 |