삽질 후기를 공유합니다😎
프로젝트 언어 && 프레임워크: Java11, Spring Boot2
배포 환경: EC2, Elasticcache, Docker
EC2 인스턴스 플랫폼: Ubuntu
Elasticcahe에서 클러스터를 생성한 후 ec2와 연결했다. ec2 인스턴스에서 redis를 설치한 후 로컬에서 redis를 연결했는데 성공했다! 다 된 줄 알았다. 이제 swagger에서 API 요청을 해보자~~
✔️ Github Actions에 작성한 script에서 docker image에 오탈자가 있었다.
Github Actions는 log도 편리하게 확인 가능하다.
오류의 원인은 repository가 없거나 로그인이 안됐거나 둘 중 하나다.
나는 login step을 앞에서 진행했기 때문에 로그인이 제대로 된 걸 확인 할 수 있었다. 따라서 로그인 문제가 아니라 repository문제라는 걸 알 수 있었다. 그런데 뭐가 문제인지 몰라서 한 참을 헤맸다....
munbnaggu
로 되어있는걸 munbanggu
로 수정하니 이번 오류는 해결되었다😅
✔️ Github Actions script에 docker-compose.yml 파일 경로를 잘못 입력했다.
실제 위치한 경로 👉🏻 ~/compose/docker-compose.yml
잘못 입력한 경로 👉🏻 /compose/docker-compose.yml
홈 디렉토리
각 사용자는 시스템에서 자신만의 홈 디렉토리를 가진다. 사용자가 로그인하면 기본적으로 사용자의 홈 디렉토리로 이동하게 된다. 홈 디렉토리는 사용자에 따라 다르며, 보통/home/사용자이름
또는~/사용자이름
과 같은 형태로 위치한다.
루트 디렉토리
시스템의 최상위 디렉토리로, 모든 디렉토리와 파일이 이 디렉토리를 기준으로 계층화된다. 루트 디렉토리는 모든 사용자와 파일 시스템의 시작점이며,/
로 표시된다.
기존 파일을 삭제하고 /compose/docker-compose.yml
경로로 YAML 파일을 다시 생성했다.
✔️ 경로 지정 옵션을 빼먹었다.
// 잘못된 작성
docker-compose /compose/docker-compose.yml up -d
// 올바른 작성
docker-compose -f /compose/docker-compose.yml up -d
-f
옵션은 사용할 Docker Compose 파일의 경로를 지정하는 역할을 한다. 그런데 이걸 빼먹었다..
✔️ 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
을 찾게 된다.
✔️ 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"
✔️ /var/run/docker.sock 파일에 대해 권한이 없다.
/var/run/docker.sock
파일은 Docker와 통신하기 위한 소켓 파일이다.
sudo chmod 666 /var/run/docker.sock
이렇게 권한을 주니 해결되었다.
사용자를 docker 그룹에 추가하여 Docker 명령을 실행할 수 있도록 하는 방법도 있다.
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"
application.yml
과 연결시킬 이름이다.springboot
서비스가 시작되기 전에 redis
서비스가 먼저 시작되도록 보장한다. Dockerfile
의 경로를 지정한다. - 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 빌드/배포 자동화