Devops/Fastcampus 캐시백 챌린지

패스트캠퍼스 캐시백 챌린지 49일차

DEV_BLOG 2022. 6. 5. 22:13

수강 인증샷

 

도커 컨테이너의 구조와 포트 노출, 네트워크와 관련된 클립을 수강하는식으로 챌린지를 진행하였다. 흔하게 접하던 내용은 아니라 집중해서 들었고 bridge,host,none network에 대해서 알 수 있었다. 유독 이번포스팅은 miro를 활용할 일이 많았다..ㅎㅎ;; 지난 7주동안 성공적으로 챌린지는 진행된 것 같고 이제 얼마 안남았으니 조금 더 기운을 내보려고한다..^^;; 다음 포스팅으로는 Docker Container 볼륨과 관련된 내용을 포스팅할 예정이다.

 

도커 컨테이너 구조

  • 도커컨테이너를 사용할때 사용할 네트워크를 지정할 수 있는데, 지정하지 않으면 기본적으로 생성되는 docker0라는 브릿지 네트워크를 사용한다.
  • veth: virtual eth
  • docker0: 도커 엔진에의해 생성되는 기본 브릿지 네트워크로 veth와 eth간 다리 역할
  • eth0: 호스트에서 사용하고 있는 네트워크(ec2의 경우 prviate이 설정되어있는 네트워크 장치)

 

컨테이너 포트 노출

컨테이너 포트를 호스트의 IP:PORT와 연결하여 서비스를 노출한다.

$ docker run -p [HOST IP:PORT]:[CONTAINER PORT] [container]

# nginx 컨테이너의 80번 포트를 호스트 모든 IP의 80번 포트와 연결하여 실행
$ docker run -d -p 80:80 nginx

# nginx 컨테이너의 80번 포트를 호스트 127.0.0.1 IP의 80번 포트와 연결하여 실행
$ docker run -d -p 127.0.0.1:80:80 nginx

# nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트와 연결하여 실행
$ docker run -d -p 80 nginx

docker ps를 통해 모든 IP의 80번포트에 대해서 컨테이너의 80번으로 매핑되었음을 확인할 수 있다.

그리고 curl 명령어로 nginx가 잘 호출된다는 것을 확인할 수 있다.

 

$ ec2metadata

ec2metadata명령어를 통해 public ip를 확인하고 curl 명령어를 똑같이 사용하여도 동작하고, private ip도 마찬가지로 동일하게 동작할 것이다.(단,EC2의 보안그룹 설정이 되어있다는 가정하에)

 

 

Expose VS Publish

# expose 옵션은 그저 문서화 용도
$ docker run -d --expose 80 nginx

# publish 옵션은 실제 포트를 바인딩
$ docker run -d -p 80 nginx

expose는 그저 문서화하는 역할밖에 되지 않는다.

따라서 → 로 포트가 매핑되었다는 표시도 나타나지 않고, 기존에 있던 컨테이너를 지우고 curl 명령어를 시도하여도 동작하지 않는 것을 확인할 수 있다.

 

 

도커 네트워크 드라이버

$ docker network ls
  • 기존에 만들어진 네트워크 목록을 확인할 수 있다.

 

docs.docker.com/network 에서 “”Network drivers” 라는 subsection이 있는데, 도커에서 지원하는 네트워크 드라이버들의 목록을 확인할 수 있다.

 

  • Native drivers

⇒ Bridge

⇒ Host

⇒ None

⇒ Overlay

  • Remote Drivers

⇒ 3rd-Party Plugins

 

 

네트워크 동작방식으로 드라이버를 분류할때, Single Host에서 동작하는 networking이 있고, Multi Host에서 동작하는 networking이 있다.

 

Build-In 되어있는 Native driver중에 bridge,host,none은 단일 호스트에서 동작하는 드라이버이다.

bridge 네트워크도 기본적으로 생성되는 docker0라는 브릿지네트워크가 있고 직접 네트워크 드라이버를 선택해서 새로운 브릿지 네트워크를 생성해서 사용할 수도있다.

멀티호스트 네트워크로는 overlay라는 것이 있고, 여러 서버가 존재할때 각각의 서버에 있는 컨테이너에 연결시키는 가상 네트워크라고 볼 수 있다.(multihost로 동작하기때문에 orchestration system에서 많이 사용한다.)

 

 

 

https://github.com/tedilabs/fastcampus-devops/tree/main/3-docker-kubernetes/1-docker-network

위의 링크에 여러 명령어들의 sample을 담아두셨다고 한다.

 

none 네트워크 드라이버의 경우 해당 컨테이너가 네트워크 기능이 필요없을때, 혹은 custom networking를 사용해야하는 needs가 있을때 기본 드라이버를 none으로 설정하고 사용할 수 있다.

docker inspect를 해보면 브릿지 네트워크가 설정되어있는 것도 아니고, IP address가 빈값이다. driveroption또한 null로 되어있다. 따라서 apt update도 네트워크 오류로 실패하는 것을 확인할 수 있다.

 

 

 

 

host 네트워크는 docker가 제공해주는 네트워크를 사용하는 것이 아니라 직접 host network에 붙어서 사용하는 경우이다. 포트 바인딩을 하지 않아도 host 네트워크를 사용하기에 접속할 수 있다.grafana의 경우 3000포트를 기본적으로 사용한다고 한다.

따라서 PORTS항목이 비어있지만 curl을 사용해보면 3000포트로 연결되어있음을 확인할 수 있다.

host 네트워크를 사용하기에 hostname도 똑같이 따라쓰고, ipaddress또한 따로 지정되어있지 않는다는 것을 확인할 수 있다.

 

 

 

bridge 네트워크: user defined 브릿지 네트워크를 사용하는 예시이다.

docker network create 명령어를 통해 사용자 정의 브릿지 네트워크를 만든다.

이때 브릿지 네트워크에서만 —net-alias 라는 옵션을 줄 수 있는데,

container ip를 search할 수 있도록 내부 도메인 이름으로 저장해준다.

grafana에는 curl 명령어가 따로 없기에 wget 이라는 것이 존재한다. hello 라고 달아준 태그를 검색하여 nginx의 index.html파일이 다운로드 된것을 볼 수 있다.

내부 도메인이 생성된것도 확인할 수 있고, grafana와 nginx가 동일한 브릿지 네트워크로 생성된 것을 확인할 수 있다.

nginx의 경우에도 접속해서 curl명령어을 사용해보면 grafana에 내부도메인으로 연결되어 있음을 확인할 수 있다.

 

$ ifconfig

host 운영체제에서 ifconfig 명령어를 통해 컨테이너 갯수만큼의 veth(가상의 eth 드라이버), ens5(host의 eth) , docker0 , 각종 bridge network 들을 확인할 수 있다.

 

 

 

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

* 본 포스팅은 패스트캠퍼스 환급 챌린지를 위해 작성되었습니다.