컨테이너는 가상 머신과 마찬가지로 가상 IP 주소를 할당받는다.
eth0
- Ethernet
- 네트워크 디바이스명
- 랜카드의 지정 번지
lo
- 로컬 호스트!
컨테이너 생성 후 ifconfig
명령어를 통해
도커의 NAT IP인 172.17.0.2
를 할당받은 eth0
인터페이스와 로컬 호스트인 lo
인터페이스를 확인할 수 있다.
NAT; Network Address Translation; 네트워크 주소 변환
아무런 설정을 하지 않았다면 이 컨테이너는 외부에서 접근할 수 없으며, 도커가 설치된 호스트에서만 접근할 수 있다. (Docker Desktop for Max에서는 호스트에서 컨테이너 IP로의 접근이 불가능하다.)
외부에 컨테이너의 애플리케이션을 노출하기 위해서는 eth0의 IP와 포트
를 호스트의 IP와 포트
에 바인딩해야 한다.
// -p [호스트의 포트]:[컨테이너의 포트]
docker run -i -t --name mywebserver -p 80:80 ubuntu:14.04
-p 옵션은 컨테이너의 포트를 호스트의 포트와 바인딩해 연결할 수 있게 설정한다.
호스트의 특정 IP를 사용하려면 [호스트 IP]:7777:80
과 같이 바인딩할 IP와 포트를 명시한다.
여러 개의 포트를 외부에 개방하려면 -p 옵션을 여러 번 써서 설정한다.
위와 같이 -p 옵션을 이용하면, 컨테이너를 생성하는 시점에서 호스트의 어느 포트와 연결됐는지 알 수 없다.
👇🏻 궁금하면
// 방법 1 : 명령어를 입력해 PORTS 항목을 확인한다.
docker ps
// 방법 2 : 컨테이너가 사용중인 호스트의 포트가 출력된다.
docker port 컨테이너명
- 위에서 생성한 컨테이너에서 apache 웹 서버를 설치/실행 후
[내 IP 주소]:80
으로 접속하면 아파치 웹 서버에 접속할 수 있다.- 여기서, 실제로 아파치 서버가 설치된 것은 컨테이너 내부이므로 호스트에는 어떠한 영향도 주지 않는다.
- 호스트 IP의 80번 포트로 접근 -> 80번 포트는 컨테이너의 80번 포트로 포워딩 -> 웹 서버 접근