virtual ethernet
도커 엔진에 의해 기본 생성되는 브릿지 네트워크
veth와 eth간 다리 역할
컨테이너도 각각 eth가 생성이 되는데 도커의 브릿지 네트워크와 연결하기 위해 각각 가상의 veth를 생성하게 된다.
컨테이너의 포트를 호스트의 IP:PORT와 연결하여 서비스를 노출
docker run -p [HOST IP:PORT]:[CONTAINER PORT] [container]
기본 형태
docker run -d -p 80:80 nginx
nginx 컨테이너의 80번 포트를 호스트 모든 IP의 80번 포트와 연결
docker run -d -p 127.0.0.1:80:80 nginx
nginx 컨테이너의 80번 포트를 호스트 127.0.0.1 IP의 80번 포트와 연결
docker run -d -p 80 nginx
nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트와 연결
-d 👉 백그라운드로 실행
docker run -d -p 80:80 nginx
위 명령어로 80포트를 연결하는 nginx 컨테이너를 실행시켜 보자
curl localhost:80
curl 명령어로 localhost 80번 포트에 request를 보내면
멋있는 html이 reponse로 오면 성공!
docker run -d -p 80 nginx
이번에는 컨테이너의 포트만 지정해준 뒤 실행
호스트의 63181번 포트와 연결하고 있다
curl명령어를 통해 재빠르게 확인해보자
역시나 아름다운 html이 보인다
당연히 첫번째 실습과 같은 80번 포트로 보내면 아무 응답이 오지 않는다.
docker run -d --expose 80 nginx
expose 명령어는 단순히 문서화
용도
포트 연결이 되지 않는다.
docker run -d -p 80 nginx
실제로 포트 연결
native driver와 remote driver 2가지로 나눠진다
overlay
서버가 여러개 있을 때 각각의 서버에 있는 컨테이너들을 연결시켜 주는 가상의 네트워크 (docker swarm을 사용할 때 사용)
docker run -i -t --net none ubuntu:focal
none 네트워크로 ubuntu를 실행시킨 뒤
새로운 터미널을 띄워서 docker inspect로 config를 확인해보자
network의 모든 부분이 null 혹은 빈칸 혹은 0인 것을 확인 할 수 있다.
네트워크가 필요하지 않은 컨테이너 혹은 커스텀 네트워크를 사용할 경우
docker run -d --network=host grafana/grafana
위 명령어를 실행 시킨뒤 docker ps로 컨테이너 정보를 확인해보면 포트정보가 보이지 않는 것을 볼 수 있다.
하지만 그라파나의 기본 포트인 3000으로 curl 명령어를 날려보면 제대로 실행되고 있는 것을 확인 할 수 있다!
도커가 제공하는 가상 네트워크를 사용하는 것이 아닌 host의 네트워크를 사용하기 때문에 포트바인딩을 하지 않음
MacOS 에서는 작동을 하지않는데 내용은 아래 확인! (자세한 이유는 나와있지 않다)
https://docs.docker.com/desktop/mac/networking/
docker network create --driver=bridge simon
docker run -d --network=simon --net-alias=hello nginx
docker run -d --network=simon --net-alias=grafana grafana/grafana
기존의 docker0이 아닌 새로운 커스텀 브릿지 네트워크를 만드는 명령어
simon 이라는 새로운 브릿지가 생성된 것이 확인된다.
nginx와 granfa가 같은 브릿지에 연결되어있기 때문에 컨테이너끼리 통신이 가능하다.
끝