본문 바로가기
Devops/GitLab

[GitLab] GitLab Runner + Docker + Ubuntu 환경 구축 (4) - Docker Hub를 사용할 경우

by J4J 2022. 2. 12.
300x250
반응형

안녕하세요. 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을 눌러 생성해줍니다.

 

Docker Hub 아이디 Variable 생성

 

 

 

다시 Add variable을 눌러 이번엔 Docker Hub 비밀번호를 등록해보겠습니다.

 

다음과 같이 Key에 DOCKER_HUB_PW를 입력, Value에 생성한 자신의 Docker Hub 비밀번호 입력, Type은 File로 한 뒤 Add variable을 눌러 생성해줍니다.

 

Docker Hub 비밀번호 Variable 생성

 

 

 

등록이 완료되었다면 다음과 같이 변수가 생성된 것을 확인할 수 있습니다.

 

Variable 생성 확인

 

 

 

[ 3. .gitlab-ci.yml 파일 수정 ]

 

기존에 작성되었던 .gitlab-ci.yml 파일은 다음과 같습니다.

 

 

728x90

 

 

# 실행될 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가 생성되도록 해줍니다.

 

trigger 생성

 

 

 

모든 stage가 정상적으로 수행될 경우 자신의 Docker Hub를 확인해보면 다음과 같이 이미지가 생성되어 있는 것을 확인할 수 있습니다.

 

Docker Hub 이미지 생성

 

 

 

또한 기존에 Gitlab Container Registry를 활용했던 것처럼 Ubuntu에도 Docker Container가 생성되고 실행된 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

이상으로 GitLab Runner + Docker + Ubuntu를 이용해 자동 배포 환경을 구축할 때 Docker Hub를 사용하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글