이 전의 실습은 Docker 입문에 있다.
우리가 만든 이미지를 저장소에 업로드할 수 있다. 이를 위해 이미지 저장소인 Container Registry에 Docker Image를 Push할 수 있다.
Contaner Registry는 Dockerhub, GCP GCR, AWS ECR등 존재하며 별도로 지정하지 않으면 기본적으로 Dockerhub를 사용하게 된다.
우리는 GCP를 사용하고 있기 때문에 GCR를 이용하여 실습한다.
처음 접속하면 사용을 클릭하면 되고 Registry에는 아무것도 존재하지 않다.
우리는 Local에서 GCR로 이미지를 Push할 준비를 하기 위해 gcloud를 설치한다. Cloud SDK install, gcloud는 GCP를 CLI로 쉽게 사용할 수 있도록 만든 도구이다.
압축해제 후 홈으로 디렉토리를 이동시킨 후 본인의 shell에 맡게 vi 편집기로 들어가서 아래의 내용을 추가한다.( vi ~/.zshrc)
## Google Cloud
export GOOGLE_CLOUD_SDK_PATH=[google-cloud-sdk를 넣어둔 경로]
export PATH=$PATH:$GOOGLE_CLOUD_SDK_PATH/bin
gcloud --version으로 잘 설치가 되었는지 확인하고 gcloud auth login
으로 로그인과 인증을 한다. 이때 .config/gcloud
오류가 뜰 수 있는데 mac의 경우 finder를 키고 CMD + shift + G
를 사용해 ~/.config
로 이동하여 gcloud 디렉토리를 생성해준다. 생성 했다면 정보 가져오기, 공유 및 권한을 "읽기 및 쓰기"로 부여 해준다.
gcloud config set project <PROJECT ID>
명령어를 통해 gcloud에서 사용할 project가 인식된다.
gcloud auth configure-docker
을 사용하면 Docker를 사용하기 위한 기본 설정을 할 수 있다.
docker tag "기존 이미지:태그" "새 이미지 이름:태그"
로 이미지의 이름을 바꿔준다. GCR에 올릴 이미지의 이름은 gcr.io/GCP 프로젝트 이름/이미지 이름형태여야 한다.
docker push "이미지 이름:태그"
를 사용해서 Push를 할 수 있으며 GCR 콘솔로 이동하면 Push된 이미지를 확인할 수 있다.docker pull
명령어로 어디서든 받을 수 있다.도커 이미지를 서버에 배포하는 가장 간단한 방법은 Cloud 서비스를 활용하는 방법이다. GCP의 경우 Cloud Run, AWS의 경우 ECS이다.
GCP Cloud Run을 사용하는 경우 GCR에 올린 이미지 경로만 입력하면 끝이다.
Cloud Run 인스턴스가 만들어지면 URL이 자동으로 생성되고 curl로 요청을 날리면 서버가 잘 동작하는 것을 확인할 수 있다.
Compute Engine을 띄우고 해당 인스턴스가 실행될 때 Docker Image를 가지고 실행하도록 설정할 수 있다. Github Action을 사용하여 Docker Image Push를 자동화할 수 있다.
서비스 계정의 이름을 지을 때 사용자와 구분하기 위해 service-account와 같은 suffix나 회사에서 사용하는 규칙을 지켜 생성하면 된다.
여기서 역할을 지정할 수 있지만 우리는 진행하지 않고 넘어간다.
회사에서는 굉장히 Strict하게 권한을 관리하지만 개인 프로젝트에서는 서비스 계정에 편집자(높은 권한)을 주는 경우도 존재하며 언제나 필요한 권한만 주는 것을 추천한다.
from google.cloud import storage
storage_clinet = \
storage.Client.from_service_account_json('service_account.json')
서비스 계정을 Python 스크립트에서 사용할 경우 위와 같이 사용할 수 있다.
서비스계정의 키값을 Github Repository의 Secret에 추가 (SERVICE_ACCOUNT_KEY)
GCP 대시보드의 프로젝트 ID를 Secret에 추가 (GCP_PROJECT_ID)
생성한 인스턴스의 이름을 Secret에 추가 (GCE_INSTANCE)
생성한 인스턴스의 존을 Secret에 추가 (GCE_INSTANCE_ZONE)
Local에서 Docker 이미지를 빌드하고 gcr.io/project_id/이미지이름의 형식으로 태그를 지정한다.
docker push를 통해 GCR에 추가한다.
GCR에 이미지가 추가 되었다면 Compute Engine을 통해 인스턴스를 만든다. 이때 Github의 Secret으로 지정한 이름과 지역을 맞춰준다.
컨테이너 항목으로 넘어가서 생성한 이미지의 경로를 적어준다.
이제 Github Action을 통해 Workflow를 생성해볼 수 있다.
작업의 흐름은 아래와 같다.
Feature/xxx Branch에서 작업
Main Branch로 Pull Request
Review 후 Merge
Merge된 파일에서 Docker Image Build
Docker Image Push
Compute Engine에서 Docker Image 업데이트 요청
여기서 4~6번의 과정을 Workflow로 생성해보자.
하나의 Docker Image가 아니라 여러 Docker Image를 동시에 실행하고 싶을때 사용한다. 혹은 A Image로 컨테이너를 띄우고, 그 이후에 B Container를 실행해야 하는 경우(A는 DB, B는 웹서비스)에 사용할 수 있다.
이때 docker run
명령어를 사용하게 되면 옵션이 너무 다양하고 Volume Mount를 하지 않았다면 데이터가 모두 날라갈 수 있다.
이런 경우에 활용할 수 있는 것이 Docker Compose이며 여러 컨테이너를 한번에 실행할 수 있고 여러 컨테이너의 실행 순서, 의존도를 관리할 수 있으며 docker-compose.yml
파일에 작성한다.
위의 docker-compose.yml은 db컨테이너와 app컨테이너 두개를 실행시키는 내용이다.
Docker Image를 일괄 실행하는 명령어는 docker-compose up이며 이때 필요한 이미지를 pull하거나 build 하는 등의 과정도 포한된다.
docker-compose up -d
: 백그라운드 실행docker-compose down
: 서비스 중단docker-compose logs <서비스명>
: 로그 확인참고로 docker-compose.yml 파일을 수정하고 up을 하게 되면 컨테이너를 재생성하고 서비스를 재시작한다. up이 완료되면 docker ps 명령어나 docker-compose ps 명령어로 현재 실행되고 있는 컨테이너를 확인할 수 있다.