티스토리 뷰

도커의 네트워크 구조를 알아보고, 실행시키는 컨테이너의 포트를 노출시키는 방법을 알아보고, Expose 와 Publish 에 대해 알아본다.

 

 

도커 네트워크 구조

 

 

도커를 호스트 운영체제에 설치하면 기본적으로 여러 네트워크 드라이버가 설치된다. 기본적으로 도커 컨테이너를 실행할 때 사용할 네트워크를 지정할 수 있다.

 

eth0 : 호스트에서 사용하고 있는 기본 네트워크인데, EC2를 사용하고 있다면 EC2 의 private IP 가 설정되어 있는 네트워크 장치이다. 컨테이너를 실행한 후 네트워크 장치 목록을 확인해 보면 eth0과 l0 의 두 가지 네트워크가 설치되어 있는 것을 확인할 수 있다.

 

docker0 : 네트워크를 따로 지정하지 않으면 기본적으로 생성되는 docker0 이라고 하는 브릿지 네트워크를 사용하게 된다. 이 네트워크는 컨테이너의 eth 와 veth 네트워크의 다리 역할을 해 주게 된다. 컨테이너가 생성됨과 동시에 호스트에는 컨테이너의 eth0에 대응되는 veth 장치가 생성된다. 컨테이너가 호스트에 100개가 띄워진다고 하면 총 100개의 eth, veth 장치를 확인할 수 있다.

 

컨테이너의 포트 노출

도커 컨테이너의 포트를 노출하려면 도커 명령어에 -p 옵션을 통해 설정할 수 있다.

docker run -p [HOST IP PORT]:[CONTAINER IP PORT] [container]

 

-p 옵션은 호스트 IP 포트를 컨테이너의 IP 포트와 매핑시키는 역할을 하는데, 이 옵션을 사용하는 방법은 세 가지가 있다.

# nginx 컨테이너의 80번 포트를 호스트 모든 IP의 80번 포트와 연결하여 실행
docker run -d -p 80:80 nginx

# nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트 (랜덤) 와 연결하여 실행
docker run -d -p 80 nginx

# nginx 컨테이너의 80번 포트를 호스트 127.0.0.1 IP의 80번 포트와 연결하여 실행
docker run -d -p 127.0.0.1:80:80 nginx

 

다음과 같이 컨테이너의 80번 포트를 호스트의 80번 포트와 연결하도록 명령어를 실행하면,

 docker run -d -p 80:80 nginx

 

다음과 같이 PORTS 에 80번 포트가 명시되는 것을 확인할 수 있다.

 

이 상태에서 curl 을 통해 요청을 보내면 다음과 같이 nginx 가 호출되는 것을 확인할 수 있다.

 

당연히 private IP나 public IP 로 요청을 보내도 동일한 결과가 출력된다.

 

또한, 다음과 같이 컨테이너의 80번 포트만 지정한 후에 명령어를 실행하면,

docker run -d -p 80 nginx

 

다음과 같이 사용 가능한 임의의 포트로 연결되는 것을 확인할 수 있다.

 

이 역시 해당 포트로 curl 요청을 보내면 정상적인 응답이 수신되는 것을 확인할 수 있다.

 

반면, 80번 포트로 요청하면 해당 포트에서 작동되는 서비스가 없으니 당연히 Connection refused 에러가 발생한다.

 

이번에는 다음과 같이 호스트의 IP와 포트, 컨테이너의 포트를 모두 지정하여 컨테이너를 run 해 보자.

docker run -d -p 127.0.0.1:80:80 nginx

 

다음과 같이 명시한 호스트와 포트로 작동됨을 확인할 수 있다.

 

특정 포트를 지정하여 실행하였으므로 private, public ip  도 작동되지 않음을 확인할 수 있다.

 

Expose 와 Publish

expose 와 publish 는 위의 예시와 같이 컨테이너 실행과 관련된 명령어인데,

 

다음과 같이 expose를 실행하면

 docker run -d --expose 80 --name nginx-expose nginx

 

위에서 실습한 컨테이너와 달리 PORTS 옵션에 화살표가 없는 것을 확인할 수 있다.

 

기존 컨테이너를 삭제하고 방금 실행한 컨테이너만 남긴 채 curl 요청을 보내 보면, 다음과 같이 동작하지 않는 것을 확인할 수 있다.

 

expose 옵션의 경우는 실제 기능은 없고 단순히 문서화 용도로서만 사용되는 명령이다.

 

 

 

'인프라 > Docker' 카테고리의 다른 글

도커 이미지 빌드  (0) 2022.02.11
도커 컨테이너 로그  (0) 2022.02.10
도커 컨테이너 명령어 실행 (exec)  (0) 2022.02.08
도커 컨테이너 환경변수  (0) 2022.02.07
도커 컨테이너 - 엔트리포인트와 커맨드  (0) 2022.02.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함