2 minute read

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

1. 도커 네트워크 구조

도커 네트워크 구조 01

  • 브릿지 네트워크 : 여러가지 컨테이너를 하나로 묶는 중간 단계의 네트워크

2. 컨테이너 포트 노출

  • 컨테이너의 포트를 호스트의 IP:PORT와 연결하여 서비스를 호출한다.
  • -p 옵션 (publish 옵션)
$ 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 run -d -p 80:80 nginx
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                NAMES
de06c9cd26ca   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:80->80/tcp   romantic_aryabhata

$ docker run -d -p 80 nginx
$ docker ps 
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                   NAMES
b316b41341d5   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:52573->80/tcp   infallible_lewin

$ docker run -d -p 127.0.0.1:80:80 nginx
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f40517e36744   nginx     "/docker-entrypoint.…"   14 seconds ago   Up 13 seconds   127.0.0.1:80->80/tcp   determined_lichterman
## ip 고정 port 고정 : 127.0.0.1:80 로 접속해야 enginx 학인 가능

3. Expose vs Publish

# expose 옵션은 그저 문서화 용도
$ docker run -d --expose 80 nginx
# publish 옵션은 실제 포트를 바인딩
$ docker run -d -p 80 nginx

4. 도커 네트워크 드라이버

도커 네트워크 구조 02 도커 네트워크 구조 03


$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
eb9cad99c41e   bridge     bridge    local
16720e62dd97   host       host      local
5a3a627372ac   minikube   bridge    local
2e6f9675eaa6   none       null      local

4-1. none network

  • none.sh
#!/usr/bin/env sh
docker run -i -t --net none ubuntu:focal
  • 해당 컨테이너의 네트워킹 기능이 필요 없는 경우
  • 해당 컨테이너에 접근하여 네트워크의 기능을 수행하는 경우 네트워킹이 되지 않아 기능이 되지 않는다.
  • 즉, 내부망 또는 외부의 접근이 필요없는 업무에 대한 기능을 수행

4-2. host network

  • host.sh
#!/usr/bin/env sh
docker run -d --network=host grafana/grafana
  • 호스트 네트워크를 사용 : 즉 서버에 의존적이도 독립적이지 않은 네트워크를 유지
  • 호스트모드는, 컨테이너가 독립적인 네트워크 영역을 갖지 않고, 호스트와 네트워크를 함께 사용하게 된다. 컨테이너의 ip와 interface정보를 확인해 보면 아래처럼 host의 네트워크 정보와 동일한다. 호스트모드로 생성된 컨테이너의 경우, 브릿지 모드를 사용하지 않으므로, docker0에 바인딩 되지 않는다
CONTAINER ID   IMAGE             COMMAND     CREATED              STATUS              PORTS     NAMES
871f0abe4fa8   grafana/grafana   "/run.sh"   About a minute ago   Up About a minute             wonderful_kalam
  • 따로 컨테이너의 네트워크 포트와 IP가 표시 되지 않음
  • grafana 가 실행되는 경우 기본적으로 port가 3000번 대 포트가 사용됨
  • grafana : Grafana는 멀티플랫폼 오픈 소스 애널리틱스 및 인터랙티브 시각화 웹 애플리케이션이다. 지원되는 데이터 소스에 연결될 때 웹의 차트, 그래프, 경보를 제공한다.

4-3. bridge network (default) -> docker0 : 기본 브릿지 네트워크

  • bridge.sh
#!/usr/bin/env sh

## 사용자 정의 브릿지 네트워크 : fastcampus
docker network create --driver=bridge fastcampus

## 컨테이너 모드 fastcampus라는 브릿지 네트워크 사용
docker run -d --network=fastcampus --net-alias=hello nginx
docker run -d --network=fastcampus --net-alias=grafana grafana/grafana
  • 결과
$ docker network ls

NETWORK ID     NAME         DRIVER    SCOPE
eb9cad99c41e   bridge       bridge    local
c7b8be8a0c67   fastcampus   bridge    local
16720e62dd97   host         host      local
5a3a627372ac   minikube     bridge    local
2e6f9675eaa6   none         null      local

$ docker ps 

CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS      NAMES
2b7acbbcddf8   grafana/grafana   "/run.sh"                6 minutes ago   Up 6 minutes   3000/tcp   hopeful_austin
db82df66aa04   nginx             "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   80/tcp     hopeful_spence
  • docker0 : 기본 브릿지 만약 네트워크 이름을 직접 생성해 주지 않는 다면 docker0 가 기본값으로 생성된다.

Categories:

Updated:

Comments