Dangil project(11)

Junyoung·2024년 5월 23일

Dangil Project

목록 보기
11/20

프론트에서 서버 API를 사용하던 도중 502 에러가 나왔다는 이야기를 들었다.

확인해보니 이런 경우는 2가지가 존재했다.

  1. spring 이미지 제작후 컨테이너를 최신 버전으로 띄울때 기존 컨테이너가 내려갔고 새로운 버전의 API를 로드할때 서버의 API는 사용할 수 없게 된다.

  2. 실행시키는 jar 파일에서 error 가 발생해서 컨테이너가 stop 되어 spring 서버는 아예 올라가지 않는 상황이 존재했다.

1번 케이스는 무중단 배포 전략을 도입해서 해결하고, 2번 케이스는 health check를 통해 해결하고자 한다.

무중단 배포의 여러가지 전략을 살펴봤다 blue/green, Rolling이 후보에 존재했지만 하나의 EC2만 사용하는 상황이라 blue/green 전략이 더 효율적일 것이라고 생각했다.

나처럼 하나의 EC2 에서 docker-compose를 활용해 blue/green 전략을 사용하는 사람들의 블로그를 찾아봤지만 모두 해당 컨테이너의 외부 포트를 열어서 사용했다

하지만 외부 포트를 여는것은 Nginx 없이 아무나 접근이 가능하기에 위험하다고 판단.
내부 포트로 해결하는 방법에 대해서 고민했다.

다음은 고민 내용이다.

블루그린 전략을 도입하려면 두가지를 기억해야 한다 !

  1. 기존 컨테이너와 다른 포트로 컨테이너를 띄운다 !
  2. 리버스 프록시에서 proxy pass 를 바꿔준다

ex) 스프링 서버로 예를 들어보자

기존 블루 컨테이너에서

8080 포트로 컨테이너를 열어뒀다고 하자

그러면 8081로 그린 컨테이너를 열고 헬스체크 이후

해당 컨테이너로 전환을 시켜준다 !

전환 시키는것은 바로 엔진엑스가 진행해준다 !

근데 여기서 의문이 생긴다

결국 이렇게 구현 하려면 8080:8080 | 8081:8080 처럼 외부 포트를 열어줘야 한다

ports 와 expose는 아예 다른 개념이다 외부 포트를 여는 경우

  1. 외부에서 접근이 가능하다 ! | 보안적으로 위험한 경우이다 !’

반드시 엔진엑스를 통해 들어오도록 구현하는게 맞다 !

그렇다면 어떻게 할수 있을까 생각을 해봤다 !

결국 각 컨테이너는 공유기에서 여러가지의 IP를 부여해주듯

각자의 컨테이너 IP를 가지고 있다 !

포트는 고정해두고 IP만 바꿔준다면 !

expose 설정으로 그대로 둘수 있겠다 !

또한 도커의 컨테이너 개방시에 expose -3306 은

ufw allow 3306 과 비슷한 개념이고

각 컨테이너의 들어있는 프로그램의 포트 번호와 반드시 맞춰야 한다 ! !! ! ! ! !

또한 도커 run 에서 사용하는 -p 사용 또한 포트를 외부에 개방한다는 뜻이란걸 잊지 말자 이게 ports 와 같은 기능을 하기에 외부에 여는것은 위험하다 !

맨 아래 북마크 처럼 호스트의 즉 EC2 자체의 포트를 여는것인 개념이 된다 ! Ports로 열였을때 and run -p 로 열었을때 !

Dockerfile의 EXPOSE
Dockerfile에서 EXPOSE 지시어는 해당 이미지가 실행될 컨테이너가 리스닝할 포트를 나타냅니다. 이것은 주로 문서화 목적으로 사용되며, 컨테이너를 실행할 때 실제 포트를 열거나 매핑하지는 않습니다. 예를 들어, EXPOSE 80 지시어는 이미지를 사용하는 사람들에게 이 컨테이너가 포트 80에서 통신할 것임을 알리는 용도로 사용됩니다. 실제 포트 매핑은 컨테이너 실행 시에 -p 옵션을 통해 명시적으로 설정해야 합니다.

docker-compose.yml의 expose
docker-compose.yml 파일에서 expose 옵션은 Dockerfile의 EXPOSE와 비슷하게 해당 서비스의 컨테이너가 내부적으로 사용할 포트를 나타냅니다. 하지만 이 설정은 도커 컴포즈가 관리하는 네트워크 내에서만 해당 포트를 노출시키며, 외부로는 노출되지 않습니다. 예를 들어, 여러 컨테이너가 동일한 내부 네트워크에 연결되어 있을 때, 서로 간에 통신할 수 있도록 포트를 노출시키는 용도로 사용됩니다. 외부 포트 매핑을 위해서는 ports 옵션을 사용하여 명시적으로 설정해야 합니다.

결론적으로, EXPOSE와 expose는 각각 이미지와 컨테이너 설정에서 해당 서비스가 사용할 포트를 지정하는 역할을 하지만, 실제 네트워크에서의 접근성은 별도의 설정이 필요합니다. Dockerfile의 EXPOSE는 정보 제공의 목적이 크고, docker-compose.yml의 expose는 내부 서비스 간의 연결을 위한 용도로 더 많이 사용됩니다.

즉 내부 내트워크로 구축하려면 compose 에서 설정해주는것이 맞다 !

그렇다면 어떻게 가능할까 ?

엔진엑스 리로드 방법이 존재한다 !

24시간 365일 중단 없는 서비스 만들기
Java의 스프링 서버 포트를 변경해 내부 포트를 스왑해주는 방법도 존재했지만

IP를 이용한 방법으로 도전했다.

ports: 호스트포트

ports와 expose 차이

[Docker] run -p,run -P, run --expose 차이

CS로 알아보는 프로젝트 - Docker Port와 Expose

profile
라곰

0개의 댓글