티스토리 뷰
도커의 네트워크 구조를 알아보고, 실행시키는 컨테이너의 포트를 노출시키는 방법을 알아보고, 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
- uiux
- main
- docker
- ecr
- AWS
- 도커
- Container
- 컨테이너
- 자격증명
- 안드로이드
- Terraform
- DESIGN
- HCL
- 테라폼
- 머티리얼
- dockerhub
- dockerfile
- env
- 자료형
- 스타트업
- cmd
- 디자인
- Android
- entrypoint
- Material
- 자바
- EC2
- 메터리얼
- Operator
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |