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 |