docker compose redis 실행방법 이해하기
Docker Compose Install
VM Instance에 docker와 docker-compose 가 설치되어 있어야 github actions를 통해 원격 접속하여 해당 명령어를 실행시킬 수 있습니다.
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
docker-compose 실행 권한 얻기
sudo chmod +x /usr/local/bin/docker-compose
docker & docker-compose 설치 확인하기
docker --version
docker-compose --version
Springboot 프로젝트 Dockerfile 작성하기
FROM openjdk:17-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app.jar"]
- 파일 이름은 무조건 Dockerfile로 작성합니다.
- 프로젝트 root 위치에 작성한다.
- -Dspring.profiles.active는 실행할 profile을 지정합니다. (저는 prod로 지정하여 application-prod.yml을 사용합니다.)
Github Actions Script
# Docker login
- name: Docker login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
# Docker build & push
- name: Docker build and push
run: |
docker build -t ${{ secrets.DOCKER_USERNAME }}/meetfolio .
docker push ${{ secrets.DOCKER_USERNAME }}/meetfolio:latest
# Deploy and docker-compose up and down
- name: Deploy in GCP
uses: appleboy/ssh-action@master
env:
COMPOSE: "/home/ubuntu/compose/docker-compose.yml"
with:
host: ${{ secrets.GCE_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
envs: COMPOSE
script: |
sudo docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
sudo docker-compose -f $COMPOSE down --rmi all
sudo docker pull ${{ secrets.DOCKER_USERNAME }}/meetfolio
sudo docker-compose -f $COMPOSE up -d
# Docker login - build & push
- docker hub에 접속하기 위한 login을 진행합니다.
- 도커 이미지를 만들기 위해 docker build를 작성합니다.
-t [docker_username]/[image_name]으로 이미지명과 태그를 작성할 수 있습니다. - docker build 한 이미지를 로그인한 docker hub에 push(업로드) 합니다.
위 과정을 통해 개발한 스프링부트 프로젝트가 이미지화되어 도커 허브에 업로드됩니다.
# Deploy
- VM Instance에 원격 접속하기 위해 필요한 host, username, key 값을 작성합니다.
- docker-compose로 실행하기 위해 실행할 docker-compose.yml 파일의 경로를 환경변수에 설정합니다.
(VM Instance에 docker-compose.yml을 작성하고 이를 통해 docker compose up and down을 합니다.) - docker login을 통해 vm instance에서 해당 docker hub에 올라간 이미지를 사용할 수 있게 합니다.
- docker-compose -f [도커 컴포즈 yml 파일]을 통해 실행할 docker-compose.yml을 지정합니다.
--rmi all 옵션을 통해 계속해서 자동 배포되면서 전 버전의 이미지가 쌓이지 않게 전 버전 이미지를 삭제합니다. - docker pull [docker_username]/[image:tag]를 통해 다운로드할 도커허브와 이미지를 지정합니다.
- docker-compose -f [도커 컴포즈 yml 파일] up -d를 통해 스프링 부트와 레디스를 한 번에 실행합니다.
/home/ubuntu/compose/docker-compose.yml 에 위치한 docker-compose.yml 파일
Springboot에서 Redis 사용을 위한 설정
- redis dependency 설정
- application.yml에 redis sever 설정
- redis configuration 설정
1. redis dependency 설정
implementation 'org.springframework.boot:spring-boot-starter-data-redis
2. application.yml에 redis sever 설정
3. redis configuration 설정
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
redisConfiguration.setHostName(host);
redisConfiguration.setPort(port);
redisConfiguration.setPassword(password);
return new LettuceConnectionFactory(redisConfiguration);
}
@Bean
public RedisTemplate<?, ?> redisTemplate() {
RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
return template;
}
}
트러블 슈팅
문제 1: pull 받는 이미지에 docker_username을 docker-compose에 작성하지 않아서 이미지를 인식할 수 없었다.
문제 2: Github actions에서 원격 접속한 후 docker-compose.yml을 실행하는데 이미지를 pull 받는데 docker login error가 발생했었다.
해결 1:
redis 이미지처럼 공식적인 이미지는 앞에 docker_username이 필요 없다.
나는 개발한 springboot 파일을 build 한 후 내 도커 허브에 올렸기 때문에 내 docker_username/image:tag를 작성해서 정상적으로 pull을 받을 수 있게 했다.
해결 2:
github actions에서 제공하는 docker login을 통해 원격 접속까지도 docker login이 유지된다고 잘못 생각했다.
"docker login error"로 에러 로그를 읽어보고 원격 접속한 VM에 docker login이 되지 않음을 알 수 있었다.
그래서 나는 docker-compose up이나 down을 하기 전에 docker login 코드를 실행해 문제를 해결했다.