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

안녕하세요.

 

여러분은 Docker의 -p 옵션에 대해 얼마나 잘 알고 계신가요?? 

 

 

 

 

아래와 같이 docker run -p8080:8081을 하게 된다면 어떤 일이 이루어지는지 알고 계신 만큼 속으로 답변해 보세요.

 

 

혹시  -p 옵셥이 port의 옵셥으로 알고 계시진 않나요??

 

잘 알고 계시겠지만 사실, port가 아닌 Pulish의 약자이며 --publish의 약어로-p를 사용하고 있는 것입니다.

 

 

 

Docker Publish란 Docker 이미지를 실행시킬 때 함께 사용할 수 있는 옵션으로 아래와 같이 사용할 수 있습니다.

docker run -p 8080:8081 exampleImage

 

해당 명령어를 세세하게 뜯어보면 애플리케이션에서 실행 중인 8081 포트와 호스트의 8080 포트를 연결해 주겠다는 의미입니다.

 

즉, 앞에 있는 포트는 호스트의 포트이며 뒤배치되는 포트는 컨테이너로 실행되고 있는 애플리케이션의 동작 포트입니다. 

 

즉, 8081로 돌아가고 있는 서비스를 호스트의 8080으로 publish 하겠다는 의미를 가집니다.

 

publish를 하게 되면 호스트의 IPTABLES를 직접 건드려 해당 포트가 오픈되게 됩니다.

 

 

 

그럼 뒤에 있는 8081 포트는 어떤 식으로 지정이 되는 걸까요??

 

바로 Dockerfile을 실행할 때 EXPOSE를 통해 지정해 주는 것입니다.

 

즉, 해당 컨테이너가 사용하는 포트를 지정해 주는 것이죠.

 

하지만, 단순히 포트를 제공하는 것이지, 실제로 포트를 오픈하거나 외부 네트워크 노출 시키지 않습니다.

 

그렇기 때문에 외부 네트워크에서는 해당 컨테이너에 접근이 불가능하지만 동일 네트워크에서는 EXPOSE 포트로 접근이 가능합니다.

 

즉, EXPOSE만 사용하게 되면 외부에서는 접근이 불가능하며 해당 포트와 -p을 통해 연결을 해주어야 외부에서 연결이 가능한 것입니다.

 

동일 네트워크 개념은 아래에서 자세하게 다루도록 하겠습니다.

 

이해가 되지 않으실 수도 있습니다. 하지만 아래 자세하게 그림과 같이 정리되어 있으니 힘들더라도 따라와 주시면 이해하실 수 있을 것입니다.

 

 

 

위에서 동일 네트워크에서는 EXPOSE포트 간 연결이 가능하다고 말씀드렸습니다.

 

Docker 환경에서의 네트워크는 크게 5가지로 나누어지게 됩니다. 

 

각각의 쓰임이 다르고 필요에 따라 학습 후 적용하시면 될 것 같습니다. 해당 포스팅에서는 기본 설정인 Bridge에 대해 말씀드리도록 하겠습니다.

 

 

Bridge모드의 경우 가장 기본적인 설정이며 컨테이너를 실행 시 자동으로  Bridge 네트워크를 형성하게 됩니다.

 

생성된 네트워크에 다양한 컨테이너를 추가하거나 제외할 수 있습니다. 

 

 

 

그럼 아래와 같은 상황을 예시로 들어보겠습니다. 

 

먼저, bridge Network로 형성된 A 네트워크에 Nginx와 Spring, MySQL이 있다고 가정해 보겠습니다.

 

스펙은 아래와 같습니다.

 

nginx 

-p 443:443 

expose : 443

 

Spring 

expose : 8080

 

MySQL

expose : 3306

 

위와 같은 상황일 때 외부에서는 publish를 통해 443 포트를 이용하여 Nginx를 활용할 수 있습니다.

 

이때 Nginx는 ReverseProxy를 이용하여 Spring 8080 포트에 접근할 수 있습니다. 

 

이것이 동일 네트워크에서 연결이 가능하다는 예시입니다. 

 

다만, 외부에서 도메인:3306을 하게 된다면 연결이 불가능한 것이죠. 그 이유는 publish가 되지 않았기 때문입니다.

 

또한, A 네트워크에서 B네트워크의 expose 3306으로 생성되어 있는 컨테이너 접근 또한, 불가능합니다.

 

 

어떠신가요.

 

expose와 port 그리고 publish까지 개념이 좀 잡히시나요?? 

 

추가적으로 궁금하신 사항 있으시다면 언제든지 댓글 달아주시면 답변드리도록 하겠습니다.

 

감사합니다.