2021-03-09(Tue)

항목

내용

학습 날짜

2021-03-09(화)

학습 시간

11:00~24:00

학습 범위 및 주제

docker-compose

학습 목표

클러스터에서도 docker-compose up으로 애플리케이션 동작이 가능하도록 셋팅

동료 학습 방법

스크럼 후 각자 코딩

상세 학습 내용

클러스터에서 docker-compose up 키워드를 입력하면 바로 애플리케이션 작동이 가능해야한다.

그런데 일전에 클러스터에서 docker-compose up 을 입력했을 때 정상작동하지 않았다는 내용을 공유 받고, 과제 제출 전에 해결해야한다고 판단했다.

저녁 18시가 넘었고 클러스터까지 1시간 가량 걸리지만, 팀을 위해 직접 클러스터로 가서 문제를 해결했다!

문제) 클러스터 goinfre 디렉토리에서 git clone 받은 애플리케이션은 Mounts denied 문제로 제대로 작동하지 않는다.

해결) Resources>File sharing에 정의된 경로에서 git clone 받고 애플리케이션을 작동시킨다.

현재 우리 프로젝트는 git clone 을 받은 뒤 clone 받은 디렉토리에 위치한 tmp/db 를 postsqlDB에 mount 시킨다. 이 때 File sharing에 등록된 경로의 하위 경로에 위치한 docker contianer 만이 bind mounted 될 수 있다.

문제는 goinfre 디렉토리 자체가 클러스터 마스터 계정이 아니면 권한을 마음대로 바꿀 수 없는 디렉토리이고, File sharing에 등록해도 적용되지 않는 것이다.

goinfre 외 디렉토리에서는 용량이 그리 많진 않지만, 그냥 /User 경로에서 git clone하자!

문제) 최초 구동시에는 DB 존재 유무에 따라 rake db:seed를 실행시켜야한다.

해결) custom rake command를 작성하여 DB와의 connection을 검사하고 rake db:seed를 실행시키도록 수정하였다.

아래는 관련 PR 내용

entrypoint.sh에 custom rake를 작성하여 추가했습니다.

  • rake db:connection_exists : web container가 DB와 connection이 있는지를 확인합니다.

  • rake db:is_first_time: web_container에 rake db:seed가 실행된 적 있는지 여부를 확인합니다. rake db:seed가 실행되었다면 적어도 web_owner 유저가 1명은 있어야하므로 User.find(1)로 확인합니다.

위 custom rake 들로 판단되는 상태에 따라 rake db:migraterake db:seed를 실행합니다.

한편 기존에는 우리 .gitignore에 DB의 볼륨으로 쓰이는 /tmp/db 디렉토리가 포함되어있어서, 단순히 github을 clone 받으면 /tmp/db 디렉토리가 생성되지 않았습니다. 때문에 이 상태에서 docker-compose up을 입력하면 에러가 발생했었습니다. --> entrypoint에서 /tmp/db 디렉토리 존재여부에 따라 /tmp/db 디렉토리를 생성도록 수정하여 해결했습니다.

문제) tournament schedular가 rake 명령어를 실행할 때마다 실행되며, job queue에 추가된다.

해결) 아래처럼 명령어를 검사하여 rake 명령어를 입력하면 실행되지 않도록 처리한다.

원인은 initializer 디렉토리에 tournament reschedule 메서드를 실행시키는 파일이 포함되어있고, rake 명령어를 입력할 때도 이 파일들이 모두 실행되는 것이 원인이었다. 아래처럼 명령어를 검사하는 조건을 삽입하여 rails s 로 서버를 작동시킬 때만 메서드가 작동하도록 수정하였다.

if defined?(Rails::Server)
  Tournament.retry_set_schedule
  War.retry_set_schedule
end

아래는 docker-compose 개념을 확인하며 가볍게 메모한 내용.

Docker-Compose

Compose is a tool for defining and running multi-container Docker applications.

과정은 아래와 같다.

  1. Dockerfile에 앱 환경을 정의한다.

  2. docker-compose.yml에 앱 빌드하는 동작을 정의한다.

  3. docker-compose up 커맨드로 앱을 빌드한다.

docker-compose.yml

build할지, 아니면 도커허브에 있는 image를 사용하거나 선택할 수 있다.

만약 networks 옵션을 주지 않으면 하나의 내부 compose 내에서 네트워크로 구성이 되어있어서 통신을 할 수 있다.

만약 compose로 다른 compose의 어플리케이션 DB를 연결하고 싶다면, network 를 정의해야 한다.

여기 쓰이는 경로는 docker-compose.yml 파일이 위치하는 곳 기준이다.

Dockerfile에서 접근은 상위 경로에는 접근이 안된다. 하위 경로에만 접근이 가능하다.

production.yml

docker-compose down --volumes 커맨드로 볼륨을 포함해서 데이터 볼륨을 삭제할 수 있다.

기능

컴포즈의 기능은 아래 상황에서 효과적이다.

  • 싱글호스트 환경을 여러개 구성할 때

  • 컨테이너 만들 때 볼륨데이터를 준비하는 경우

    • old container에 볼륨을 감지하면, new container에 볼륨을 복사한다.

  • 컨테이너가 변경되었을 때만 컨테이너를 재구성할 경우

  • 환경간 변경

Docker-compose getting start

Docker-compose use case

https://docs.docker.com/storage/bind-mounts/

Custom task with rake

rake는 그냥 ruby scripts를 쓸 수 있게 도와주는 툴이라고 생각하면 된다.

학습 내용에 대한 개인적인 총평

늦은 시간에 클러스터에 가기 많이 귀찮았지만, 앞으로를 위해 빨리 처리해둘 필요가 있는 task였다. 결과적으로 귀찮음을 무릅쓴 덕분에 반나절만에 해결하여 팀에 기여하였으니 뿌듯했다.

그리고 docker 에 대해 좀 더 학습할 수 있어서 역시 뿌듯했다.

다음 학습 계획

  • War-operation 구현

Last updated