도커,쿠버네티스를활용한컨테이너개발실전입문2

김지용·2022년 9월 7일
0

독서

목록 보기
9/11
post-thumbnail

이미지 빌드는 도커파일로

91p~ 컨테이너 실전 구축 및 배포
권한 점수(chmod) / 사용자, 그룹, 다른사용자 순으로 권한을 줌
r + w + x (읽기, 쓰기, 실행)
4 + 2 + 1 = 7
이미지 빌드
docker image build -t example/cronjob:latest .
빌드된 이미지 실행
docker container run -d --rm --name cronjob example/cronjob:latest

로그로 위의 빌드가 1분마다 Hello! 출력한다는 걸 알음
docker container exec -it cronjob tail -f /var/log/cron.log

컨테이너는 하나의 관심사에만 집중해야한다.
Each container should have only one concern.

96p~

데이터볼륨
데이터 볼륨은 컨테이너를 파기해도 디스크에 그대로 남으므로 컨테이너 상태의 애플리케이션을 실행하는 데 적합하다.
데이터볼륨을 생성하려면 -v 옵션을 사용하면 된다.

docker container run [options] -v 호스트_디렉터리:컨테이너_디렉터리 레포지토리명[:태그] [명령]

ex)
docker container run -v ${PWD}:/workspace gihyodocker/imagemagick:latest
convert -size 100x100 xc:#000000 /workspace/gihyo.jpg 
docker image build -t example/mysql-data:latest .

위의 이미지를 mysql-data 라는 이름으로 실행시킨다.

docker container run -d --name mysql-data example/mysql-data:latest

실행이 끝나면 컨테이너가 종효된다.

docker container run -d --rm --name mysql
-e "MYSQL_ALLOW_EMPTY_PASSWORD=yes"
-e "MYSQL_DATABASE=volume_test"
-e "MYSQL_USER=example"
-e "MYSQL_PASSWORD=example"
--volumes-from mysql-data
mysql:5.7

도커스웜 이용하기

docker container exec -it manager docker swarm init

매니저를 두고 worker01~03까지 아래 명령어 반복

docker container exec -it worker01 docker swarm join --token SWMTKN-1-356u5bddf17p5fw8fdrrlcwkpenjfw9ojto5jmlz9vq5kftww3-d7ccvvdx6nxp5kwev4tmd0s5n 172.18.0.3:2377
docker container exec -it manager docker node ls 

위 명령어 입력 시 manager와 3대의 worker가 잘 출력된다.

도커 레지스트리에 이미지 등록하기
1. 이미지 태그명 수정

docker image tag example/echo:latest localhost:5000/example/echo:latest
  1. 이미지 등록
docker image push localhost:5000/example/echo:latest
  1. 이미지 받아오기(레지스트리 컨테이너 로부터)
docker container exec -it worker01 docker image pull registry:5000/example/echo:latest

여기까지가 worker01 컨테이너에서 example/echo:latest 이미지를 사용할 준비가 끝난 것이다.
여기서 사용한 태그 포맷이나 이미지 등록하고 받아오는 방법이 비공개 레지스트리를 사용하는 기본방법이다.

단일 도커 호스트에 대한 컨테이너 배포는 'docker container run' 명령으로 컨테이너를 일일이 실행 또는 컴포즈를 사용해 여러 컨테이너를 동시에 실행하는 방법이 있다.
스웜을 사용하는 경우에는 접근법이 조금 다른데 애플리케이션을 구성하는 일부 컨테이너를 제어하기 위한 단위로 서비스라는 개념이 있다.

스택
하나이상의 서비스를 그룹으로 묶은 단위

  • 스택 역시 스웜과 마찬가치로 manager 컨테이너에서 조작한다.
    overlay 네트워크 ch03을 구성한 다음 스택으로 만든 각 서비스를 여기에 소속시킨다.
docker container exec -it manager docker network create --driver=overlay --attachable ch03

stack 디렉토리에 ch03-webapi.yml 스택을 생성한다.(docker-compose.yml이랑 구성이 비슷)

Nginx를 프론트엔드로 삼고, 백엔드 API(echo 컨테이너)의 리버스 프록시를 맡기는 구성이다.

스택 배포하기
스웜클러스터에 스택을 배포하려면

docker stack deploy

명령을 사용한다. 이 때 -c 옵션 값으로 스택 정의 파일 경로를 지정해야한다.

stack 디렉터리는 manager 컨테이너의 /stack 디렉터리에 마운트도므로 이 파일의 경로는 /stack/ch03-webapi.yml 이 된다. 아래와 같이 스택명을 echo라 짓고 스택배포를 실행한다.

docker container exec -it manager docker stack deploy -c /stack/ch03-webapi.yml echo

스택 echo의 서비스 목록 확인

docker container exec -it manager docker stack services echo

스택에 배포된 컨테이너 확인하기

docker container exec -it manager docker stack ps echo

visualizer를 사용해 컨테이너 배치 시각화하기

docker container exec -it manager docker stack deploy -c /stack/visualizer.yml visualizer

스택 삭제하기(배포된 서비스를 스택째로 삭제할 수 있다.)

docker container exec -it manager docker stack rm echo

visulalizer는 호스트-manager까지 여러 단계에 걸쳐 포트포워딩을 사용했기 때문에 스웜 클러스터 외부(= 호스트)에서 접근할 수 있다.
하지만 echo_nginx 서비스는 여러 컨테이너가 여러 노드에 흩어져 배치돼 있기 때문에 서비스 접근이 어렵다.
이를 위해 서비스 클러스터 외부에서 오는 트래픽을 목적하는 서비스로 보내주는 프록시 서버로 HAProxy를 사용해 스웜클러스터 외부에서 echo_nginx 서비스에 접근하게 한다.
HaProxy 이미지는 dockercloud/haproxy 이미지를 사용한다. 이 이미지로 만든 컨테이너는 이제 컨테이너 외부에서 서비스에 접근할 수 있게 다리역할(ingress) 외에 서비스가 배치된 노드에 로드 밸런싱 기능을 제공한다.

  1. 우선 ch03-webapi.yml을 스택 echo로 다시 배포한다.
docker container exec -it manager docker stack deploy -c /stack/ch03-webapi.yml echo
  1. ch03-ingress.yml을 스택 ingress로 배포한다.
docker container exec -it manager docker stack deploy -c /stack/ch03-ingress.yml ingress
  1. 서비스 배치 현황 체크
docker container exec -it manager docker service ls

호스트 포트 8000 -> manager 컨테이너의 포트 80, 다시말해 ingress의 HAProxy로 포트포워딩 되므로 localhost:8000이 echo_nginx:80에 접근할 수 있게된다.

스웜 클러스터의 구성관리 팁(126p)
운영환경의 상황을 고려하면 부하에 따라 빠르게 노드를 추가할 수 있게 하는 게 바람직하다.이를 위해 도커가 설치된 머신 이미지를 준비한다. 이 머신 이미지는 가상환경을 생성하기 위한 템플릿 역할을 하고, 머신이미지를 사용하면 도커가 설치된 서버 인스턴스를 빠르게 늘릴 수 있다.

머신 이미지를 사용해서 서버 인스턴스를 하나 실행한 다음 'docker swarm init' 명령을 실행해 이 머신을 manager로 삼는다. 그 다음 추가될 노드가 manager를 특정하기 쉽도록 내부 DNS에서 도메인을 설정해두면 편리하다.
AWS나 GCP 같은 공용클라우드는 서버 인스턴스를 복제하는 방식으로 서버를 쉽게 늘릴 수 있는 오토 스케일 기능을 제공한다. 이 기능을 통해 서비스 부하에 따라 머신 이미지를 사용해 자동으로 서버 인스턴스를 추가할 수 있다.

기존 서버 인스턴스의 CPU 사용률에 임계값을 설정해 두고 이 값을 넘으면 서버 인스턴스를 추가하도록 트리거를 설정한다. 이렇게하면 도커 호스트를 자동으로 추가할 수 있다.

도커 호스트 역할을 할 서버 인스턴스를 추가로 생성한다고 해도 이 인스턴스가 스웜클러스터에 추가되지 않는다면 의미가 없다. 그러므로 추가되는 서버 인스턴스가 처음 시작될 때 'docker swarm join' 명령을 실행해 자동으로 스웜 클러스터에 추가되게 한다. AWS나 GCP는 서버를 처음 시작할 때 실행할 스크립트를 지정할 수 있으므로 이 스크립트에 다음과 같이 스웜 클러스터에 추가하는 명령을 작성한다.

#!/bin/bash
sudo docker swarm join --token $SWARM_JOI?N_TOKEN manager.gihyo.local:2377
profile
김죵입니당 ^^

0개의 댓글