Docker

[Docker] 도커 네트워크

문승주 2024. 7. 19. 09:24
반응형

본 내용은 인프런의 데브위키님의 강의 "개발자를 위한 쉬운 도커" 내용을 바탕으로 정리한 내용입니다.

 

컨테이너 가상화

  • 서버 한대를 여러 컨테이너로 격리하는 기술

가상 네트워크

  • 서버 한대 안에서 여러 네트워크를 구성하는 기술

도커의 가상 네트워크 구성

1. 가상의 네트워크 브릿지 생성

  • 도커 실행시 가상의 네트워크 브릿지 네트워크와 가상의 공유기인 docker 0를 생성한다.

2. 컨테이너에 가상의 IP 할당

  • docker 0은 도커에서 브릿지로 가상의 ip를 할당받는데 일반적으로 172.17.0.1의 IP를 할당받는다.
  • 여기서 가상의 IP는 실존하는 IP가 아닌 PC안에서 논리적으로 정의되어 있는 가상의 IP이다.
  • 도커에서 컨테이너를 실행하면 브릿지 네트워크의 IP 주소 범위 안에서 IP 주소를 하나 할당한다.

3. 컨테이너간의 통신 전달

  • 도커의 브릿지 네트워크는 컨테이너들에게 IP를 할당하고 컨테이너들끼리 통신할 수 있게 만들어 줄 수 있다.
  • 브릿지를 통해 컨테이너 끼리 통신할 수 있다.

SDN(Software Defined Network)

  • 논리적으로 네트워크 환경을 구성하는 기술

그림 1) 가상 네트워크 구조

![[Pasted image 20240331220947.png]]

iptables이란?

  • 리눅스에서 네트워크 패킷을 필터링하고 변환하는 데 사용되는 패킷 필터링 프레임워크입니다.
  • 도커는 iptables를 사용하여 호스트 머신의 네트워크 트래픽을 관리하고, 컨테이너 간 및 호스트와 컨테이너 간의 통신을 처리한다.

그림 2) 가상 네트워크에서의 네트워크 신호

![[Pasted image 20240331224544.png]]

  • 도커는 컨테이너의 통신을 위해서 브릿지 네트워크를 정의하고 호스트 OS의 가상 인터페이스들을 생성한다.
  • 호스트 OS의 IP Tables 규칙을 관리하면서 가상 인터페이스 간의 통신 규칙을 만든다.
  • 사용자는 별도의 설정을 하지 않아도 브릿지 네트워크에서 생성된 컨테이너들끼리 통신할 수 있다.
  • 도커는 가상 네트워크안에서 여러개의 브릿지 네트워크를 관리할 수 있다.

그림 2) 도커 네트워크간 통신관련 명령어

![[Pasted image 20240331213219.png]]
 

그림 3) 도커 네트워크 통신 실습 브릿지 구성

![[Pasted image 20240331225126.png]]

예시 1) 가상 네트워크 정보 확인 및 컨테이너 간 통신 실습

네트워크및IP 확인(Shell1)

# 1. 네트워크 리스트 조회
docker network ls
# 브릿지 네트워크 상세조회 - 서브넷과 게이트웨이를 확인할 수 있다.
docker network inspect bridge
# Subnet : 네트워크 안에서 생성되는 컨테이너들이 할당받는 IP 범위
# ex) 172.17.0.0/16 > (172.17.0.0 ~ 172.17.255.255)
# Gateway : 도커 브릿지의 IP 주소

# 2. 새로운 네트워크 생성
docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 second-bridge
docker network ls
docker network inspect second-bridge
# Shell2로 이동 ====>(다음 페이지)

# 5. 컨테이너의 네트워크 확인
docker ps
# 컨테이너의 네트워크 정보 조회
docker container inspect ubuntuA
docker container inspect ubuntuB
docker container inspect ubuntuC
# Shell2로 이동 ====>(다음 페이지)

 

ubuntuA 컨테이너생성 (Shell2)

# 3. ubuntuA, ubuntuB 컨테이너생성후ubuntuB연결
docker run -d --name ubuntuA  devwikirepo/pingbuntu
docker run -it --name ubuntuB devwikirepo/pingbuntu bin/bash
# Shell3로이동====>
# 6. ubuntuA의IP로Ping 테스트
ping 172.17.0.2 
# 통신 성공

# 7. ubuntuC의IP로Ping 테스트
ping 10.0.0.2
# 통신 실패
# Shell3로이동====>

 

ubuntuA 컨테이너생성 (Shell3)

# 4. ubuntuC 컨테이너를second-bridge네트워크에생성
docker run -it --network second-bridge --name ubuntuC devwikirepo/pingbuntu bin/bash
# <==== Shell1로이동(전페이지)
# 8. ubuntuA의IP로Ping 테스트
ping 172.17.0.2
# 통신 실패

# 9. Ctrl+C로탈출후컨테이너및네트워크삭제
docker rm -f ubuntuA ubuntuB ubuntuC
docker network rm second-bridge
# ====> 실습종료

 

실습결과 : 같은 컨테이너 끼리는 통신이 가능하나 다른 컨테이너로 통신은 불가한다.


도커 네트워크의 포트포워딩 기술

  • 컨테이너 내부의 포트를 호스트 시스템의 포트와 연결하는 기술

그림 4) 포트포워딩

![[Pasted image 20240406235317.png]]

  • 내부 컨테이너에서 외부의 다른 서버로 접근하려면 서버간의 물리적인 네트워크 연결이 되어 있어야 한다.
  • 외부 서버에서 내부 컨테이너로 접근할 때는 외부에서 접근시 사용자가 지정한 컨테이너로 전달되도록 포트포워딩을 등록해야 한다.

그림 5) 포트포워딩 명령어

![[Pasted image 20240331214141.png]]
 

그림 6) 포트포워딩 실습 네트워크 지도

![[Pasted image 20240407110527.png]]
 

![[Pasted image 20240407110602.png]]
 

예시 2) 포트포워딩 실습

# 1. 포트포워딩 없이 nginx 실행
docker run -d --name nginx nginx
# 컨테이너 상세 정보 확인
docker container inspect nginx

# 2. 포트포워딩을 설정한 nginx 실행
# 8001 포트에 nginx 실행 및 localhost:8001 접속
docker run -d -p 8001:80 --name nginx2 nginx

# 포트포워딩을 설정한 envnodecolorapp  실행
#3. 8002 포트에 redapp실행 및 127.0.0.1:8002 접속 > localhost:8082와 같다
docker run -d -p 8002:3000 --name redColorApp --env COLOR=red devwikirepo/envnodecolorapp

# 4. 8003 포트에 blueapp실행 및 ipconfig로 찾은 IP주소:8003 접속
docker run -d -p 8003:3000 --name blueColorApp --env COLOR=blue devwikirepo/envnodecolorapp

# 5. 8003 포트에 yelloapp 실행 시도
docker run -d -p 8003:3000 --name yellowColorApp --env COLOR=yellow devwikirepo/envnodecolorapp
# 실행 결과 : 포트 충돌 에러 발생

# 6. 8004 포트에 greenapp 실행 및 접속(애플리케이션과 다른 포트) 
# 3030포트는 애플리케이션이 사용하지 않는 포트
docker run -d -p 8004:3030 --name greenColorApp --env COLOR=green devwikirepo/envnodecolorapp
# 실행결과 : 컨테이너는 정상적으로 실행되나 포트포워딩된 3030포트를 찾지 목하기에 정상적인 응답이 돌아오지 않는다.

# 6. 컨테이너 삭제
docker rm -f nginx redColorApp blueColorApp yellowColorApp greenColorApp

DNS란?

  • 인터넷 상에서 도메인 이름을 IP 주소로 변환하거나, 그 반대의 역할을 하는 시스템
  • 기본으로 생성된 브릿지 네트워크는 DNS 기능이 제공되지 않고, 사용자가 직접 생성한 브릿지만 컨테이너의 이름을 통해서 통신할 수 있다.
  • 도메인 주소를 사용하면 IP 주소가 바뀌는 환경에서도 다른 서버들이 영향을 받지 않고 연결이 지속되어 이루어진다.

그림 5) DNS 서버

![[Pasted image 20240407111458.png]]

예시 3) 도커 DNS 실습

Shell1

# 1. 새로운 브릿지 네트워크 생성
docker network create --driver bridge --subnet 10.0.0.0/24 second-bridge

# second-bridge 생성 확인
docker network ls

# 2. containerA 실행 및 DNS서버주소확인
docker run -it --network second-bridge --name containerA devwikirepo/pingbuntu bin/bash

# 컨테이너에 설정되어 있는 DNS 서버 정보 확인
cat /etc/resolv.conf

# 3.핑 테스트
ping containerB
# 실행 결과 : 컨테이너 생성전이기에 도메인서버에 등록된 이름이 없다는 에러 발생
# Shell2로이동====>

# 5. containerB 실행 후 Ping 테스트
ping containerB
# 실행 결과 : ping 정상적으로 수행
# Shell2로이동====>

# 7. containerB 삭제후Ping 테스트
ping containerB
# 실행 결과 : 도메인서버에 등록된 이름이 없다는 에러 발생
Shell2로이동====>

Shell2

# 4. containerB 실행
docker run -d --network second-bridge --name containerB devwikirepo/pingbuntu
docker inspect containerB
# <==== Shell1로이동

# 6. containerB 삭제
docker rm -f containerB 
# <==== Shell1로이동

# 8. containerA및network 살제
docker rm -f containerA 
docker network rm second-bridge
# ====> 실습종료

브릿지네트워크(Bridge)

  • 도커 브릿지를 활용해 컨테이너간 통신, NAT 및 포트포워딩 기술을 활용해 외부 통신지원

호스트 네트워크(Host)

  • 호스트의 네트워크를 공유, 모든 컨테이너는 호스트 머신과 동일한 IP를 사용, 포트 중복 불가능

오버레이네트워크(Overlay)

  • Kubernetes에서 사용, 호스트 머신이 다수일 때 네트워크 관리 기술

Macvlan 네트워크

  • 컨테이너에 MAC 주소를 할당하여 물리 네트워크 인터페이스에 직접 연결

예시 4) Leafy 애플리케이션 구성 및 실행

docker network create leafy-network
# => 애플리케이션의 네트워크 생성

docker run -d --name leafy-postgres --network leafy-network devwikirepo/leafy-postgres:1.0.0
# => 네트워크 지정

docker run -d -p 8080:8080 -e DB_URL=leafy-postgres --network leafy-network --name leafy devwikirepo/leafy-backend:1.0.0
# => 8080포트 포트포워딩 => DB접속 URL을 postgres 컨테이너의 이름으로 지정

docker run -d -p 80:80 --network leafy-network --name leafy-front devwikirepo/leafy-frontend:1.0.0
# => 80포트 포트포워딩

docker ps

# 2. 구성 환경 삭제
docker rm -f leafy-front leafy leafy-postgres 
  • 프론트엔드 컨테이너는 HostOS의 80 포트로 접속
  • 백엔드 컨테이너는 HostOS의 8080포트로 접속
  • 데이터베이스 컨테이너는 포트포워딩 없이 외부에서 접근 불가 - 내부 DNS서버에 등록된 레코드를 통해 백엔드 컨테이너에서 leafy-postgres로 접속
반응형