2022. 1. 18. 00:56ㆍDevOps/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의 수 로 나눌 수 있다.
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
'DevOps > Docker & kubernetes' 카테고리의 다른 글
Docker log 확인 및 다뤄보기 (0) | 2022.01.26 |
---|---|
Docker Volume 다루기 (0) | 2022.01.24 |
Docker 기본 개념 part.2 (Entrypoint, 환경변수, 실행 명령어) (0) | 2022.01.17 |
Docker 기본 개념 part.1 (container의 life cycle) (0) | 2022.01.16 |
Docker images와 Container (0) | 2022.01.16 |