아니 Docker 하는데 이 정도 네트워크 지식도 없어??

허온·2025년 4월 7일

docker

목록 보기
2/2
post-thumbnail

네트워크란…??

네트워크는 서로 다른 장치가 유선이나 무선 등의 다양한 방법으로 데이터를 주고 받는 구조나 시스템을 이야기 한다.

공인망 사설망

이때 각각의 장치가 서로 보내는 장치를 구별하기 위해 사용하는 주소가 IP 주소이다.
위와 같이 각 장치에 고유한 IP주소를 가지게 된다.

IP 주소에는 공인 IP와 사설 IP가 있다. 이 두가지의 차이점은 각 IP가 어느 망에 존재하느냐의 차이점이다.

공인 IP란 전 세계에서 유일한 IP로 전 세계에서 이 IP 주소로 데이터를 보낼 수 있다.

사설 IP는 집 안에서 즉 한 그룹 안에서만 유일한 IP를 가진다. 그래서 이 IP 주소는 외부에서 알 수 없고 내부에서만 서로 소통이 가능하다.

그래서 보통은 위에 사진과 같이 외부에서는 공인 IP로 데이터를 주고 받고 그곳에서 추가적인 데이터를 통해 내부 IP를 분리하여 내부와 외부가 서로 상호작용하게 된다.

CIDR

이 IP를 표현하는 방법은 다양하게 있다. 그 중 Classless Inter-Domain Routing 라는 약자로 CIDR 표기법이 있다. 이 CIDR은 IP 주소 + 서브넷 마스크를 간단히 표현하는 방법이다.

🔑 IP주소는 위에서 설명했듯이 각 기기의 고유 주소이고 서브넷 마스크는 네트워크의 크기 즉 이 호스트가 가질 수 있는 IP의 갯수를 나타낸다.

  • IP 주소: 192.168.0.0
  • 서브넷 마스크: 255.255.255.0

위에 예시를 통해 해석을 해보자면 IP는 192.168.0.0이다. 이때 서브넷 마스크를 통해 이 네트워크의 크기는 어디까지 인지 알 수 있다.

따라서 현재 앞에 255가 있는 24비트들은 네트워크 주소를 나타내고 있고 남은 8비트가 호스트 주소로 사용되게 된다.

따라서 이 네트워크안에서 IP 주소를 0과 255를 제외하여 총 254개를 사용가능하다는것을 알 수 있다.


이와 같이 이 IP주소와 서브넷 마스크를 한번에 나타낼 수 있는 방법이 바로 CIDR 표기법이다.

IP주소/접두사길이 (prefix length)
예: 192.168.10.0/24

CIDR 표기법은 위에와 같이 IP주소/접두사길이이다.

접두사의 길이를 통해 네트워크 주소가 어디까지 인지 알 수 있고 이를 통해 내가 가질 수 있는 호스트 IP 갯수를 알 수 있다.

IPv4는 총 32비트로 24비트가 네트워크 주소이기 때문에 총 8비트를 통해 호스트 IP를 구분할 수 있다.

2⁸ - 2 = 254개를 나타낼 수 있다.

2⁸개에서 2를 빼는 이유는

(※ 8비트는 256개의 조합이지만, 첫 주소는 네트워크 주소, 마지막은 브로드캐스트 주소로 예약됨)

라우터

앞에서 살짝 말 했듯이 먼저 라우터와 같은 기기를 통해 공인망에서 IP를 가지고 있고 이를 사설망에서 분리시켜 내부 네트워크 통신망을 만들어 각각의 컴퓨터에 접근할 수 있도록 해준다. 그 역할이 바로 라우터이다.

네트워크 인터페이스와 포트

네트워크 인터페이스

네트워크 인터페이스는 각각의 기기가 네트워크와 연결되기 위한 통신 경로나 장치를 말한다. 위에 사진을 보면 현재 라우터가 각 기기에 사설 IP를 알고 연결해주고 있다. 여기서 이 외부 네트워크와 연결해주는 방법을 사진에서는 랜선을 통해 연결하고 있다.

이 랜선 외에도 네트워크 인터페이스는 우리가 흔히 쓰고 있는 Wi-Fi와 같이 다양한 방법들이 있다.

포트

포트는 기기안에서 실행되고 있는 프로그램을 분리할때 사용된다. 그래서 IP를 통해 컴퓨터를 구분하여 도착하면 이 컴퓨터 안에서도 포트를 통해 또 나뉘게 된다.

따라서 우리가 프로그램을 개발하고 배포할때도 한 컴퓨터에서 DB와 프록시 서버등 다양하게 서버를 돌릴 수 있는 방법 또한 이 포트를 분리해서 가능하다.

NAT & 포트포워딩

📎 위에 사진에서 나오는 InBound(인바운드)와 OutBound(아웃바운드)는 각각의 통신이 어떻게 이루어지는지를 나타낸다.

인바운드는 외부에서 안으로 접근하는것을 이야기 하고 아웃바운드는 반대로 안에서 밖으로 나가는것을 이야기 한다.

NAT

NAT은 안에 서버에서 외부서버로 나가면서 즉 OutBound를 하면서 NAT 테이블에 공인IP, 공인포트 그리고 사설IP, 사설포트를 지정하여 외부서버에 알려주는 방법을 이야기 한다.

따라서 외부 서버에서는 이 내부 서버가 OutBound를 하면서 NAT 테이블에 등록한 공인IP와 공인포트를 통해 사설IP와 사설포트를 확인하여 내부 서버로 접근할 수 있게 된다.

NAT 방법의 장단점

NAT 방법의 장점은 각 IP들과 포트를 직접 테이블에서 랜덤하게 지정해주어 이 IP들과 포트들을 직접 컨트롤 할 수 있기 때문에 관리가 편리하게 된다.

하지만 이 NAT 방법의 단점으로는 이 내부서버에서 OutBound를 하지 않으면 외부서버에서 접근을 하지 못한다는 점이 있다.

포트포워딩

반대로 포트포워딩은 OutBound를 하면서 테이블에 등록하는것이 아닌 그냥 생성되면 바로 테이블에 등록이 된다. 그리고 공인 IP와 서설 IP를 사용자가 직접 지정하여 매핑한다.

포트포워딩의 장단점

포트포워딩의 장점으로는 NAT 방식과 달리 OutBound를 하지 않아도 공인 IP와 포트만 알면 내부 서버로 접근을 할 수 있게 되었다는 점이다.

이에 반해 단점으로는 사용자가 직접 테이블에 IP들을 지정하기 때문에 관리하는데 어려움이 있다. 그리고 NAT 방식과 다르게 생성되면 바로 등록을 하기때문에 큰 공간을 차지하게 된다.

DNS

DNS는 Domain Name System의 약자로 도메인을 통해 서버에 접근할 수 있도록 매핑해주는 친구이다. 우리가 일상생활에서 IP를 외우며 이 컴퓨터에 접근하는 방법은 너무 어렵고 또 힘들다. 따라서 naver.com이나 google.com과 같이 기억하기 쉬운 도메인을 통해 접근한다.

이 도메인과 IP를 가지고 있어 도메인으로 요청을 보내면 그에 해당하는 IP를 리턴해주는 친구가 바로 DNS이다.

DNS는 외부 네트워크에서도 쓰일뿐만 아니라 사설망에서도 내부에서 테이블을 통해 사용이 가능하다.

가상 네트워크

실제 네트워크

실제 네트워크는 위에 사진과 같이 라우터와 서버 둘다 실제로 존재하는 하드웨어로 물리 네트워크라고 한다. 하지만 도커에서는 가상 네트워크를 구축하여 한 컴퓨터안에서 각 컨테이너로 나눠 동작하도록 한다.

가상 네트워크

위에 사진을 보면 서버(실습용 PC)안에가 사설망으로 구축이 되고 그 외부에 공인망이 된다. 사설망 안에는 가상 네트워크가 만들어져 논리상의 네트워크를 구축한다.

현재 위에 사진을 보면 브릿지가 라우터 역할을 하고 각각의 컨테이너가 사설망 안에 있는 서버들이 된다.

따라서 똑같이 컨테이너에 가상의 IP가 각각 할당이 된다.

가상 인터페이스

가상 네트워크에서도 실제 네트워크에서 연결되는 네트워크 인터페이스를 Iptable에 그대로 구현하여 각 IP에 따라 그에 맞는 컨테이너를 연결해준다.

즉 Iptable에서 어느 브릿지의 컨테이너로 가야하는지 선택하고 그에 맞는 위치로 연결시켜주는 역할을 한다.

Docker 네트워크 명령어

docker network ls     # docker image ls 와 똑같이 network 리스트를 출력하는 명령어 

docker network inspect [네트워크명]    # [네트워크명]의 network를 자세히 보는 명령어

docker network create [네트워크명]    # [네트워크명] 이라는 이름의 network를 생성하는 명령어

docker network rm [네트워크명]     # [네트워크명]의 network를 삭제하는 명령어

Docker 실습

1. 포트포워딩 없이 통신 시도

docker network ls

먼저 docker network ls를 하면 bridge라는 브릿지가 이미 존재할 것이다. 이 브릿지는 자동으로 생성해주는 브릿지이다.

그래서 second-bridge라는 새로운 브릿지를 생성한다.

docker network create --driver bridge --subnet 10.0.0.0/24 --gateway 10.0.0.1 second-bridge

--subnet을 통해 네트워크의 크기를 지정해준다. /24이기에 호스트 IP는 8비트를 가질 수 있게 된다. 그러면 총 256 - 2 로 254개의 호스트 IP를 가질 수 있다.

docker run -it --network second-bridge --name ubuntuB devwikirepo/pingbuntu bin/bash

그 다음 ubuntuB 라는 새로운 컨테이너를 second-bridge 브릿지 안에 생성한다.

docker run -it --name ubuntuA devwikirepo/pingbuntu bin/bash

그 다음 bridge라는 기본 브릿지에서 ubuntuA 컨테이너를 만든다. 그 다음 이 ubuntuA에서 ubuntuB로 ping을 날리면 현재 응답이 오지 않는것을 알 수 있다.

2. 포트포워딩으로 통신 시도

docker run -d -p 8003:3000 --name greenColorApp --env COLOR=green devwikirepo/envnodecolorapp

-p를 통해 외부에서의 포트와 내부 포트를 매핑한다.

그럼 내부 뿐만아니라 외부에서도 이제 접근이 가능하다록 설정할 수 있다.

🚨 단 여기서 조심해야할 점이 있다.

호스트가 이미 사용중인 똑같은 포트에 포트포워딩을 하면 충돌이 발생한다. 그래서 포트포워딩 하기 전에 docker ps 명령어를 통해 사용중인 포트를 확인하고 포트포워딩 하는것이 좋다.

Docker 네트워크 DNS

docker 네트워크에서 브릿지를 생성하면 자동으로 docker 네트워크에 DNS 서버가 생성된다.

이 DNS는 위에 사진과 같이 도메인 : IP 로 저장이 되어 이 도메인을 호출시 그 IP를 반환해준다.

이 도메인과 IP는 자체 DNS 서버가 직접 등록해주게 된다.

0개의 댓글