안녕하세요. J4J입니다.
이번 포스팅은 GitLab Runner + Docker + Ubuntu를 이용해 자동 배포 환경을 구축할 때 Docker Hub를 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
들어가기에 앞서 다음 글을 참고하시면 좋을 것 같습니다.
Docker Hub 사용하는 방법
위의 링크를 통해 GitLab Runner, Docker, Ubuntu를 활용하여 SpringBoot, Next가 함께 자동 배포되는 환경을 세팅했었습니다.
하지만 여기서 자동 배포될 때 이미지를 push 하여 저장해두는 저장소는 GitLab에서 제공해주는 Container Registry를 활용했습니다.
하나 알고 가야될 점은 저 같은 경우는 공개적으로 사용되는 GitLab을 활용했기 때문에 Container Registry가 존재했지만 GitLab 서버를 자체적으로 구축하는 등의 방식을 취했을 경우 Container Registry를 사용할 수 없는 환경일 수도 있습니다.
이런 상황에서는 Docker Hub를 이용하여 동일한 환경을 마련해줄 수 있고 Docker Hub 또한 Harbor와 같은 유사한 형태의 다른 저장소를 자체적으로 구축하여 동일한 상황을 만들어줄 수 있습니다.
여기서는 Docker Hub를 이용해보도록 하겠습니다.
[ 1. Docker Hub에 접속하여 계정 생성 ]
https://hub.docker.com에 접속하여 계정을 생성해주시면 됩니다.
[ 2. 생성된 계정을 GitLab에 변수로 등록 ]
GitLab → Settings → CI/CD에 가보면 다음과 같이 Variables라는 메뉴를 확인할 수 있습니다.
여기서 변수를 등록해줄 수 있는데 이곳에 등록된 변수들은 .gitlab-ci.yml파일에서 가져다 사용해줄 수 있습니다.
Docker Hub계정은 중요 정보이기 때문에 .gitlab-ci.yml에 직접 작성하여 노출시키기에는 보안적인 문제가 발생되기 때문에 GitLab에서 제공해주는 Variables를 활용해주면 되겠습니다.
Add variable을 누른뒤 먼저 Docker Hub 아이디를 등록해보겠습니다.
다음과 같이 Key에 DOCKER_HUB_ID를 입력, Value에 생성한 자신의 Docker Hub 아이디 입력, Type은 Variable로 한 뒤 Add variable을 눌러 생성해줍니다.
다시 Add variable을 눌러 이번엔 Docker Hub 비밀번호를 등록해보겠습니다.
다음과 같이 Key에 DOCKER_HUB_PW를 입력, Value에 생성한 자신의 Docker Hub 비밀번호 입력, Type은 File로 한 뒤 Add variable을 눌러 생성해줍니다.
등록이 완료되었다면 다음과 같이 변수가 생성된 것을 확인할 수 있습니다.
[ 3. .gitlab-ci.yml 파일 수정 ]
기존에 작성되었던 .gitlab-ci.yml 파일은 다음과 같습니다.
# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
- build
- test
- package
- deploy
fe-build: # JOB 이름
# 사용될 이미지 설정
image: node:12.18.4
# stage 설정
stage: build
# 실행될 script 설정
script:
- cd fe
- npm install
- npm run build
# artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
artifacts:
# 보관이 이루어질 경로 설정
paths:
- fe/.next
- fe/node_modules
# 유효기간 설정
expire_in: 1 days
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-build: # JOB 이름
# 사용될 이미지 설정
image: maven:3.8.4-jdk-11
# stage 설정
stage: build
# 실행될 script 설정
script:
- cd be
- mvn clean package -DskipTests
# artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
artifacts:
# 보관이 이루어질 경로 설정
paths:
- be/target/*.jar
# 유효기간 설정
expire_in: 1 days
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
fe-test: # JOB 이름
# 사용될 이미지 설정
image: node:12.18.4
# stage 설정
stage: test
# 실행될 script 설정
script:
- cd fe
- npm run test
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-test: # JOB 이름
# 사용될 이미지 설정
image: maven:3.8.4-jdk-11
# stage 설정
stage: test
# 실행될 script 설정
script:
- cd be
- mvn test
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
# 전역 변수 설정
variables:
FE_IMAGE_NAME: $CI_REGISTRY_IMAGE/fe:latest # FE 이미지 이름
BE_IMAGE_NAME: $CI_REGISTRY_IMAGE/be:latest # BE 이미지 이름
fe-package: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: package
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker build -t $FE_IMAGE_NAME fe/. # fe에 있는 Dockerfile로 build
- docker push $FE_IMAGE_NAME # Container Registry에 image push
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-package: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: package
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker build -t $BE_IMAGE_NAME be/. # be에 있는 Dockerfile로 build
- docker push $BE_IMAGE_NAME # Container Registry에 image push
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
fe-deploy: # JOB 이름
# stage 설정
stage: deploy
# tag 설정 (수행이 이루어질 GitLab-Runner tag 등록)
tags:
- dev-all
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker rm -f fe-con || true # 기존에 존재하던 Container 삭제
- docker rmi $FE_IMAGE_NAME || true # 기존에 존재하던 이미지 삭제
- docker pull $FE_IMAGE_NAME # Container Registry에서 이미지 가져오기
- docker run --name fe-con -p 8088:8088 -d $FE_IMAGE_NAME # Container 생성 및 실행
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
be-deploy: # JOB 이름
# stage 설정
stage: deploy
# tag 설정 (수행이 이루어질 GitLab-Runner tag 등록)
tags:
- dev-all
# script가 실행 전 수행 될 script
before_script:
- docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
# 실행될 script 설정
script:
- docker rm -f be-con || true # 기존에 존재하던 Container 삭제
- docker rmi $BE_IMAGE_NAME || true # 기존에 존재하던 이미지 삭제
- docker pull $BE_IMAGE_NAME # Container Registry에서 이미지 가져오기
- docker run --name be-con -p 8080:8080 -d $BE_IMAGE_NAME # Container 생성 및 실행
# script가 실행된 후 수행 될 script
after_script:
- docker logout # GitLab Container Registry 로그아웃
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
이곳에서 변경해줘야 될 부분은 variables와 package, deploy stage의 before_script입니다.
variables에서는 이미지 이름 앞에 Docker Hub 아이디를 넣어줘야 합니다.
그리고 before_script에서는 GitLab Container Registry에 로그인하고 있는 것을 Docker Hub에 로그인되도록 다음과 같이 수정해줄 수 있습니다.
# 전역 변수 설정
variables:
# FE_IMAGE_NAME: $CI_REGISTRY_IMAGE/fe:latest # GitLab Container Registry에서 FE 이미지 이름
# BE_IMAGE_NAME: $CI_REGISTRY_IMAGE/be:latest # GitLab Container Registry에서 BE 이미지 이름
FE_IMAGE_NAME: $DOCKER_HUB_ID/fe:latest # Docker Hub에서 FE 이미지 이름
BE_IMAGE_NAME: $DOCKER_HUB_ID/be:latest # Dokcer Hub에서 BE 이미지 이름
fe-package: # JOB 이름
# script가 실행 전 수행 될 script
before_script:
# - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
- docker login -u $DOCKER_HUB_ID --password-stdin < $DOCKER_HUB_PW # Docker Hub에 로그인
be-package: # JOB 이름
before_script:
# - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
- docker login -u $DOCKER_HUB_ID --password-stdin < $DOCKER_HUB_PW # Docker Hub에 로그인
fe-deploy: # JOB 이름
# script가 실행 전 수행 될 script
before_script:
# - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
- docker login -u $DOCKER_HUB_ID --password-stdin < $DOCKER_HUB_PW # Docker Hub에 로그인
be-deploy: # JOB 이름
# script가 실행 전 수행 될 script
before_script:
# - docker login $CI_REGISTRY -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD # GitLab Container Registry에 로그인
- docker login -u $DOCKER_HUB_ID --password-stdin < $DOCKER_HUB_PW # Docker Hub에 로그인
[ 4. Docker Hub 확인 ]
위와 같이 .gitlab-ci.yml을 수정했으면 commit, push를 통해 trigger가 생성되도록 해줍니다.
모든 stage가 정상적으로 수행될 경우 자신의 Docker Hub를 확인해보면 다음과 같이 이미지가 생성되어 있는 것을 확인할 수 있습니다.
또한 기존에 Gitlab Container Registry를 활용했던 것처럼 Ubuntu에도 Docker Container가 생성되고 실행된 것을 확인할 수 있습니다.
이상으로 GitLab Runner + Docker + Ubuntu를 이용해 자동 배포 환경을 구축할 때 Docker Hub를 사용하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
댓글