교내 프로그래밍 경진대회의 운영진으로 참여하게 되어 Domjudge 8.0 Docker Image와 GCP로 대회 환경을 세팅했던 과정을 정리해보려 한다. 제발 올해에 이어 내년에 제3회 프로그래밍 경진대회가 열려서 이 글이 후배들에게 도움이 되었으면 좋겠다.
GCP VM Instance 생성
Google Cloud Platform 사이트의 좌측 메뉴에서 Compute Engine > VM 인스턴스 > 상단바에서 '인스턴스 만들기'를 선택한다. 리전은 asia-northeast3(서울)을 선택하고, 영역은 a, b, c 중 아무거나 선택한다.
머신 유형은 대회 규모에 따라 달라지는데, 보통 20팀 당 CPU 1개(=채점서버 1개)로 생각하면 된다고 한다. 메모리같은 경우 자바 코드 채점을 위한 JVM이 돌아가려면 최소 2GB 이상의 스펙이 필요하다. 우리 대회는 약 80~100명 정도의 참여가 예상되고 자바 코드 채점을 지원하므로 최소 4코어, 2GB 메모리가 필요하나, 지금은 테스트용으로 돌려보는 거라 e2-medium을 선택했다.
부팅 디스크는 Ubuntu 18.04 LTS, 크기는 16GB로 했다. 10GB로 했더니 judgehost에서 디스크 메모리 부족 경고가 떠서 조금 늘렸다. 방화벽은 HTTP/HTTPS 모두 허용한 다음 '만들기'를 눌러 인스턴스를 생성하자. 무료 크레딧을 사용중이라면 꼭 하단에 '이 VM 인스턴스에 무료 체험판 크레딧이 사용됩니다.' 메세지가 보이는지 확인해야 한다.
VM에 Docker 설치
https://docs.docker.com/engine/install/ubuntu/ 글을 바탕으로 작성했다.
1. apt 패키지를 업데이트하고 HTTPS를 통한 레포지토리 사용을 위해 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
2. Docker 공식 GPG Key를 추가한다.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
3. stable 레포지토리 설정을 위해 다음 명령어를 입력한다. nightly나 test 모드를 사용하고 싶다면 상단의 링크로 이동해서 원문을 보자.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
4. apt 패키지를 업데이트하고, 최신 버전의 Docker 엔진과 컨테이너를 설치한다. 특정 버전으로 설치하고 싶다면 원문을 보자.
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
5. hello-world 이미지를 실행해 Docker가 잘 설치되었는지 확인한다. CLI에 도커의 환영 메세지가 뜬다면 성공적으로 설치된 것이다.
sudo docker run hello-world
judgehost, domserver, mariadb 동시 실행을 위한 docker-compose 설치
docker-compose는 다중 컨테이너 도커 애플리케이션을 빌드할 때 사용한다. 한 개의 서버에서 여러 개의 도커 컨테이너를 동시에 실행하고 쉽게 관리할 수 있도록 해준다. 이 글에선 docker-compose를 통해 judgehost, domserver, mariadb 실행을 관리할 것이다.
1. Docker Compose를 다운로드한다. (2022.03.12 기준 1.29.2 버전이 최신)
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2. 다운로드받은 파일에 외부 접근 권한을 부여한다.
sudo chmod +x /usr/local/bin/docker-compose
3. 설치가 잘 되었는지 확인한다.
docker-compose --version
이 방법으로 설치하는 데 문제가 있는 경우, Running Docker Compose with Docker 문서를 참고해서 설치하면 된다.
여러 개의 judgehost 사용을 위한 grub 설정
채점을 담당하는 judgehost를 켜기 전, 여러 개의 judgehost를 사용하기 위해 grub 세팅을 마쳐야 한다.
아래 명령어로 /etc/default/grub 파일을 수정하자. GRUB_CMDLINE_LINUX_DEFAULT 값을 'cgroup_enable=memory swapaccount=1'로 설정한다. vi 에디터는 i 키를 눌러 삽입 모드로 전환 가능하고, 내용을 수정한 후에 esc 키를 누른 다음 :wq를 입력하면 수정 사항이 저장된다.
sudo vi /etc/default/grub
다음 파일에도 GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295 cgroup_enable=memory swapaccount=1" 라인을 추가해준다.
sudo vi /etc/default/grub.d/50-cloudimg-settings.cfg
두 파일 모두 수정했다면 다음 명령어를 입력해 업데이트를 적용하고 재부팅한다.
update-grub
sudo reboot
docker-compose.yml 설정과 domjudge 실행
이제 docker compose로 대회 진행에 필요한 domjudge 도커 이미지들을 받아와 실행할 차례다. 현재 위치에 docker-compose.yml 파일을 생성하고 다음 내용을 집어넣는다.
version: '3.9'
networks:
domjudge:
name: domjudge
services:
mariadb:
container_name: mariadb
image: mariadb:latest
networks:
- domjudge
ports:
- 13306:3306
environment:
- MYSQL_ROOT_PASSWORD=rootpw
- MYSQL_USER=domjudge
- MYSQL_PASSWORD=djpw
- MYSQL_DATABASE=domjudge
command: --max-connections=1000
domserver:
container_name: domserver
image: domjudge/domserver:latest
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
networks:
- domjudge
ports:
- 12345:80
depends_on:
- mariadb
environment:
- CONTAINER_TIMEZONE=Asia/Seoul
- MYSQL_HOST=mariadb
- MYSQL_ROOT_PASSWORD=rootpw
- MYSQL_USER=domjudge
- MYSQL_PASSWORD=djpw
- MYSQL_DATABASE=domjudge
judgehost-0:
container_name: judgehost-0
image: domjudge/judgehost:latest
privileged: true
hostname: judgedaemon-0
volumes:
- /sys/fs/cgroup:/sys/fs/cgroup:ro
networks:
- domjudge
depends_on:
- domserver
environment:
- CONTAINER_TIMEZONE=Asia/Seoul
- JUDGEDAEMON_USERNAME=judgehost
- DAEMON_ID=0
- JUDGEDAEMON_PASSWORD=your_password
다음으로 우선 mariadb와 domserver만 활성화한다. judgehost를 활성화하지 않는 이유는 domserver와 mariadb를 활성화하기 전까지는 judgehost의 초기 비밀번호를 모르고, 여러 개의 judgehost를 사용하려면 grub 설정이 추가적으로 필요하기 때문이다.
docker-compose up -d mariadb domserver
다시 인스턴스에 접속한 후, mariadb와 domserver가 정상적으로 실행되었고 방화벽 설정이 되어있다면 http://{public_ip}:12345로 접속했을 때 돔저지 UI가 보일 것이다. 이제 아래 명령어로 judgehost의 비밀번호를 확인한다. 가장 마지막에 출력되는 것이 비밀번호다.
docker exec -it domserver cat /opt/domjudge/domserver/etc/restapi.secret
이제 알아낸 비밀번호를 docker-compose.yml에 적어주자. judgehost-0의 JUDGEDAEMON_PASSWORD 환경변수 값을 위의 명령어로 알아낸 비밀번호로 바꾼다.
이제 아래 명령어를 입력해 judgehost를 활성화하자.
docker-compose up -d
judgehost가 정상적으로 활성화되었다면 http://{public_ip}:12345 페이지에 admin 계정으로 로그인한 후 judgehost 탭에 들어갔을 때 다음과 같이 status에 초록불이 들어와있다.
여러 개의 judgehost를 사용하고 싶다면 사용하려는 judgehost의 개수만큼 Judgehost User를 생성하고, docker-compose.yml 파일에 judgehost-0과 똑같은 양식으로 judgehost-1, judgehost-2, ...를 생성한 다음 JUDGEDAEMON_USERNAME과 JUDGEHOST_PASSWORD를 각각 생성할 때 설정한 값으로 바꾸면 된다.
'끄적 > 끄적끄적' 카테고리의 다른 글
대학원에 갑니다 (3) | 2023.09.24 |
---|---|
[KT Cloud] 무료 체험 쿠폰으로 서버 생성하고 사용하기 + 디스크 용량 확장 방법 (3) | 2022.06.06 |
텝린이의 텝스(10/2, 314회차) 후기 + 10/9 점수 발표 (2) | 2021.10.04 |
[Coursera] 코세라 학생용 플랜 이용하기 (a.k.a 등록금 뽕뽑기) (4) | 2021.09.22 |