Programming-[Infra] 31

Docker network: haproxy Layer4 connection problem, info: "Connection refused" Problem

1. 문제 상황 docker container를 통해 keycloak server를 3개 실행하고, HAproxy를 통해 load balancing을 할려고 했다. 설정 파일인 haproxy.cfg는 아래와 같이 설정했다. 설정 내용에 중요한 부분이나 내가 겪었던 문제가 되는 부분들을 주석으로 넣어두었다. #---------------------------------------------------------------------# Global settings#---------------------------------------------------------------------global log 127.0.0.1 local2 # 처음에는 /var/... 주소로 설정되어있었는데 h..

Elasticache 연결 문제 - <unresolved>:6379, Redis, Springboot, Lettuce

문제상황 Elasticache - Redis를 사용하기 위해 Redis cluster를 생성하고 스프링부트 - LettuceConnectionFactory를 통해 연결할려는데, 아래와 비슷한 에러가 발생했다. Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to {레디스 엔드포인트 주소}.cache.amazonaws.com/:6379 at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:78) at io.lettuce.core.RedisConnectionException.create(RedisConnectionException.java:..

[탐험]S3 Content-Disposition으로 파일 다운로드 이름 변경, CloudFront 캐시 무효화

1. 결론 s3는 Content-Disposition값에 따라 다운로드하는 파일의 이름을 변경할 수 있다. 다만 S3 자체에서 다운로드 할때는 AWS에서 해당 header값을 override해서 안된다. URL을 거쳐서 진행할때만 가능하다. CloudFront를 사용하는 경우 요청의 X-Cache 값을 살펴보자. S3와 즉각적으로 동기화가 안된다면 캐싱 때문일 수도 있고, 이때는 무효화를 적극적으로 고려해보자. 상기 내용 때문에, CloudFront로 연결된 S3의 Content-Disposition 값을 그대로 프론트에서 활용하는 것은 실시간성을 확보할 수 없다. 실시간으로 변경 및 표시가 필요하다면 따로 DB 등에 저장해놓고 해당 값을 프론트에서 조회해야한다. 2. 문제상황 S3에 업로드된 파일을 사..

[TIL]Connection error..Max Retries... localhost로 호출 -> docker로 호출시 host

현상 python에서 requests를 통해 http://localhost:8080로 환경변수를 설정한 후 요청을 보내는데 자꾸 아래처럼 에러가 났다. HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /xxx (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 61] Connection refused')) 원인 .env에 아래처럼 환경변수를 지정해서 서버를 실행했었다. TEST_URL=http://localhost:8080 그리고,, docker를 통해서 실행했다! docker를 통해 host 컴퓨터인 localhost를 호..

도커 교과서(엘튼 스톤맨, 심효섭) - 20. 비동기 통신, 마무리

1. 비동기 메시징 동기적, 비동기적 통신 방식에 대한 설명은 생략한다. 비동기 메시징 방식을 이용하면 서버와 클라이언트 사이의 메시지 큐에 요청 또는 응답 내용을 저장하고 있으므로 혹시나 서버나 클라이언트에서 문제가 발생하더라도 통신 내용을 메시지 큐에 안전하게 저장해놓을 수 있다는 장점이 있다. 레디스 사용 실습 실습으로 레디스 컨테이너를 실행해본다. docker network create ch21 docker container run -d --name redis --network ch21 diamol/redis docker container logs redis --tail 1 메시지를 보내본다. 메시지큐는 일반적으로 최적화된 전용 통신 프로토콜을 갖고 따로 메시지에 가공을 하지 않는 형태이기 때문에..

도커 교과서(엘튼 스톤맨, 심효섭) - 18. 리버스 프록시-1: nginx, 로드밸런싱, 라우팅과 SSL, Traefik

1. 프록시, 리버스 프록시 서버 보통 프록시 서버는 클라이언트단을 관리하는 의미인 것 같다. 내 컴퓨터에서 인터넷으로 요청을 하면 프록시가 적용된 네트워크에서 해당 요청을 가로채서 허용된 사이트인지 확인하거나 빠른 속도를 위해 접근하려는 사이트의 캐시를 제공하는 용도로 사용한다. 리버스 프록시 서버는 서버단을 관리하는 의미인 것 같다. 서버로 들어오거나 서버에서 나가는 모든 트래픽을 관리하면서 해당 트래픽이 어떤 애플리케이션에서 출발한 것인지 파악한다. 그리고 서버 내 애플리케이션의 응답 내용을 캐싱하였다가 적절하게 가공하여 클라이언트에게 전달하기도 한다. [리버스 프록시- 애플리케이션 컨테이너들간 상호 작용 그림 추가] 그림에서 리버스 프록시는 포트를 외부로 공개한 유일한 컨테이너가 된다. 이 덕분에..

도커 교과서(엘튼 스톤맨, 심효섭) - 17. 로그 설정: fluentd, elasticsearch, kibana

1. 도커의 로깅 구성 도커는 표준 출력(stdout), 표준 오류(stderr) 스트림을 주시하면서 스트림을 통해서 출력되는 내용을 수집한다. 이런 표준 입출력들은 운영체제의 커널과 연결된 셸(터미널)로 입력받고, 표시해주는 것을 의미한다. 어쨌든 도커의 컨테이너는 이런 방식을 통해서 수집된다. 포어그라운드로 다음 컨테이너를 실행해보면 터미널에 표준 출력이 출력되는 것을 볼 수 있다. 5초마다 찍힌다. docker container run diamol/ch15-timecheck:3.0 따라서 애플리케이션이 표준 출력으로 로그를 출력한다면, 도커 컨테이너에서도 이를 감지하여 로그를 저장하거나 출력할 수 있게 된다. 포어그라운드로 실행되는 컨테이너뿐만 아니라 터미널 세션과 분리되어 데몬으로 작동하는 컨테이..

도커 교과서(엘튼 스톤맨, 심효섭) - 16. 이미지 최적화, 환경 변수 설정 관리

이미지를 최적화하는 것은 이미지의 용량을 최소화하고 보안 위험을 줄일 수 있다. 1. 이미지 최적화 이미지를 확인하고 관리하는 명령어로 다음 명령어들을 사용할 수 있다. docker system df # 현재 환경에서의 이미지, 컨테이너, 볼륨, 캐시 등 상황 표시 docker system prune # 현재 사용하지 않는 이미지 레이어나 빌드 캐시를 비워줌 컨테이너나 이미지 레이어는 잠시 사용 중이지 않을 수도 있으므로 docker system prune 명령어는 신중히 사용해야한다. rm 명령어는 용량을 줄여주지 않는다. FROM diamol/base CMD echo app- && ls app && echo docs- && ls docs COPY . . RUN rm -rf docs 이미지에서 불필요한..

도커 교과서(엘튼 스톤맨, 심효섭) - 15. 다중 아키텍처 빌드

1. 다중 아키텍처 지원이 필요한 이유 이 교재의 맨 처음 글에서 도커는 가상 머신과 다르게, 실행하고 있는 컴퓨터와 운영체제는 공유하면서 IP, host, 드라이브를 개별적으로 갖는다고 했었다(architecture-specific). 따라서 도커의 이미지 빌드 및 실행은 대상 컴퓨터의 운영 체제로 어떤 아키텍처를 갖느냐에 영향을 받게 된다. arm64, amd64 등 여러 아키텍처에 따라 개별적인 관리가 필요하다. 클라우드에서만 하더라도 AWS에서 ARM 아키텍처를 사용하여 가상 머신을 열고 노드로 컨테이너를 구동하면 AMD 프로세서를 사용하는 경우에 비해서 단가가 절반 정도로 저렴하다고 한다. 그리고 IoT 기반의 프로세서에서 동작하게 할려는 경우 라즈베리파이처럼 ARM 프로세서를 사용하는 아키텍처..

도커 교과서(엘튼 스톤맨, 심효섭) - 14. 도커 원격 접속, 보안과 context

1. 도커 API 접속 엔드포인트 도커 엔진에 접근하여 여러 작업들을 할려면 도커 API에 요청을 해야된다. 그리고 기본적으로 도커 API는 로컬 채널에만 열려있다. 다시 말해 본인의 컴퓨터로만 본인 컴퓨터의 도커 엔진에 접근할 수 있다. 비보안 HTTP로 도커 엔진 접근해보기 비보안 HTTP 접근 설정은 위험하다. 아무나 내 컴퓨터의 도커 엔진에 인증없이 접근하여 비트코인 채굴 등의 서비스를 컨테이너로 띄워버릴 수도 있다! 그냥 실습만해보고 설정을 원래대로 돌려놔야한다. 원격으로 내 컴퓨터의 도커 엔진에 접속하는 연습을 위해 HTTP 접근을 허용해본다. 도커 데스크탑의 설정 > General 부분에서 Expose daemon on tcp://localhost:2375 without TLS라는 체크박스에..