0%

GitHub Container Registry로 Docker 이미지 관리하기(without. Docker Hub)

서론

도커 이미지를 배포할 때, 대표적으로 Docker Hub를 사용한다. 하지만 Docker Hub는 무료 계정의 경우, 1개의 private repository만 사용할 수 있다. public으로 사용할 수 있는데, 민감한 정보가 포함된 이미지를 올리기에는 부적합하다. 그래서 GitHub Container Registry를 사용해보기로 했다.

GitHub Container Registry란?

GHCR은 GitHub에서 제공하는 Docker 이미지 저장소이다. GitHub의 레포지토리와 연동되어 있어서, 이미지를 레포지토리와 함께 관리할 수 있다. 무료 계정에서도 500MB GitHub Packages가 허용되는 범위 내에서 퍼블릭/프라이빗을 무제한으로 사용할 수 있다.

Docker 이미지 빌드

도커 이미지를 빌드하고 이미지 저장소(GHCR, Docker hub 등)에 올리기 위해서는 Dockerfile이 필요하다. 아래는 Python을 실행하는 Dockerfile이다.

1
2
3
4
5
6
7
FROM python:3.8-slim

WORKDIR /app

COPY . /app

CMD ["python", "app.py"]

사용할 파이썬 파일도 함께 작성한다.

1
2
3
# app.py
while 1:
print("ghcr test hello!!")

GitHub Actions로 이미지 빌드 및 배포 자동화

GitHub Actions를 사용해서 Docker 이미지를 빌드하고 GHCR에 올리는 작업을 자동화할 수 있다. /.github/workflows/ 아래에 workflow 파일을 작성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
name: Build and Push Docker Image

on:
push:
branches:
- main

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4.1.5

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3.3.0

- name: Log in to GitHub Container Registry
uses: docker/login-action@v3.2.0
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GHCR_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@v5.3.0
with:
context: .
push: true
platforms: linux/amd64, linux/arm64
tags: ghcr.io/${{ github.repository_owner }}/ghcr-cicd-test:latest

위의 workflow 파일을 .github/workflows/build.yml로 저장하면, main 브랜치에 push가 발생할 때마다 Docker 이미지를 빌드하고 GHCR에 올린다.

권한 설정

GHCR에 이미지를 올리기 위해서는 토큰 발급과 레포지토리 시크릿 설정이 필요하다.

Settings -> Developer settings -> Personal access tokens(classic) -> Generate new token을 클릭해서 write:packages, delete:packages권한을 선택하고 토큰을 발급한다.
ghcr-token

한 번 발급한 토큰은 다시 볼 수 없으니, 잘 보관해야 한다. 또한 유출에도 주의해야 한다.
ghcr-secret

레포지토리에서 Settings -> Secret and Variables -> Actions -> New repository secret를 클릭해서 GHCR_TOKEN을 추가한다.
ghcr-secret

작동 확인

.yml파일에 작성한 대로 push를 하면, GitHub Actions가 동작한다.
ghcr-action

https://github.com/marinesnow34?tab=packages로 이동하면, 이미지가 올라간 것을 확인할 수 있다.
ghcr-image

서버에서 이미지 받아서 실행하기

GHCR에서 이미지를 받아 오기 위해서는 cli로 로그인을 해야 한다. 위에서 발급한 토큰을 입력하고 본인 아이디로 로그인 하면 된다.

해당 명령어를 실행하면 평문으로 비밀번호가 저장되기 때문에 보안을 중요하게 생각한다면, docker-credential-pass를 사용하자.

1
echo gh_ONwJ3l0KdAAFslMHDkUOt5EtHoSsahOXSRYX | docker login ghcr.io -u marinesnow34 --password-stdin

이후에 GHCR에서 이미지를 받는다.

1
docker pull ghcr.io/marinesnow34/ghcr-cicd-test:latest

실행한다.

1
docker run ghcr.io/marinesnow34/ghcr-cicd-test:latest

잘 실행되는 것을 확인할 수 있다.

ghcr-run

결론

GitHub Container Registry를 사용해서 Docker 이미지를 빌드하고 배포하는 방법을 알아보았다. private repository를 무제한으로 사용할 수 있어서, 민감한 정보가 포함된 이미지를 올리기에 적합하다.

또한 GHCR과 GitHub Actions을 활용한다면 CI/CD를 쉽게 구축할 수 있다.