Docker Compose로 Redis 와 Spring Boot 애플리케이션 실행

나지은·2024년 1월 4일
0

CI/CD

목록 보기
2/2

삽질 후기를 공유합니다😎

프로젝트 언어 && 프레임워크: Java11, Spring Boot2
배포 환경: EC2, Elasticcache, Docker
EC2 인스턴스 플랫폼: Ubuntu

문제 상황

Elasticcahe에서 클러스터를 생성한 후 ec2와 연결했다. ec2 인스턴스에서 redis를 설치한 후 로컬에서 redis를 연결했는데 성공했다! 다 된 줄 알았다. 이제 swagger에서 API 요청을 해보자~~

내가 했던 실수 1.

✔️ Github Actions에 작성한 script에서 docker image에 오탈자가 있었다.

Github Actions는 log도 편리하게 확인 가능하다.
오류의 원인은 repository가 없거나 로그인이 안됐거나 둘 중 하나다.

나는 login step을 앞에서 진행했기 때문에 로그인이 제대로 된 걸 확인 할 수 있었다. 따라서 로그인 문제가 아니라 repository문제라는 걸 알 수 있었다. 그런데 뭐가 문제인지 몰라서 한 참을 헤맸다....
munbnaggu로 되어있는걸 munbanggu로 수정하니 이번 오류는 해결되었다😅

내가 했던 실수 2.

✔️ Github Actions script에 docker-compose.yml 파일 경로를 잘못 입력했다.

실제 위치한 경로 👉🏻 ~/compose/docker-compose.yml
잘못 입력한 경로 👉🏻 /compose/docker-compose.yml

홈 디렉토리
각 사용자는 시스템에서 자신만의 홈 디렉토리를 가진다. 사용자가 로그인하면 기본적으로 사용자의 홈 디렉토리로 이동하게 된다. 홈 디렉토리는 사용자에 따라 다르며, 보통 /home/사용자이름 또는 ~/사용자이름과 같은 형태로 위치한다.

루트 디렉토리
시스템의 최상위 디렉토리로, 모든 디렉토리와 파일이 이 디렉토리를 기준으로 계층화된다. 루트 디렉토리는 모든 사용자와 파일 시스템의 시작점이며, /로 표시된다.

기존 파일을 삭제하고 /compose/docker-compose.yml 경로로 YAML 파일을 다시 생성했다.

내가 했던 실수 3.

✔️ 경로 지정 옵션을 빼먹었다.

// 잘못된 작성
docker-compose /compose/docker-compose.yml up -d
// 올바른 작성
docker-compose -f /compose/docker-compose.yml up -d

-f 옵션은 사용할 Docker Compose 파일의 경로를 지정하는 역할을 한다. 그런데 이걸 빼먹었다..

내가 했던 실수 4.

✔️ Dockerfile 위치를 잘못 입력했다.

  // docker-compose.yml
  springboot:
    ...
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"

내가 처음으로 생성했던 docker-compose.yml이다.
context 옵션은 Dockerfile이 있는 디렉토리를 가리키고, dockerfile 옵션은 Dockerfile의 경로를 상대 경로로 지정한다. 내가 작성한 내용을 보면 Dockerfile을 현재 위치에서 찾게 되는데, 현재 위치는 ~/compose 이다. 하지만 Docerfile은 프로젝트 루트에 있기 때문에 찾을 수 없다......

// docker-compose.yml 수정
  springboot:
    ...
    build:
      context: ../../
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"

context../../로 바꿈으로써 /compose/docker-compose.yml 파일이 있는 디렉토리에서 두 단계 상위 디렉토리로 이동해서 프로젝트 루트를 참조하게 된다. 즉, docker-compose up을 실행할 때, Docker Compose는 /compose/docker-compose.yml 파일이 있는 디렉토리에서 상대 경로를 사용하여 프로젝트 루트에 있는 Dockerfile을 찾게 된다.

내가 했던 실수 5.

✔️ docker-compose.yml에 spring project에 대해 image를 잘못 입력했다.

  // docker-compose.yml
  springboot:
    image: springboot
    container_name: {container}
    build:
      context: ../../
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"

docker-compose.yml을 작성하기 이전에 docker image를 잘 만들어서 push 했었다. 그런데 이건 완전히 잊어버렸나보다. image 옵션에는 docker hub에 등록된 이미지 이름을 넣도록 한다 😅

  // docker-compose.yml 수정
  springboot:
    image: {docker image}
    container_name: {container}
    build:
      context: ../../
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"

내가 만난 오류 1.

✔️ /var/run/docker.sock 파일에 대해 권한이 없다.


/var/run/docker.sock 파일은 Docker와 통신하기 위한 소켓 파일이다.

sudo chmod 666 /var/run/docker.sock

이렇게 권한을 주니 해결되었다.

사용자를 docker 그룹에 추가하여 Docker 명령을 실행할 수 있도록 하는 방법도 있다.

docker-compose.yml 최종 버전

version: "3.8"

services:
  redis:
    image: redis:alpine
    container_name: redis
    hostname: redis
    ports:
      - "6379:6379"

  springboot:
    image: {docker image}
    container_name: {container}
    depends_on:
      - redis
    build:
      context: ../../
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"
  • version: Docker Compose 파일의 버전로 Docker 엔진의 버전화 호환되는 버전을 입력한다.
  • service: redis와 springboot 2개의 컨테이너를 생성한다.
  • image: redis의 경우 docker에 있는 redis를 사용하고, springboot의 경우 내가 만든 이미지를 사용한다.
  • container_name: 임의로 지정했는데 본인이 사용할 컨테이너 이름을 지정해주면 된다.
  • hostname: application.yml과 연결시킬 이름이다.
  • depends_on: springboot 서비스가 시작되기 전에 redis 서비스가 먼저 시작되도록 보장한다.
  • build: 컨테이너를 실행하는데 사용할 이미지를 만들기 위한 Dockerfile의 경로를 지정한다.

gradle.yml 배포 부분 최종 버전

    - name: Deploy
      uses: appleboy/ssh-action@master
      id: deploy
      with:
        host: ${{ secrets.HOST }}
        username: ubuntu
        key: ${{ secrets.PRIVATE_KEY }}
        envs: GITHUB_SHA
        script: |
          sudo chmod 666 /var/run/docker.sock

          # Docker가 설치되어 있는지 확인
          docker version

          # 컨테이너 중지 및 제거
          docker-compose -f /compose/docker-compose.yml down

          # 실행 중인 컨테이너가 있는지 확인 후 중지
          if [ -n "$(docker ps -q)" ]; then
              sudo docker stop $(docker ps -q)
          fi

          # 모든 컨테이너 제거
          if [ -n "$(docker ps -qa)" ]; then
              sudo docker rm $(docker ps -qa)
          fi

          # 이미지 가져오기
          sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.PROJECT_NAME }}

          # 컨테이너 실행
          docker-compose -f /compose/docker-compose.yml up -d

📖 참고

Redis를 Docker Compose로 실행하기
Redis EC2에 Docker Container화, Spring Boot에서 Redis 쓰기
Docker Compose와 Git Actions로 CI/CD 구현하기
[CI/CD] Github Action & Docker & Springboot & Redis & Slack 빌드/배포 자동화

profile
즐거움을 찾는 개발자🐯

0개의 댓글