본문 바로가기

생각정리/항해99

[실전 프로젝트] 1주차 - 2

Docker를 이용한 CI / CD 구현


EC2 서버에 Docker 설치

1. apt를 사용해 도커를 설치할 준비를 한다.

sudo apt update

2. 도커 설치전 필요한 패키지 설치

ca-certificates : 인증서 관련 모듈

curl : HTTP 등을 통해 파일을 내려받기 위한 모듈

gnupg : 디지털 서명을 사용하기 위한 모듈

lsb-release : 리눅스 배포판을 식별하는 데 사용하는 모듈

sudo apt-get install ca-certificates curl gnupg lsb-release

3. GPG 키 추가

sudo -fsSl https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

4. 리포지토리 추가

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 리포지토리 업데이트

sudo apt-get update

6. 도커 설치

sudo apt-get install docker-ce docker-ce-cli containerd.io

7. 도커 사용 설정 변경

관리자 외의 사용자도 도커를 사용할 수 있도록 설정

sudo usermod -aG docker $USER

8. 설치 확인

# 도커 버전 확인
docker -v
# 도커 실행 여부 확인
systemctl status

# 도커 엔진 시작
systemctl start docker
# 도커 엔진 종료
systemctl stop docker
# 도커 엔진 자동 실행 설정
systemctl enable docker

Dockerfile 생성

root 위치에 Dcokerfile을 생성한다.

프로젝트를 이미지로 만들기 위해서 먼저 프로젝트를 빌드한다.

빌드해서 나온 jar파일을 이용해서 docker를 빌드하도록 설정을 한다.

# jdk17 image start
FROM openjdk:17-jdk
# 인자 정리 -Jar
ARG JAR_FILE=build/libs/*.jar
# jar file copy
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]

gradle.yml의 CI 설정 수정

gradle빌드 이후에 docker 빌드를 추가해준다.

docker를 빌드하고 로그인액션을 이용해서 로그인 후 해당 이미지를 docker hub에 push 해준다.

  # Docker 이미지 빌드
- name: docker image build
  run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/test .
  # DockerHub Login
- name: docker login
  uses: docker/login-action@v2
  with:
    username: ${{ secrets.DOCKERHUB_USERNAME }}
    password: ${{ secrets.DOCKERHUB_PASSWORD }}
  # Docker Hub push
- name: docker Hub push
  run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/test

gradle.yml의 CD 설정 수정

EC2 서버에 외부에서 접속을 하여 직접 명령어를 통해서 docker를 배포하는 방법을 사용하였다.

appleboy/ssh-action@master : ssh를 이용해서 외부에서 EC2서버에 접속을 한다.

host : 접속을 하기 위한 EC2 서버 DNS 주소

username : EC2 서버 OS마다의 기본 username

key : EC2 서버에 접속하기 위한 SSH PEM 키

최신버전의 이미지를 pull 받고 현재 켜져 있는 컨테이너를 정지시키고 최신버전의 이미지의 컨테이너를 실행시킨다.

정지되어 있는 컨테이너를 삭제시키고 사용 중이지 않는 이미지를 삭제시킨다.

# Docker Hub pull
- name: deploy
  uses: appleboy/ssh-action@master
  with:
    host: ${{ secrets.EC2_HOST }}
    username: ubuntu
    key: ${{ secrets.EC2_SSH_KEY }}
    script: |
      sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/test:latest
      sudo docker stop $(sudo docker ps -a -q)
      sudo docker run -dit -p 8080:8080 ${{ secrets.DOCKERHUB_USERNAME }}/test:latest 
      sudo docker rm $(sudo docker ps --filter 'status=exited' -a -q)
      sudo docker image prune -a -f
EC2에서 설정을 하면서 도커 설치 시 중간에 갑자기 멈추면서 오류가 난 듯했으나 EC2를 다시 실행하니 정상적으로 깔려서 도커가 실행 중이었다.
도커를 이용한 CI부분을 하면서 도커 빌드 시 마지막에 .을 사용해서 도커파일이 현재 디렉터리에 있다고 명령어를 적어 줬어야 하는데 안 적어 두어 빌드실패를 했었다.
CD부분에서는 명령어를 실행하는데 docker 권한 설정을 안 한 상태에서 sudo를 안 써서 명령어가 안 먹혀 오류가 나 sudo를 사용해서 명령어를 실행해주던지 docker를 일반유저 권한으로 변경을 해주어서 사용을 해주면서 해결했다.

'생각정리 > 항해99' 카테고리의 다른 글

[실전 프로젝트] 2주차 - 2  (0) 2023.10.13
[실전 프로젝트] 2주차 - 1  (0) 2023.10.13
[실전 프로젝트] 1주차 - 1  (1) 2023.10.05
[주특기 프로젝트] 10일차  (0) 2023.09.27
[주특기 프로젝트] 9일차  (0) 2023.09.26