Docker Network 구조

2022. 1. 18. 00:56DevOps/Docker & kubernetes

 

도커는 기본적으로 컨테이너를 실행할 때 사용할 네트워크를 지정할 수 있다. 디폴트값은 docker:0이라는 브릿지 네트워크를 사용한다. 위 표를 한 번 해석해 보도록 하자. 먼저 eth0은 호스트에서 사용하고 있는 기본 네트워크이다. docker0은 기본값으로 만들어진 브릿지 네트워크이며 이 값을 통해 컨테이너 내부에서 로컬네트워크가 설치된 것을 확인할 수 있다. 이 사이에 가상(v)eht가 하나씩 생성되는데 컨테이너 1대당 1개씩 생성된다. 이제 이 네트워크 구조를 명령어를 통해서 직접 눈으로 확인해 보도록 하자.

 

 docker run -p [HOST IP:PORT]:[CONTAINER PORT] [container]
-p옵션은 hostip의 포트를 컨테이너 포트와 매핑시키는 역할을 한다.

 docker run -d -p 80:80 nginx
 ==> 호스트포트와 컨테이너 포트를 연결시키는 방법이다.
     nginx컨테이너의 80번 포트를 '모든 ip'의 80번 포트랑 연결한 후 실행한다. 

 docker run -d -p 127.0.0.1:80:80 nginx
 ==> 컨테이너 ip까지 추가 지정을 하기 때문에 이 ip에 대해서만 매핑한다.
     nginx컨테이너의 80번 포트를 127.0.0.1 ip의 80번 포트랑 연결하여 실행해라.

 docker run -d -p 80 nginx
 ==> 컨테이너 포트를 지정하는 역할을 한다.
     nginx컨테이너의 80번 포트를 호스트의 '사용 가능한' 포트와 연결한 후 실행해라.

docker run -d -p 80:80 nginx를 실행해 보면 아래와 같이 잘 실행 되는것을 확인할 수 있다.

아래의 경우 docker run -d -p 80 nginx로 실행했을때의 결과값이다. 조금 특이한점은 0.0.0.0:49153번 포트에서 80번 포트로 이동하는것 이다. 49153번 포트를 curl로 요청을 했을때도 정상적으로 작동하지만 80번 포트는 작동하지 않는 것을 확인할 수 있다.

이번에는 host ip로 지정해 보도록하자. 루프벡 어드레스에 대해서 80번 포트를 80번으로 매핑하겠다는 의미이다.

이제 expose와 publish에 대해 알아보도록 하자.

docker run -d --expose 80 nginx
==> expose 옵션은 별다른 특징이 없는 단순 문서화 용도이다.

docker run -d -p 80 nginx
==> publish 옵션은 실제 포트를 바인딩한다.

아래에서 볼 수 있듯이 expose을 사용했을 때는 80번 포트만 있으며 "->"라는 매핑 표시가 없는것을 확인할 수 있다.

 

이제 도커 네트워크 드라이버를 나누는 방법은 network model로 나누는 방법과 host의 수 로 나눌 수 있다.

network model
host

none네트워크에 대해 먼저 알아보도록 하자. none네트워크를 사용하는 상황은 네트워크(인터넷)이 필요없거나 커스텀 네트워킹을 사용해야할 일이 있을때 none으로 설정한 후 사용한다.

none.sh파일을 만들고 그 안에 다음과 같은 명령어를 입력하여 실행하도록 하자. 터미널을 하나 더 실행해서 잘 구동되고 있는지 눈으로 확인한 후 inspect 명령어를 통해 컨테이너 정보를 확인해 보자. 외부 네트워크를 사용하지 않기 때문에 IPAddress등 네트워크가 없는것을 확인할 수 있다.

docker run -i -t --net none ubuntu:focal
docker inspect "만들어진docker의 아이디"

host네트워크는 도커가 제공해 주는 가상 네트워크를 사용하는것이 아닌 직접 호스트를 사용하는 것 이다.

host.sh 파일을 만들고 그 안에 다음과 같은 명령어를 입력하여 실행하도록 하자. 터미널을 하나 더 실행해서 잘 구동되고 있는지 눈으로 확인한 후 inspect 명령어를 통해 컨테이너 정보를 확인해 보자.기본적으로 host를 사용하기 때문에  IPAddress와 같은 것들은 없는것을 확인할 수 있다.

docker run -d --network=host grafana/grafana
==> 그라파나는 기본적으로 3000번대를 사용한다.

브릿지 네트워크는 기본 docker0을 사용하는것이 아니라 새로운 사용자를 정의하고 생성하는 것 이다.

docker network create --driver=bridge testserver
docker run -d --network=testserver --net-alias=hello nginx
docker run -d --network=testserver --net-alias=grafana grafana/grafana
==> create --driver라는 명령어를 통해 testname이라는 브릿지 네트워크를 만들 것 이다.
    이 후 nginx와 grafana를 network옵션을 통해서 testserver를 사용하게 할 것이며
    브릿지네트워크에서만 사용할 수 있는 --net-alias를 통해서 hello라는 도메인 이름으로
    컨테이너 ip를 저장해 준다.

docker network ls로 확인해본 결과 testserver라는 이름ㅇ르 가진 bridge가 잘 생성된 것을 확인할 수 있으며 docker ps를 통해서도 grafana와 nginx가 잘 생성된 것을 확인할 수 있다.(error response from daemon~에러는 이미 testserver를 만들어 둬서 그런거니 무시해도 괜찮다. 처음부터 따라왔다면 별 문제가 없이 잘 될것이다.)

이제 bash로 접근을 해 hello 가 잘 생성됐는지 확인해 보자. bash는 curl이라는 명령어 대신 wget을 사용해야 한다. wget hello를  입력하니 index.html이 잘 다운받아 지는것을 확인할 수 있다.

이제는 nginx로 접근을 해 보도록 하자. docker exec -it 4993 bash를 통해 접근 후 그라파나가 잘 접근되는지 확인해 보았다.

마지막으로 host에서 ifconfig를 통해 컨테이너 갯수와 docker0, 그리고 ens(vmwere를 사용하면 보통 32,33일 것이다.), 브릿지 네트워크 등을 확인해 보도록 하자. 혹시 ifconfig가 실행되지 않는다면 아래의 명령어를 수행한 후 실행해 보도록 하자.

sudo apt install net-tools