Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 다이나믹 프로그래밍
  • 코딩테스트
  • kibana
  • grafana
  • til
  • 에라토스테네스의 체
  • kotlin
  • webflux
  • java
  • Docker
  • 코틀린
  • 프리코스
  • ec2
  • enum
  • spring
  • 코틀린 인 액션
  • elasticsearch
  • 레포지토리
  • SQL
  • 프로그래머스
  • Wil
  • 내림차순
  • 우아한테크코스
  • Android
  • 문자열
  • 백준
  • 파이썬
  • 안드로이드
  • MariaDB
  • rsocket

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230615] EC2 + Docker Compose 통한 배포
TIL

[TIL - 20230615] EC2 + Docker Compose 통한 배포

2023. 6. 16. 02:52

 

💻현재 상황 + 문제점1

https://docs.docker.com/engine/install/debian/ 도커 엔진 설치 EC2

 

Docker Compose 설치

// 최신 docker compose 받아오기
sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

// 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

// 확인
docker-compose -v

 

자바 설치

sudo apt-get update && sudo apt-get upgrade

sudo apt-get install -y openjdk-17-jdk

// 버전 확인
java -version

// 컴파일러 버전 확인
javac -version

 

레디스 설치

sudo apt-get install redis-server

// 버전 확인
redis-server --version

// 동작 확인
redis-cli

 

set을 통해 key-value 데이터를 저장하고 get으로 확인하니 정상적으로 동작하는 것을 확인할 수 있었다.

확인 후에는 flushall 명령을 통해 모든 키를 삭제해주었다.

 또는 간단히 ping을 입력했을 때 pong 출력이 뜨는걸 확인해도 된다.

// key-value 저장
set 1 "one"

// key의 value 확인
get 1

// 모든 키 삭제
flushall

 

 

Redis 설정

외부에서 EC2에 설치된 레디스에 접속할 수 있도록 설정해주었다.

https://wookgu.tistory.com/26 참고

sudo vi /etc/redis/redis.conf

 

레디스 서버를 시작해준다.

// 시작
sudo systemctl start redis-server

// 재시작
sudo systemctl restart redis-server

// 시작 여부 확인
sudo systemctl status redis

 

ContentService에서 Redis를 사용할 때는 host가 localshost 였는데, 이제는 EC2의 Redis에 접속하도록 변경해야 했다.

기존 코드가 다음과 같은데, localhost 자리에 EC2의 Ipv4 주소를 입력했지만 연결되지 않았다.

분명 EC2 보안 그룹에도 6379 설정해줬는데...!

 

@Configuration
public class RedisConfiguration {
    @Bean
    @Primary
    public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() {
        return new LettuceConnectionFactory("localhost", 6379);
    }

    @Bean
    public ReactiveRedisTemplate<String, RefreshToken> refreshTokenDefine(ReactiveRedisConnectionFactory factory) {
        Jackson2JsonRedisSerializer<RefreshToken> serializer = new Jackson2JsonRedisSerializer<>(RefreshToken.class);

        RedisSerializationContext.RedisSerializationContextBuilder<String, RefreshToken> builder =
                RedisSerializationContext.newSerializationContext(new StringRedisSerializer());

        RedisSerializationContext<String, RefreshToken> context = builder.value(serializer).build();

        return new ReactiveRedisTemplate<>(factory, context);
    }
}

📃문제점1-시도

시도1

기존 코드를 사용하지 않고 다음과 같이 RedisClient를 만들었다.

@Configuration
public class RedisConfiguration {
    @Bean
    public RedisClient redisClient() {
        return RedisClient.create(RedisURI.builder()
                .withHost("localhost")
                .withPort(6379)
                .build());
    }

    @Bean
    public ReactiveRedisTemplate<String, RefreshToken> refreshTokenDefine(ReactiveRedisConnectionFactory factory) {
        Jackson2JsonRedisSerializer<RefreshToken> serializer = new Jackson2JsonRedisSerializer<>(RefreshToken.class);

        RedisSerializationContext.RedisSerializationContextBuilder<String, RefreshToken> builder =
                RedisSerializationContext.newSerializationContext(new StringRedisSerializer());

        RedisSerializationContext<String, RefreshToken> context = builder.value(serializer).build();

        return new ReactiveRedisTemplate<>(factory, context);
    }
}

 

Postman으로 로그인을 하면 리프레시 토큰이 Redis에 저장되는데, localhost로 했을 때 일단 잘 적용이 되었다.

 

이제 localhost 자리에 EC2의 Ipv4 주소를 입력하고 테스트해보았다.

엥! 그런데 여전히 로컬에 저장되었다. 단순히 Client 생성만 하고 사용하는 곳이 없긴 하다...!  아마 디폴트가 localhost이고 지금 설정한 RedisClient는 아예 적용이 안 되는 것 같다. 

 

시도2

음 아무래도 ReactiveRedisTemplate 빈을 만들 때 ReactiveRedisConnectionFactory 빈이 필요하기 때문에 기존 코드를 사용해야할 것 같다.

 

로컬에서 Redis가 설치된 경로로 이동해 원격 접속 해봤는데 다음과 같이 떴다.

 

나는 비밀번호를 설정하지 않아서 작성하지 않았다.

.\redis-cli -h [EC2 IPv4 주소] -p 6379


🔍문제점1-해결

로컬에서 redis-cli 접속이 됐다. 아무래도 EC2 레디스 설정 파일을 수정하고 재시작이 제대로 안 된 모양이다...!

 

그리고 PostMan에서 HTTP 요청 보내도 잘 된다 ㅠㅠ

 

요청을 보내고 원격 접속한 redis-cli 에서 keys *  명령을 입력하면 key-value 데이터가 잘 저장 되었다.


💻문제점2

우선 도커가 제대로 안 깔렸던 것 같아서 다시 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

 

우선 FileZila를 사용해서 프로젝트를 EC2에 복사했다.

 

그리고 docker-compose up --build -d 명령을 수행했는데 permission denied 오류가 떴다.

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dubuntu%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied

 

파일 권한을 666으로 변경하고 docker login 해주었다.

sudo chmod 666 /var/run/docker.sock

docker login

 

그리고 다시 docker-compose up --build -d 해주었다.

docker-compose up --build -d

//종료
docker-compose down

 

아무런 오류없이 이미지가 생성되고 컨테이너가 실행됐다.

docker ps 명령을 통해 직접 확인할 수 있다.

 

그런데... 로컬에서 ContentService를 실행하고 postman으로 테스트했을 때는 잘 연결되었는데, 컨테이너 실행 후 테스트 하니까 연결 실패가 떴다.

 

찾아보니, 컨테이너 안에서 실행되는 애플리케이션은 (ContentService) EC2인스턴스의 IP 주소와 직접 통신할 수 없다고 한다...! 그래서 Redis로 도커로 띄워야 하는 모양


📃문제점2-시도

시도1

docker-compose.yml에 다음 내용으로 변경

  content-server:
    build:
      context: ./ContentService
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    links:
      - redis
    depends_on:
      - redis
    networks:
      - commeow-network
    volumes:
      - stream-volume:/home/streams

  redis:
    image: "redis"
    ports:
      - "6379:6379"
    networks:
      - commeow-network

 

ContentService의 application.properties변경

spring.redis.host=redis 
spring.redis.port=6379

 

시도2

  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"
    labels:
      - "name=redis"
      - "mode=standalone"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - commeow-network
    volumes:
      - redis-container:/data
spring.redis.host=host.docker.internal
spring.redis.port=6379

🔍문제점2-해결

헉.. 생각해보니 지금 docker-compose up 을 할 때 매번 새롭게 build되는게 아니라는 것을 깨달았다. 그래서 계속 이전 build가 이미지로 업로드 되던 것 ㅠㅠㅠ

 

시도1번 내용으로 수정하고 다시 빌드한 후 docker-compose up 하니까 잘 된다.

 

얼른 Dockerfile에 clean build 하도록 추가해야할 듯....

 

방송을 시작하고, 크롬 확장 프로그램인 hls 플레이어를 설치하고 다음 링크로 접속하면 방송이 잘 된다!!!!

http://15.165.196.255:8080/streams/test3/master.m3u8

 

728x90

'TIL' 카테고리의 다른 글

[TIL - 20230620] Webflux CORS  (0) 2023.06.21
[TIL - 20230616]  (0) 2023.06.17
[TIL - 20230614] docker compose  (0) 2023.06.15
[TIL - 20230612] OBS 방송 시작 관련 문제 해결  (0) 2023.06.13
[TIL - 20230608] Webflux + Websocket + Kafka  (0) 2023.06.08
    'TIL' 카테고리의 다른 글
    • [TIL - 20230620] Webflux CORS
    • [TIL - 20230616]
    • [TIL - 20230614] docker compose
    • [TIL - 20230612] OBS 방송 시작 관련 문제 해결
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바