💻현재 상황 + 문제점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
'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 |