본문 바로가기

Docker

[Docker] 도커 컨테이너 다루기 : 네트워크

도커 네트워크 구조

 

※ veth: virtual eth

※ docker0 : 도커 엔진에 의해 기본 생성되는 브릿지 네트워크=> veth와 eth 간 다리 역할

 

 

도커 컨테이너를 실행할 때 사용할 네트워크를 지정할 수 있음.

특정 네트워크를 지정하지 않으면 기본적으로 생성되는 브릿지 네트워크인 docker0를 사용하게 됨 

 

컨테이너를 실행 후 컨테이너 내부에서 네트워크 장치를 확인하게 되면 eth와 lo(local network:127.0.0.1)가 설치되어 있음.

eth 장비가 host 서버와 연결이 되기 위해서 docker0이라는 브릿지 네트워크가 veth와 eth 간 다리 역할을 해주게 됨 

컨테이너가 생성됨가 동시에 host에는 eth에 대응되는 veth가 생성되게 됨 

 

 

 

 

컨테이너 포트 노출

 

컨테이너의 포트를 호스트의 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

 

 

 

 

Expose vs Publish

 

expose 옵션은 문서화 용도

# docker run -d --expose 80 nginx

nginx-expose로 실행한 컨테이너의 PORT 항목을 보면 80/tcp로 표시되고 있고, 맵핑 표시인 화살표가 없음

 

curl 명령어로 80번 포트 통신 시 통신 되지 않음. 

실제 포트를 바인딩하는것이 아닌 문서화 용도로 사용할때 expose 옵션 사용

 

 

publish 옵션은 실제 포트를 바인딩

# docker run -d  -p 80 nginx

 

 

 

 

도커 네트워크 드라이버

 

 

네트워크 드라이버

Native Driver : Bridge, Host, None, Overlay

Remote Drivers : 3rd-Party Plugins

 

 

 

# docker network ls   // 기본적으로 만들어져 있는 네트워크 목록 확인 

 

 

 

 

 

 

네트워크 동작방식으로 구분한 도커 네트워크 드라이버

 

 

 

Single Host Neworking : 단일 호스트에서 동작하는 드라이버들 ( bridge, host, none)

Multi Host Networking : 다중 호스트에서 동작하는 드라이버 (overlay -> 여러 서버들이 존재할때, 각각의 서버에 있는 컨테이너들을 연결시키는 가상의 네트워크, 오케스트레이션 시스템에서 많이 사용하는 드라이버) 

 

 

 

 

1. none

none 네트워크 드라이버의 경우 해당 컨테이너가 네트워크 기능이 필요없을때, 커스텀 네트워킹을 사용해 되는 경우 사용.

외부와 통신이 되지 않음

# docker run -i -t --network none ubuntu:focal 

 

 

2. host

도커가 제공해주는 가상 네트워크를 사용하는게 아닌, 직접 호스트 네트워크에 붙어 사용

포트바인딩을 하지 않더라도 호스트 네트워크를 사용하기 때문에 바로 접속이 가능

# docker run -d --network=host grafana/grafana

 

 

3. bridge

브릿지 네트워크의 경우 기본 docker0 네트워크를 사용하는것이 아닌, 사용자 정의 네트워크를 사용

--net-alias 옵션의 경우 브릿지 네트워크에서만 사용 가능한 옵션. 브릿지 네트워크 안에서 "hello"라는 도메인 이름으로 컨테이너 아이피를 검색할 수 있도록 내부도메인에 저장해줌

 

# docker network create --driver=bridge fastcampus                                       // fastcampus 네트워크 생성 

# docker run -d --network=fastcampus --net-alias=hello nginx                        // fastcampus 네트워크로 nginx 컨테이너 실행 

# docker run -d --network=fastcampus --net-alias=grafana grafana/grafana  // fastcampus 네트워크로 grafana 컨테이너 실행