Docker Swarm 명령어

docker service create  이미지명:태그

- 도커 서비스 생성

 

* 옵션

--mode global : 클러스터 내의 모든 노드에 컨테이너를 반드시 하나씩 생성함. 따로 --replica가 필요 없다.

                                보통 global 모드는 warm cluster를 모니터링 하기 위한 agent container 등을 생성할 때 유용하다.

--replica 숫자 : 생성할 컨테이너의 개수 명시

--name 이름 : 서비스의 이름 명시

-p 외부포트:내부포트 : 포트 설정. 도커와 동일

-network=이름 : 어떤 네트워크에 속할지 정의

--update-delay 시간s : 이 서비스에 대해 업데이트를 진행할 때, 각 task에 대한 업데이트 시 일정한 시간 간격을 두도록 설정

 

그외에도 --update-failure-action, --update-max-failure-ratio, --update-monitor, --update-order, --update-parallelism 등의 옵션을 줄 수가 있다. 

 

 


docker service ls
- 현재 서비스 확인

 

docker-machine ls

각 노드 설정정보 (네트워크 등) 확인


docker service ps 서비스명
- 현재 서비스의 컨테이너들과 상세정보 확인

docker service logs 서비스명
- 현재 서비스의 로그 확인

docker service rm
- 서비스 제거

docker service scale 서비스명=숫자
- 해당 숫자만큼 전체 노드에 걸쳐 replica를 만든다. 만약 노드가 3개고 scale=3 이라면, 모든 노드에 각각 들어간다.
- 만약 scale=5라면, 두 노드는 2개, 한 노드는 1개 총 5개의 replica가 들어간다.
- 만약 sacle=5 에서 2로 줄이면, 그만큼 replica가 줄어든다.

- 서비스의 업무부하가 커지면, 이 명령을 사용하여 컨테이너 복제를 늘려 규모를 키울 수 있다.

  이미 실행 중에 있는 서비스에서도 가능하다.

 

docker service inspect --pretty 서비스명

- 서비스의 상세정보 확인

- 옵션 --pretty 는 JSON형식의 Data를 사람이 읽기 쉽운 형태로 변환한다.

 

docker service update 이미지:태그

- 명시한 이미지로 서비스를 업데이트한다.

 

docker swarm update 

도커 스웜의 설정을 변경할 때 사용한다.

 

 

예시 : nginx 웹서버 서비스 만들고 컨트롤하기

 

1. 생성하기

서비스의 이름은 myweb이고, replica를 2개 만들고, 포트는 80으로, 이미지는 nginx 의 latest를 사용

(주의 : 서비스 내의 컨테이너는 -d(detached) mode 로 동작하는 이미지를 사용해야 함)

docker service create --name myweb --replicas 2 -p 80:80 nginx:latest

생성하면, 아래와 같이 2개의 myweb이라는 서비스의 컨테이너 2개가 여러 노드에 걸쳐 생성된다.

각각 노드의 "IP:포트" 로 접속해서 확인할 수 있다.

2. Replica 늘리기

docker service sacle myweb=3

아래와 같이 3개로 늘어난 것을 확인할 수 있다.

 

3. Replica 더 많이 늘리기

docker service sacle myweb=6

 

 

Docker Swarm 에서 Rolling Update  수행하기

Rolling update란, 클러스터된 서비스에서, 서비스의 downtime을 가지지 않고 클러스터 노드를 하나하나 업데이트 하는 것을 말한다. Docker Swarm에서는 Rolling update를 자체 지원하여 간단하게 사용할 수 있다. 자세한 정보를 확인하려면 아래 링크를 참고한

https://docs.docker.com/engine/swarm/services/#configure-a-services-update-behavior

 

Deploy services to a swarm

Swarm services use a declarative model, which means that you define the desired state of the service, and rely upon Docker to maintain this state. The state includes information such...

docs.docker.com

 

1. Swarm service 생성

docker service create --name myweb --replicas 4 --update-delay 20s -p 8888:80 nginx:1.18

다음과 같이 현재 상태를 확인할 수 있다.

 

2. 업데이트 수행

docker service update --image nginx:1.19 myweb

이렇게 명령을 수행하면서 watch docker service ps myweb 명령으로 2초간격으로 새로고침하여 지켜볼 수 있다.

지켜보면, 맨 먼저 4개중 한개의 컨테이너(nginx1.18)가 종료되고, 그다음 종료된 노드에서 새로운 nginx1.19가 시작된다. 그 후 위에서 설정한 update-delay 20초가 지난 후에, 또 다른 하나의 컨테이너가 종료되고 새로운 컨테이너가 시작되는 과정이 반복된다. 최종적으로 아래와 같이 업데이트가 완료된다.

 

 

즉 전체 slot에 대해 “한 노드에서 기존 컨테이너를 죽인 후 새로운 높은 버전의 컨테이너를 생성하고 update delay 시간만큼 기다린 후 또 새로운 노드에서 해당 작업을 반복하는 것" 이다. 이 동안, 서비스는 문제없이 지속된다. 왜 서비스가 문제없이 지속되는지는, 다음 포스팅을 참고한다.

2020/07/08 - [Docker Advanced] - [Docker Advanced] Docker Swarm network 개념 이해

 

 

Docker Swarm 에서 Update Rollback 수행하기

업데이트를 수행한 후, 문제가 있어 이전 버전으로 원상복귀를 원할 때, rollback 명령을 사용할 수 있다.  위에서 업데이트한 상태를 rollback 해 보자. 아래는 현재 상태이다.

 

* 서비스 롤백

docker service rollback myweb

위 명령을 수행하면, 바로 rollback이 진행되며, rollback은 update-delay가 적용되지 않아 빠르게 진행된다. 아래와 같이 최종 결과로 붉은색 네모칸처럼 nginx가 1.18로 롤백되었다.

롤백도 마찬가지로 서비스에 문제없이 지속되며, 업데이트처럼 현재 버전 컨테이너들이 순서대로 하나씩 shutdown 되고 롤백할 낮은 버전으로 새로 컨테이너가 생성된다. 

 

# 참고 : 기록은 언제까지 남아있는가?

docker service ps 명령으로 보면 해당 이미지의 변경 기록이 계속 남아 있는데, 이 값은 docker info의 Task History Retention Limit 값에 의해 히스토리 보관 수량이 결정된다. 이 값은 다음 명령어로 조절할 수 있다.

docker swarm update --task-history-limit 3

 

 

Docker swarm의 node 유지보수

노드, 즉 도커 엔진이 올라가 있는 물리적(또는 가상) 서버에 어떤 작업을 하기 위해 다운타임이 필요할 수 있다. 그러면 해당 노드에 있는 task (컨테이너들)을 제거해야 한다. 이 작업을 위해서는 drain 설정을 사용할 수 있다. 

docker node update --availability drain 노드명

이 명령은 해당 노드의 availability 값을 active에서 drain으로 변경한다. drain 상태의 노드에는 올라가 있던 task들이 모두 종료되고 다른 노드에서 해당 task들이 실행된다. 또한 새로운 task가 실행될 때 drain 상태의 노드에서는 실행되지 않는다. 다음과 같이 모든 컨테이너가 사라진 것을 확인할 수 있다. (myweb의 scale 값은 4이므로, 다른 노드에 myweb이 실행된 것을 확인할 수 있다)

또한 아래와 같이 노드의 상태도 확인할 수 있다.

drain 값을 다시 active하기 위해서는 다음과 같이 수행한다. 이렇게 원복해도, task들이 다시 해당 노드에서 실행되지는 않으며, 현재상태가 계속 유지된다.

docker node update --availability active 노드명

 

 

Docker Swarm 에서 문제가 발생하면?

* 컨테이너에 문제가 생기는 경우

- 예를들어, docker rm -f 컨테이너명 으로 해당 컨테이너를 삭제하면, 컨테이너가 다시 살아납니다.

 

* 노드에 문제가 생기는 경우

- 다음과 같이 swarm-node3를 init 0 으로 종료시켜 버리면, 

- 다른 살아있는 노드로 컨테이너들이 생성됩니다.

- 노드가 다시 살아나도, 다른 노드에 올라온 컨테이너는 다시 돌아오지 않습니다. 그대로 유지됩니다.

Docker Swarm이란?

 

Docker Swarm은 여러가지 컨테이너 오케스트레이션 툴 중 하나이다. (오케스트레이션은 멀티 호스트에서 컨테이너를 관리/배포하는 것) 도커 엔진에 결합된 형태로 제공되는 공식 툴인데, 별도의 도구나 agent를 추가로 설치/설정하지 않아도 매우 간단하게 쓸만한 가용성 클러스터를 만들 수 있다. 아무래도 오케스트레이션 기능으로서는 구글 쿠버네티스가 월등하여 많이 쓰이지는 않는다. 하지만 사용하기 쉽고 간편하여 작은 규모의 시스템이나 개발환경 서포트를 위한 환경에서는 쿠버네티스보다 사용하기 좋다. 또한, Swarm을 Docker Machine과 함께 사용할 때, 클라우드 서비스의 Console에 한 번도 접속하지 않고, 그리고 클라우드 위에 배포한 Host OS에 접속하지 않고도 어지간한 작업을 모두 원격으로 수행할 수가 있어서 사용하기가 매우 편리하다.

 

기능으로서는 기본적으로 각 노드에 Replica (복제된 컨테이너) 를 만들고, Replica 개수도 설정할 수 있다. (여러개의 Replica를 여러 노드에 분산) 또한 컨테이너 자동배치 및 복제, 컨테이너 그룹에 대한 로드밸런싱, 컨테이너 장애 복구, 클러스터 외부에 서비스 노출, 컨테이너 롤링 업데이트, 컨테이너 추가 또는 제거를 이용한 확장 및 축소 등의 기능이 있다.

 

또한 Docker Swarm은 Container 의 유연성과 확장성, 이동의 편리함을 활용해 기업에서 운영하는 Database, LDAP, Jenkins, Docker Registry, Elasticsearch, Grafana 등의 여러가지 서비스를 운영할 수 있다.

 

기본적으로 Docker Swarm은 Manager node Worker node로 시스템이 구성된다. (위 그림 참고) Manager node 에서는 클러스터 관리 작업을 하고 클러스터 상태 유지, 스케줄링 서비스, Swarm HTTP API Endpoint 를 제공한다. Worker Node 는 container 를 실행하는 역할만 수행한다. (쿠버네티스에서는 각각을 Master, node 라고 한다)

 

Docker Swarm에서 사용되는 개념 몇가지

Docker Swarm에서 제어하는 단위는 컨테이너가 아닌 "service" 이다. 서비스는 같은 이미지에서 생성된 컨테이너의 집합이다. 즉, Swarm에게 업무를 할당하는 논리적 단위이다. 서비스를 실행할 때, 자원 정책, 레플리카 갯수, 롤링 업데이트 정책, 스웜 외부에서 해당 서비스에 접속할 포트, 스웜 내부의 다른 서비스와 통신하기 위한 오버레이 네트워크 등을 정의할수 있다.

 

docker service 구문으로 명령을 내리면 설정에 따라 해당 서비스에 1개이상의 컨테이너가 생성될 수 있다. 이러한 컨테이너들은 worker, manager 노드에 분산 할당된다. 이러한 컨테이너들은 task라고 불린다. 또한 각각의 task는 고유의 일련번호를 가지며, 이를 slot 이라고 한다.

 

docker run 명령을 이용한 경우는 그 명령을 받은 docker Engine이 자기 자신 위에서 바로 위의 작업을 수행하게 되지만, Swarm mode의 service 명령을 받은 Manager는 Service를 수행하기 위한 Task를 계산해내고, Task를 처리할 Worker를 선택하여 Worker에게 Task를 전송하는 과정이 추가된다. 일단 Worker가 Task를 받으면, run 명령을 받았을 때와 동일한 Container 생성/기동 과정을 진행하게 된다.

 

Docker Swarm 구축하기

 

0. 기본 설정 (4노드 예시)

* 환경

- 운영체제 : CentOS 7

- 노드 : 총 4개, 가상머신 (Virtual Box)

- 네트워크 : 어댑터에 브리지로 1포트 (모두 인터넷이 가능하고 호스트PC와 같은 네트워크 계층으로 하기 위함)

 

* 각 노드 서버 정보 (Hostname과 IP 정보)

swarm-node1 : 192.168.1.185

swarm-node2 : 192.168.1.206

swarm-node3 : 192.168.1.121

swarm-node4 : 192.168.1.207

(IP 주소가 중구난방인 이유는 가상머신 네트워크를 "어댑터에 브리지" 형태로 DHCP 할당했기 때문 ㅠ)

 

* 사전작업

- 각 노드에 도커를 설치한다. 아래 링크를 참고할 것

2020/04/09 - [Docker Basic] - [Docker Basic] 05. 리눅스에 도커 설치하기

 

[Docker Basic] 05. 리눅스에 도커 설치하기

여기서는 CentOS7, Docker CE 19.03 버전 기준으로 설명합니다. https://docs.docker.com/engine/install/centos/ Install Docker Engine on CentOS To get started with Docker Engine on CentOS, make sure you..

watch-n-learn.tistory.com

* 네트워크 방화벽 설정 (https://docs.docker.com/engine/swarm/swarm-tutorial/)

Docker Swarm의 통신 포트는 다음과 같다. 다음 포트를 오픈하지 않으면 Docker Swarm을 사용할 수 없다. 또한 CentOS7 에서는 Firewalld를 사용하므로, Firewalld에서 해당 네트워크 포트를 오픈해줘야 한다. 만약 Firewalld를 내리면, iptables를 사용할 수 없어 도커 자체의 네트워크 사용이 불가능해지므로 Firewalld를 내리지 말아야 한다. 

 

- Swarm Manager default port = 2377/tcp

- node communication = 7946/tcp, 7946/udp

- overlay network = 4789/udp

 

아래 명령을 모든 Docker Swarm 노드에 입력한다.

firewall-cmd --permanent --zone=public --add-port=2377/tcp
firewall-cmd --permanent --zone=public --add-port=4789/udp
firewall-cmd --permanent --zone=public --add-port=7946/udp
firewall-cmd --permanent --zone=public --add-port=7946/tcp
firewall-cmd --reload
firewall-cmd --list-all

 

1. Swarm manager 설정

Swarm 클러스터에서 manager 역할을 할 노드를 선정한다. 여기서는 "swarm-node1" 로 선택했다. 아래 init 명령을 swarm-node1에서 수행한다. --advertise-addr은 manager 역할을 하는 IP를 입력한다. 즉 여기서는 자신의 IP를 입력한다. 

docker swarm init --advertise-addr 192.168.1.185

결과 중 docker swarm join --token 부분은 연결을 위한 비밀키가 생성된 것이다. 이 전체 라인이 하나의 명령어이며, 복사하여 각 노드들이 이 docker swarm 클러스터에 조인하도록 사용한다. 이 비밀키는 외부에 노출시키면 안된다. 공개 시 누구든 swarm colster에 연결이 가능해진다. 보안 측면 문제가 있으므로, 주기적으로 이 비밀키의 변경이 필요하다. (--rotate)

 

추가적으로, init을 수행하여 클러스터를 시작한다고 선언한 후에는 몇가지 변화가 있는데 그 중 하나는 docker network ls에 ingress 네트워크가 추가된다.

 

# 참고 : 노드 조인 비밀키 갱신하기

현재 노드 조인 비밀키 확인 : docker swarm join-token manager

새로운 노드 조인 비밀키 갱신하기 : docker swarm join-token --rotate manager

 

2. 노드 조인 및 확인

docker swarm join --token SWMTKN-1-3n5fhjksl37b92z49r4l5db5lo9osp7jucl5sqbbwnvfke5f0e-ayfzeurg6pq8iu3s3j5timvaz 192.168.1.185:2377

해당 명령을 입력하면, This node joined a aswrm as a worker 라고 결과가 뜬다.  모든 노드를 등록 후 다음 명령으로 상태를 확인한다. 아래 명령들은 docker swarm manager만 수행할 수 있다.

docker node ls

docker info

아래 내용에서 Swarm : active 항목 아래에는 노드의 수, 매니저 외 여러가지 정보들을 확인할 수 있다. 또한 맨 아래에 Warning 등의 로그가 나오는데, 문제가 있는 경우 여기서 여러 로그를 확인할 수 있다.

 

# 참고 : 조인된 노드를 삭제하기

1. 삭제할 노드에서 명령 수행 : docker swarm leave  // docker node ls 에서 STATUS가 down으로 바뀜

2. 매니저 노드에서 명령 수행 : docker node rm 노드ID // 완전히 해당 노드가 삭제됨

만약 manager node를 제거하는 경우, 더 이상 swarm cluster를 사용할 수 없음.

 

# 참고 : Manager node와 worker node 변경

- worker node -> manager node 로 변경 : docker node promote 노드명

- manager node -> worker node 로 변경 : docker node demote 노드명

 

 

3. Docker Swarm Visualization Tool 설치하기 

이 툴은 공식적인 툴은 아니지만, dockersamples가 만든 visulizer라는 컨테이너이다. 이것은 여러 호스트와 서비스를 처리할 때, 효과적으로 시각적인 피드백을 준다. 한눈에 어떤 노드에 어떤 컨테이너가 올라와 있는지 확인할 수 있다. 구축은 다음 명령어로 수행한다.

docker service create --name=Swarm_Cluster --publish=8881:8080 --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer

브라우저에서 192.168.1.185:8881 실행하면, 아래와 같이 노드들과 컨테이너들을 확인할 수 있다. 아래 보라색 Swarm_Cluster라는 컨테이너도 현재 Manager인 swarm-node1에 올라와 있는 것이다.

 

해당 포스팅을 진행 하기 전에, 먼저 아래 포스팅을 참고한다.

2020/06/29 - [Cloud Platforms] - [Cloud Platforms] - Google Cloud Platform (GCP) 기본

 

[Cloud Platforms] - Google Cloud Platform (GCP) 기본

GCP란? GCP는 구글의 퍼블릭 클라우드 서비스이다. 퍼블릭 클라우드는 여러 업체가 있는데, 마이크로소프트 Azure, 아마존 AWS 구글 GCP 등 여러가지가 있다. 보통 이 3업체가 Big3 이다. 여기서는 GCP에

watch-n-learn.tistory.com

Google Container Registry

아무래도 도커 이미지는 인프라 구성요소에서 애플리케이션 개발 환경  실행 모듈  여러가지를 포함하므로 용량이 큰 경우가 많다. 그래서 이미지들을 직접 온프레미스 환경에서 관리하는 것보다 클라우드환경에서 관리하는게 더 효과적일 수 있다.

 

Google Container Registry는 구글에서 제공하는 Docker Image를 Private하게 관리할 수 있게 도와주는 API이다. 이 서비스는 GCP의 오브젝트 스토리지 서비스인 Google Cloud Storage를 데이터 저장소로 사용한다. GCR을 사용하여 도커허브 또는 Private Registry와 동일하게 docker image push / pull 명령어를 사용하여 이미지를 사용할 수 있다.

 

이를 통해 프로그래머는 스토리지 운용이라는 추가 작업에서 해방될 수 있고, 라이브러리의 버전을 포함한 구성 관리가 가능하므로 로컬이든 온프레미스든 클라우드든 상관없이 똑같은 환경에서 작업을 처리할 수 있다. 또한 Private하므로 자사에서 개발한 것들을 간편하게 공유할 수 있다.

 

 

 

1. Google Container Registry API 사용 설정하기

메뉴에서 "API 및 서비스 대시보드" 를 선택한다.

 

여기서는 GCP에서 사용할 수 있는 모든 API들을 관리한다. 현재 내가 쓰고 있는 API 리스트를 확인하고, 여러 설정들을 확인할 수 있다. 현재 어떤 API도 쓰고 있지 않으며, 새로운 API 사용설정을 위해 "API 및 서비스 사용 설정" 을 클릭한다.

 

API 라이브러리 화면이다. 여기서 여러가지 API들을 찾을 수 있다. 구글 맵스, 머신러닝, 데이터베이스, 개발자 도구, 유투브 등등 매우 다양하다. 여기서 "google container registry" 로 검색한다. 

 

검색된 Google Container Registry API를 선택한다.

 

해당 API에 대한 설정과 상세설정이 나온다. 여기서 사용설정을 선택한다. 아래 캡쳐에선 "관리" 라고 되어있는데, 이미 설정한 화면이다.

 

 

2. Google Cloud SDK 설치

Google Cloud SDK는 GCP 서비스를 관리하기 위한 툴과 라이브러리를 모아놓은 것이다. Google Cloud SDK는 웹브라우저 상의 Cloud Console, Cloud Shell 을 사용하지 않고 임의의 클라이언트 PC에서 GCP를 사용할 수 있게 해준다. Google Cloud SDK는 윈도우,맥,리눅스에서 작동하며 실행에는 파이썬 2.7이 필요하다.

 

여기 예시는 레드햇 리눅스를 예시로 들었다. Google Cloud SDK를 도커 서버에 설치하고, 서버의 이미지를 Google Container Registry에 업로드할 수 있다. 운영체제별 설치방법은 다음을 참고한다. (https://cloud.google.com/sdk/docs/?hl=ko#rpm ) 

 

(1) Google Cloud  SDK 설치 레포지토리 구성 및 설치

# 레포지토리 파일 생성
vi /etc/yum.repos.d/google-cloud.sdk.repo

# 아래 내용 삽입 후 저장
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

# 설치
yum install -y google-cloud-sdk

(2) Google Cloud SDK 실행

다음 명령을 실행한다. 해당 명령은 현재 서버와 glcoud를 동기화하기 위한 로그인을 수행한다.

gcloud init

아래와 같이 밑줄로 된 부분을 복사해서 브라우저에 붙여넣기 한다. (또는 해당 운영체제가 GUI가 설치되어 있다면 자동으로 firefox(레드햇기준)가 실행되어 자동으로 로그인 정보 요청을 한다. 

구글 로그인 화면이 나오고, GCP를 사용하고 있는 계정 정보를 입력하면 아래와 같이 나온다.

허용을 선택하면, 브라우저에서는 아래와 같이 성공적으로 인증되었다고 뜨며, 프롬프트에서는 아래와 같이 프로젝트를 선택하라고 한다.

이제 원하는 프로젝트를 선택한다. 이후 zone을 선택하라고 하는데, 원하는 zone을 선택하면 된다. (asis쪽으로 선택하면 되는 듯 하다)

 

3. GCR에 이미지 업로드하기

- GCR에 올리려면 이미지 명을 다음과 같은 형식으로 해야 한다.  "GCR호스트명/프로젝트아이디/이미지명"

- 예시 : asia.gcr.io/cubernetes-project/ubuntu-test:latest

 

# 참고 : GCR 호스트명

GCR(google container registry) 호스트명은 이미지의 저장 위치에 따라 다음 3개중 하나이다. 아래처럼 Container Registry의 설정 부분에서 확인할 수 있다. 

- gcr.io 기본

- us.gcr.io 미국

- eu.gcr.io 유럽

- asia.gcr.io 아시아

(1) 이미지를 업로드하기 위해 GCR 설정에 맞춘 이름으로 이미지에 대해 태그를 설정한다.

docker tag ubuntu:16.04 asia.gcr.io/cubernetes-project/ubuntutest:latest

 

(2) gcloud 명령으로 해당 이미지를 push 한다.

gcloud docker -- push asia.gcr.io/cubernetes-project/ubuntutest:latest

- GCR에서 해당 이미지를 확인할 수 있다.

 

4. GCR에 업로드 된 이미지를 내 도커서버로 다운로드 받기

- docker와 마찬가지로 pull 명령을 사용한다.

gcloud docker -- pull asia.gcr.io/cubernetes-project/ubuntutest:latest

이미지 확인

 

'Cloud Platforms' 카테고리의 다른 글

[Cloud Platforms] - Google Cloud Platform (GCP) 기본  (0) 2020.06.29

GCP란?

GCP는 구글의 퍼블릭 클라우드 서비스이다. 퍼블릭 클라우드는 여러 업체가 있는데, 마이크로소프트 Azure, 아마존 AWS 구글 GCP 등 여러가지가 있다. 보통 이 3업체가 Big3 이다. 여기서는 GCP에 대해서 간단하게 알아본다.

 

모든 클라우드 서비스들은 저마다의 강점이있는데, GCP는 다른유투브나 지메일 같은 구글 자사의 서비스를 제공하기 위해 구축된 기반과 동일한 기반을 사용할 수 있다는 강점이 있다. 특히 컨테이너를 사용한 웹 애플리케이션 실행 기반을 구축하기 위한 서비스들과 머신러닝으로 대표되는 대규모 데이터를 분산 환경에서 사용하여 머신러닝을 위한 서비스들이 많다.

 

또한 GCP는 무료 체험판으로 300$의 무료 크레딧을 준다. (2020년 6월 기준) 크레딧을 받으려면 카드정보를 입력해야 하며, 돈은 나가지 않는다. 크레딧을 다 쓰거나 등록 후 12개월 경과하면 무료체험은 종료된다. 클라우드 서비스의 비용 지불은 마치 게임 종량제 과금과 비슷하다. 단순하게 말해 시스템 자원 (CPU, Memory, Disk 등) 또는 플랫폼에 대해 과금을 한다고 생각하면 된다. CPU 1개를 쓰면, 시간당 오백원이다. 뭐 이런 느낌이다.

 

물론 종량제 말고도 다른 요금제가 있을 것이다. 큰 회사에서 계약하는 건이라면 세일즈 매니저를 통해 여러 요금제를 확인할 수 있다.

 

 

GCP 접속 및 계정등록

cloud.google.com/

 

클라우드 컴퓨팅 서비스  |  Google Cloud

데이터 관리, 하이브리드 및 멀티 클라우드, AI 및 머신러닝 등 Google의 클라우드 컴퓨팅 서비스로 비즈니스 당면 과제를 해결하세요.

cloud.google.com

- cloud.google.com 들어가서 절차에 따라 가입한다. "무료로 시작하기" 선택

- 신용카드를 등록해야 한다. 카드정보는 신원확인과 로봇에 의한 등록이 아니라는 것을 확인할 목적이다.

- 계정에 의도하지 않은 요금이 발생하지 않도록 무료체험이 끝나면 계정이 일시적으로 정지된다.

- 유료 계정으로 업그레이드하려면 gcp 콘솔 상단에 업그레이드 버튼을 클릭하여 수동으로 업그레이드 해야 한다.

- GCP에서는 무료로 쓸수 있는 몇가지 서비스가 있다. (Google App Engine 무료 프레임, Google Cloud Storage 대한 데이터 전송 등) 최신정보는 계속 바뀌므로 공식사이트에서 확인해야 한다.

 

 

 GCP 기본 화면

 위의 모든 계정 생성 작업을 완료하고 로그인을 하면 위와 같은 화면을 볼 수 있다. 프로젝트 선택은, 한 GCP 계정에 여러가지 서비스를 올려 쓰다 보면 헷갈리므로, 각 프로젝트 단위로 서비스를 만들 수 있다. 즉 어떤 서비스를 만드려면 프로젝트부터 만들어야 한다.

 

왼쪽 메뉴는 GCP에서 제공하는 서비스 및 사용자 설정을 위한 메뉴이다. [컴퓨팅] 윗부분은 사용자 메뉴이며, 결제, 보안, 지원 외 여러가지 기본 설정들을 할 수 있다. 시작하기 를 누르면, 기본적인 설명과 가장 사람들이 많이 쓰는 서비스를 보여준다.

 

고정하면 여기에 표시됩니다. 는 자주 쓰는 메뉴를 즐겨찾기 하는 것이다. 예를들어 Compute Engine을 주로 쓴다면 해당 부분을 고정할 수 있다. Compute Engine 메뉴에 마우스 커서를 갖다대면, 압정 표시가 있는데 해당 표시를 클릭하면 된다.

 

API 및 서비스 는 꽤 중요한데, GCP에서 제공하는 여러가지 API들을 확인할 수 있다. 이러한 API들을 개발에서 사용하거나, 도커 서비스에서 사용하는 등 여러가지 방법으로 사용할 수 있다.

 

서비스들은 여러가지가 있다. 컴퓨팅, 네트워킹, 저장소, 빅데이터, 인공지능, 솔루션 등 여러가지가 있는데, 이러한 모든 서비스들은 기반 지식이 있어야만 사용 가능하다. 그냥 단순하게 "나 클라우드 쓸래!" 이러고 쓰는 것이 아니다. 아래처럼 저장소의 SQL 이라던지, 컴퓨팅의 Kubernetes Engine이라던지, 뭐든 사전에 지식이 있어야 한다. 클라우드 서비스는 말그대로 원래는 직접 구매해서 써야 하지만 그렇지 않고 "Cloud"로 제공하는 것이기 때문이다.

대시보드

 

 

 

 

GCP에서 사용할 수 있는 도커 관련 서비스들 예시

* Google Cloud Container Builder (API)

Dockerfile을 바탕으로 도커 이미지를 GCP 상에서 작성하기 위한 커맨드 툴 이다. Dockerfile을 저장하는 소스 레포지토리에 저장된 도커파일로부터 이미지를 빌드하고, Container Registry로 자동으로 업로드할 수 있다. 소스 리포지토리는 Google Cloud Source Repository, Github, Bitbucket 사용 가능하다. GCB로 작성한 도커 이미지 저장 위치는 GCP의 오브젝트 스토리지 서비스인 Google Cloud Storage(유럽/아시아/미국리전)을 지정할 수 있다. 스토리지에 액세스할 사용자를 지정할 수 있어 프라이빗한 환경에서 이미지를 안전하게 관리할 수 있다.

 

* Google Kubernetes Engine

GKE는 도커 컨테이너를 관리하는 풀 매니지드 서비스이다. 사용자가 정의한 CPU나 메모리 같은 인프라 요구사항을 바탕으로 컨테이너 클러스터에 스케줄링하여 자동으로 관리한다. GKE는 오픈소스 컨테이너 오케스트레이션 툴인 쿠버네티스를 사용한다. 알아서 쿠버네티스 환경을 만들어서 컨테이너를 오케스트레이션 할 수 있게 해준다. 또한 애플리케이션 요구 변화에 맞춰 컨테이너에 할당되는 클러스터 리소스나 컨테이너 클러스터의 크기를 조정할 수 있다. GKE는 쿠버네티스의 kubectl 명령이나 클라우드 콘솔에서 조작할 수 있다. GCP VM 또는 로컬 호스트에서 쿠버네티스를 직접 구축하면 어렵지만, 이 메뉴에서 쿠버네티스를 구축하면 아주 간단하게 구축할 수 있다.

 

* Google Container Registry (GCR)

도커이미지는 용량이 커서 온프레미스 환경에서 관리 어려움이 발생할 수 있다. GCR은 도커 이미지를 GCP의 제품 안에서 관리할 수 있는 Private Registry 이다. Docker registry V2 API를 이용하여 자신의 개인 레지스트리를 만들고 도커 이미지의 업로드(푸쉬) 다운로드(풀) 을 할 수 있다. 도커 이미지의 저장 위치는 GCP가 제공하는 오브젝트 스토리지 서비스인 Google Cloud Storage를 사용한다. 이 때 유럽, 아시아, 미국 지역별 cloud storage 버킷 중 compute engine 인스턴스와 지리적으로 가까운 것을 지정함으로써 다운로드 시간을 단축시킬 수 있다. 또한 이미지의 아카이브를 cloud storage nearline 버킷에 저장할수도 있다.

 

 

그 외 GCP에서 사용 할 수 있는 여러 서비스들

 * Google Cloud Storage

구글에서 제공하는 오브젝트 스토리지 서비스. 여러가지 타입의 스토리지가 있고, 어떤 서비스에 사용해야 할지 (엑세스가 많은 데이터, 엑세스 빈도가 적은 재해복구용 데이터 등) 따라 스토리지 타입을 정해서 사용한다. 더 이상 자세한 설명은 생략한다.

 

* Google Compute Engine

가상머신을 만들 수 있는 서비스이다. 스토리지, CPU, RAM 등에 따라 과금된다.

 

* 그 외

Firebase, Google Maps API 등을 포함해 앱, 웹사이트, 서비스를 구축하고 실행하는 데 필요한 여러가지 기능들이 있다.

 

 

 

프로젝트

GCP 는 프로젝트라 부르는 단위로 시스템을 관리한다. 프로젝트는 사용자가 특정 조건에 맞춰 (예를들어 업무별로) GCP의 리소스를 모아 놓은 것으로, GCP 계정과 연결되어 프로젝트에 등록된 계정만 프로젝트 안의 리소스를 관리할 수 있있다. GCP내에서 작업을 하는 경우 필수로 프로젝트를 먼저 생성해야 한다.

 

사용중인 프로젝트를 종료하면 그 안에서 이용하던 리소스 (가상머신 인스턴스, 쿠버네티스 클러스터 등)는 모두 삭제되며, 요금은 일절 청구되지 않는다. 그래서 GCP에서는 일시적으로 테스트용으로 프로젝트를 만들고, 테스트 끝나면 프로젝트별로 종료를 하는 사용법이 가능하다.

 

 

* 프로젝트 생성하기

 

1. 콘솔 상단 아래 붉은색 네모칸을 클릭한다. 해당 부분이 현재 프로젝트를 보여준다.

 

2. 오른쪽의 새 프로젝트를 선택한다.

 

3. 프로젝트 생성

프로젝트 이름을 설정하고 만들면 된다.

 

# 참고 : 프로젝트 명명

gcp의 프로젝트는 프로젝트ID라는 UUID로 식별한다. 이 식별자는 영어소문자, 숫자, 대시로 이루어졌다.  프로젝트 작성시 입력한 프로젝트명을 바탕으로 프로젝트ID가 자동으로 생성되는데, 기존 프로젝트와 중복되지 않는다면 임의의 값을 설정할수도 있다.

 

또한 프로젝트명에 대해서는 기존의 프로젝트와의 중복을 신경쓰지 않고 자유롭게 설정할 수 있다. gcloud 명령이나 API 요청의 옵션에는 프로젝트명이 아니라 프로젝트ID를 식별자로써 전달해야 한다. 일단 프로젝트를 작성했으면, 프로젝트명과 ID는 바꿀 수 없다. 소규모 시스템에서는 크게 중요하지 않지만, 대규모 시스템에서는 여러 프로젝트를 효율적으로 관리하기 위해 프로젝트명,ID 명명 규칙을 정하는게 좋다. 예를 들어 기업명 식별자, 시스템명 식별자, 테스트용인지 실제사용인지 구분하는 플래그 등

 

다 만들어지면 만든 프로젝트를 선택할 수 있으며, 해당 프로젝트에 대한 대시보드 및 활동을 확인할 수 있다.

 

* 프로젝트 삭제

 

1. 아래 "새 프로젝트" 왼쪽에 기어모양 폴더를 클릭한다.

2. 원하는 프로젝트를 선택하고 상단에 삭제 버튼으로 삭제할 수 있다.

삭제하면 프로젝트 전체에 액세스할 수 없게 되어 요금이 청구되지 않는다. 또한 프로젝트의 소유자는 30일 이내에 삭제를 취소할 수 있다.

 

 

GCP를 사용하는 여러가지 방법

1. cloud console(https://console.cloud.google.com/)을 사용하여 웹 브라우저의 GUI사용

위에서 보여준 브라우저에서 접속해서 사용하는 일반적인 방법

 

2. cloud SDK를 설치하고 gcloud 명령을 사용

원하는 서버에 cloud SDK를 설치한 후 glcoud 명령으로 GCP를 컨트롤할 수 있다. cloud SDK 설치는 다음 링크를 참고한다.

2020/07/01 - [Cloud Platforms] - [Cloud Platforms] Google Container Registry API 사용하기

 

3.GCP 웹브라우저의 cloud shell을 사용하여  gcloud 명령 사용

cloud shell은 클라이언트 단말에 cloud SDK 등의 툴을 설치하지 않아도 gcloud 명령을 사용할 수 있는 웹브라우저 어플리케이션이다. 또한 cloud shell에는 java, go, python 등의 주요 언어 개발환경이 도입되어 있고 파일의 업로드/다운로드 기능과 코드 에디터드 제공되어 브라우저에서 파일을 편집할 수 있다.  참고 : https://cloud.google.com/shell/ 

 

아래와 같이 붉은 아이콘을 클릭하면, 아래와 같이 프롬프트가 나온다. 여기서 GCP를 컨트롤할 수 있다.

 

* cloud shell의 주요 툴

linux shell

bash, sh

google sdk, tool

google app engine sdk , google cloud sdk, gsutil for cloud storage

텍스트 에디터

emacs, vim, nano

빌드와 패키지를 위한 툴

gradle, make, maven, npm, nvm, pip

버전관리

git, mercurial

기타

docker, ipython, mysql 클라이언트, gRPC 컴파일러

 

 

'Cloud Platforms' 카테고리의 다른 글

[Cloud Platforms] Google Container Registry API 사용하기  (0) 2020.07.01

github 레포지토리에 자신이 만든 도커파일 스크립트를 올리면, 도커허브에 연동하여 자동으로 이미지를 빌드하고, 결과를 도커허브에 저장할 수 있다. github 뿐만 아니라 Bitbucket도 가능한데, 여기서는 다루지 않는다. 먼저, 아래 두 사이트의 계정을 생성한다.

 

https://hub.docker.com/

 

Docker Hub

Docker Certified:Trusted & Supported Products Certified Containers provide ISV apps available as containers. Certified Plugins for networking and volumes in containers. Certified Infrastructure delivers an optimized and validated Docker platform for enterp

hub.docker.com

접속 후 계정을 만든다음 로그인한다.

https://github.com/

 

Build software better, together

GitHub is where people build software. More than 50 million people use GitHub to discover, fork, and contribute to over 100 million projects.

github.com

도커허브에 로그인한다.

오른쪽 상단에 지문을 클릭한 후 Account Settings에 들어간다.

왼쪽 메뉴에 Linked Accounts를 선택하면 아래와 같은 화면이 나온다.

GitHub 부분에서 Connect를 선택한다.

 

아래와 같이 GitHub 로그인 페이지가 나온다. 로그인한다.

 

로그인이 성공적으로 완료되면, 아래와 같이 연결된 마크로 변경된다.

 

 

2. Github에 도커파일과 데이터 업로드하기

github에 로그인한다. 로그인 후 맨 오른쪽 아이콘을 선택하고 Your repositories를 선택한다.

오른쪽 녹색 New 버튼을 선택한다.

Repository 이름을 입력하고, 그 외 부분은 아래와 동일하게 한 후, Create repository 선택

다음과 같은 화면이 나온다. 중간에 보면 creating a new file or uploaading an existing file 을 선택할 수 있다.

uploading an existing file 선택하면 아래와 같은 화면이 나온다. 2개의 파일(Dockerfile, website.tar)을 업로드한다. 

이건 예시로 올리는 것이며, 자유롭게 단순한 Dockerfile을 만들어도 된다. 잘 작동만 하면 되니까.

업로드가 완료되면, 다음과 같이 결과가 나온다. 

 

 

3. 도커허브에서 연동된 github의 dockerfile을 바탕으로 이미지 생성하기

 

다시 도커허브로 돌아온다. Create Repository를 선택한다.

아래와 같이 Repository 생성 화면이 나온다. 이름은 자유롭게 하고, 그 외에는 건드릴 필요 없다.

- name : 이미지 이름이 되는 리포지토리명은 3~30문자까지의 영어소문자,숫자,언더바,하이픈(-), 점(.)을 쓸 수 있다.

- description : 이미지에 대한 간단한 설명을 기술한다.

- visibility : 퍼블릭으로 하면 누구나 접근 가능. 프라이빗으로 하면 한정된 사람만 접근 가능.

- build setting : 이미지 태그, github에서 가져올 소스(브랜치 정보 등)을 설정한다.

아래 Build Settings에서, Connected 되어 있는 github를 누르면, 자신의 아이디와, 레포지토리를 선택할 수 있다. 위에서 생성한 docker_example 레포지토리를 선택하자.

아래 BUILD RULES 에서 + 를 선택하면, 아래와 같이 내용이 나온다. 특별히 변경할 것 없이 그대로 진행하면 된다.

다 되면, Create & Build를 선택한다. 아래와 같은 화면이 나오며, 오른쪽 중간에 주황색으로 Build in 부분을 선택한다.

 

현재 빌드 진행상황을 실시간으로 확인할 수 있다. 처음에는 아래와 같이 PENDING이 나오며, 완료될때까지 기다리면 된다. 조금 시간이 걸릴 수 있다.

다 되면 아래와 같이 SUCCESS 결과가 나오며, 진행 로그도 확인할 수 있다.

 

이제 다시 내 도커허브의 레포지토리에 가면, 만든 이미지가 생성된 것을 확인할 수 있다. 해당 이미지를 push로 다운받을 수 있게 아래 명령어도 친절하게 적혀있다.

마지막으로, 내 도커 서버에서 해당 이미지를 다운받아 실행까지 해보자.

결과

문제없이 잘 완료되었다.

 

* Private Redistry란?

Private Rgeistry는 public한 docker hub와는 다르게, 개인적으로만 사용하도록 개인 서버에 구축하는 도커 이미지 저장소이다. 회사 사내에서 사용하거나 개인적으로 만든 이미지를 올리고 관리하기 위해서 사용된다.

 

Private registry를 구축하기 위해서는 도커에서 제공하는 "Registry" 라는 이미지를 사용할 수 있다. 도커에서 이 이미지를 실행하면 이 컨테이너에 자신의 이미지를 업로드할 수 있는 것이다. 이 Registry도 도커 컨테이너이므로, 여기 올리는 이미지들을 계속 유지하려면 볼륨을 다른 외부 스토리지 등 안정성있는 스토리지로 사용해야 한다.

 

Registry 이미지는 0점대 버전과 2점대 버전 2가지 계열이 있다. 0점대 버전은 파이썬, 2점대 버전은 go로 구축되어 있다. 이 둘은 호환성이 없으므로 주의해야 한다. 일반적으로 버전2를 많이 사용한다. 또한 registry는 5000번 포트를 사용한다.

 

 

* Private Registry 구축

컨테이너 시작

docker container run -d --restart=always -p 5000:5000  -v /registry:/var/lib/registry/docker/registry/v2 --name registry registry:latest

 다 완료한 후, 포트가 열렸는지 확인.

netstat -nlp | grep 5000

레지스트리에 있는 이미지 확인 (현재는 아무것도 없음)

curl -X GET http://localhost:5000/v2/_catalog

 

# 참고 : push / pull 할 때 "http: server gave HTTP response to HTTPS client" 비슷한 메시지가 발생하는 경우

사설 레지스트리를 구축한 자체 도커 서버에서 pull/push를 하는 경우는 문제가 없다. 하지만 외부에서 접속하는 경우, 도커 레지스트리에는 로그인 기능이 없다. 따라서 nginx의 기본 인증 기능을 사용한다. http 프로토콜은 인증을 지원하지 않으므로 반드시 https 프로토콜을 사용한다. 사설 레지스트리를 사용하는 다른 도커 엔진은 https 프로토콜을 사용해야 한다.

 

그러나 https 프로토콜을 쓰려면 복잡한 인증서 작업을 수행해야 한다. 사설 레지스트리에 접속할 다른 도커 엔진에 인증서 작업을 하지 않으려면, 도커 데몬에 insecure-registries 옵션을 설정하여 인증되지 않은 Registry를 사용할 수 있도록 해야 한다. /etc/docker/daemon.json 파일을 생성한 후, 아래와 같이 입력한다. (docker swarm을 사용한다면, 모든 노드에 아래와 같이 수정한다)

{
    "insecure-registries" : [ "도커서버ip:5000" ]
}

위 작업 후, docker 데몬을 재시작한다.

systemctl restart docker

docker info로 아래 내용 추가되었는지 확인

 

* 도커 이미지 업로드/다운로드하기 (도커허브, Private Registry)

 

1. 도커파일로 빌드하거나, 현재 보유한 이미지를 지정

아래와 같이 여러가지 이미지가 있을 것이다. 업로드할 이미지를 선택한다. 도커파일로 빌드할 때는 이름을 2번에 나오는 형식대로 지정한다.

 

2. 이미지에 태그 설정

이미지를 업로드하려면, 이미지에 Private Registry의 주소 또는 도커허브의 계정명을 명시해주어야 한다. 이러한 이름은 형식이 있다. 도커허브에 올리는 경우 계정명을 사용하고 (내 계정에 올리니깐) Private Registry에 올리는경우 해당 서버의 ip주소:포트번호 형식을 사용한다. 도커허브의 오피셜 이미지 (centos, nginx, mariadb 등등)는 이름 형식이 단순히 이미지명으로 되어있다. 아래 정리를 참고하자.

 

일반 이미지 형식 : 계정명(주소명:포트번호)/이미지명:태그 
오피셜 이미지 형식 : 이미지명:태그

 

따라서 아래 명령어로 이미지의 이름을 변경한다.

docker image tag 대상이미지명 새로운이미지정보

예시1 - 도커허브에 업로드용 : docker image tag sample utyk/sample:latest

예시2 - Private Registry에 업로드용 : docker image tag sample 192.168.1.61:5000/sample:latest

 

3. 업로드

 

* 도커허브에 업로드 : docker image push utyk/sample:latest  

도커허브에 업로드하려면, 해당 도커 엔진 서버에 utyk 계정으로 로그인이 되어있어야 한다. 로그인 관련해서는 아래 포스팅을 참고한다.

2020/03/31 - [Docker Basic] - [Docker Basic] 04. 도커 레지스트리와 도커허브

2020/04/09 - [Docker Basic] - [Docker Basic] 06. Docker 기본 명령어 - 시스템 명령

 

* Private Registry에 업로드 : docker image push 192.168.1.61:5000/sample:latest

 

4. 업로드 된 이미지 조회하기

 

* 도커허브

도커허브 사이트에서 내 계정으로 로그인하면, 아래와 같이 이미지가 올라간 것을 확인할 수 있다.

* Private Registry

Registry 컨테이너를 운영하고 있는 도커 엔진 서버에서, 다음 명령으로 이미지를 확인할 수 있다. 

curl -X GET http://도커서버IP:5000/v2/_catalog

 

5. Private 레지스트리에서 이미지를 다운로드하기

업로드 했던 이미지는 삭제해버리고, 다시 Private Registry에서 해당 이미지를 받아보자.

docker image pull 계정명(주소명:포트번호)/이미지명:태그
docker image pull 192.168.1.61:5000/sample:latest

 

* Registry 이미지 GUI tool "hyper"

Private Registry의 단점 중 하나는 어떤 이미지가 올라가 있는지 확인하기가 번거롭다는 것이다. 이를 위해 누군가가 WEB GUI로 Private Registry를 볼 수 있는 이미지를 만들었다. 아래 링크를 참고한다. 

https://hub.docker.com/r/hyper/docker-registry-web/

 

Docker Hub

 

hub.docker.com

설치하는 방법은 해당 링크에서 확인할 수 있으며, 가장 간단한 방법으로 한번 구축해본다. 또한 해당 링크 문서에서 작동하지 않는 버전이나 유의점이 있으므로 잘 참고해야 한다.

 

실행하기 

docker run -it -p 8080:8080 --name Registry_web --link Registry컨테이너이름 -e REGISTRY_URL=http://도커서버IP:5000/v2 -e REGISTRY_NAME=도커서버IP:5000 hyper/docker-registry-web

--link 에는 이미 구축해놓은 registry 컨테이너의 이름을 명시하며,  REGISTRY_NAME 부분은 WEB GUI에 나오는 이름이므로 자유롭게 쓰면 된다. 가능하면 해당 도커서버의 주소면 좀 더 보기 쉬우므로 추천된다.

 

위 명령을 실행하면, 아래와 같이 쭉 로그가 나오며, server startup 이라고 나온다.

해당 주소로 접속해보면, 아래와 같이 나오는 것을 확인할 수 있다.

이미지를 하나 올려보자.

 

다음과 같이 나오는 것을 확인할 수 있다.

# 참고

selinux가 설정되어 있는 경우, web registry 화면에서 에러가 날 수 있다. selinux를 허용하는 설정을 적용하거나, selinux를 해제해야 한다.

 

+ Recent posts