1. 네트워크 기본개념
(1) 네트워크와 IP주소
네트워크는 여러 장치가 서로 연결되어 정보를 공유하고 통신할 수 있도록 하는 시스템이다. 전세계의 여러 장치들은 랜선이라는 케이블로 물리적으로 연결되고, 이를 통해 전기적 신호로 정보를 주고받는 것이다.
네트워크에서 어떤 정보를 보내는 경우에는 정보를 수신하는 측의 주소가 필요한데, 그 역할을 하는 것이 IP주소이다. 컴퓨터는 인터넷에 연결될 때 전세계에서 유일한 IP주소를 할당받게 된다. 다만 IP주소는 통신사에서 관리하고 일반적으로 가정용 인터넷은 동적 IP를 사용하기 때문에 변동될 수 있다.
데이터 패킷을 올바른 목적지로 전달하려면 각 장치는 인터넷에서 고유한 IP 주소를 가져야 할 것이다. 인터넷에 가입한 회선당 공인IP가 하나씩 할당된다. 그런데 집에는 한대의 컴퓨터만 있는게 아니라 컴퓨터, 노트북, 스마트폰 등 여러 장치가 인터넷을 사용하고 있다. 어떻게 하나의 공인 IP주소로 여러 장치를 사용할 수 있는 것일까? 이는 하나의 공인 IP를 NAT기술을 사용해 여러 사설IP와 연결하기 때문이다. 일반 가정에서는 공유기가 장치별로 새로운 사설 IP 주소를 DHCP를 통해 자동으로 할당하며, NAT를 통해 공인 IP를 공유한다.
(2) 포트
위와 같은 원리로 네트워크에서 IP주소를 통해 장치로 데이터를 전달받게 된다. 그런데 한 장치에는 웹 브라우저, 이메일 클라이언트 등 여러 소프트웨어가 동시에 실행되고 있을 수 있다. 특정 데이터가 어떤 소프트웨어로 전달되어야 하는지는 어떻게 알 수 있을까? 이는 네트워크에서 포트(Port)라는 개념을 통해 해결된다.
포트는 한 장치의 네트워크 상에서 실행 중인 여러 소프트웨어를 구분하는 논리적 통신 지점을 말한다. IP주소가 네트워크 상에서 장치를 식별해주는 주소라면, 포트 번호는 장치 내에서 실행중인 소프트웨어를 구분하는 번호이다. 네트워크 데이터는 포트를 통해 장치 내의 특정 소프트웨어와 정확히 연결될 수 있다.
각 포트는 0부터 65535까지의 숫자로 표현되는데, 0부터 1023까지는 well-known 포트로 특정 서비스에 예약되어 있다. 예를들어 HTTP는 80, HTTPS는 443, SSH는 22, FTP 21 등이다. 1024부터 49151까지는 well-known보다는 덜 일반적이지만 등록된 포트이고, 49152부터 65535는 임시로 사용되며 동적으로 할당되는 포트이다.
(3) DNS
네이버에 접속하는 경우에 우리는 www.naver.com와 같은 도메인 주소를 입력한다. 놀랍고도 당연하지만 도메인주소 대신 숫자로 이루어진 네이버 웹서버의 IP주소를 입력하더라도 네이버에 접속할 수 있다. 다만 숫자 뭉치인 IP주소보다 도메인주소가 훨씬 기억하기 쉽고 직관적이기 때문에 도메인 주소를 사용하는 것이다.
사용자가 도메인주소를 통해 접근하려면 도메인 주소와 IP주소를 매핑해주어야 할 것인데, 이 과정에서 DNS가 등장한다. DNS(Domain Name System)은 도메인 이름과 IP주소를 서로 변환하는 역할을 한다. 사용자가 도메인 주소를 입력하면 DNS 서버가 해당 작업을 처리하는 것이다.
2. NAT와 포트포워딩
공인IP를 사용하는 네트워크 통신을 공인망이라 하고 사설 IP를 사용한 통신망을 사설망이라 하는데, 공유기를 중심으로 내부 장치에 사설 IP가 부여되면서 외부에서 직접 접근할 수 없는 사설망이 형성된다. 이러한 외부의 공인IP와 내부의 사설IP 사이에서 어떻게 통신이 이루어지는지 간략하게 살펴보자.
(1) NAT
내부 서버에서 외부 서버로 나가는 outbound 통신의 경우, 외부의 공인 IP는 고유한 주소이므로 요청을 보내는 것 까지는 문제가 없어 보인다. 그러나 요청을 받은 외부 서버에서 내부 서버로 응답이 돌아올 때 문제가 있는데, 내부의 사설 IP는 내부에서만 사용하는 IP주소이기 때문에 외부에서 접근할 수 없기 때문이다. 이러한 접근을 위해 사용되는 기술이 NAT(Network Address Translation)이다. NAT는 공인IP의 랜덤한 포트를 여러개 지정해두고 각각의 포트에 사설IP의 정보를 매칭시키는 방식으로 공인IP와 사설IP를 매핑시키는 기술이다.
(2) 포트 포워딩
외부 서버에서 내부 서버로 직접 요청을 보내는 inbound 통신의 경우, 내부 서버에서 제공하는 특정 서비스를 사용하기 위한 것이므로 포트를 랜덤으로 사용하는 것 보다는 미리 포트를 지정해 두는 것이 자연스럽다. 따라서 외부에서 내부망으로 접근할 때는 사용자가 직접 매핑 정보를 관리하는 포트 포워딩 기술을 사용한다.
3. 도커의 가상 네트워크
(1) 개념
도커 네트워크는 컨테이너 간의 통신 및 컨테이너와 외부 네트워크 간의 연결을 관리하는 가상 네트워크 계층이다. 여기서 가상 네트워크는 하나의 서버 안에서 여러 새로운 네트워크를 논리적으로 구성하는 기술을 말한다. 도커는 가상 네트워크 기술을 통해 컨테이너의 네트워크를 구성한다. 도커 네트워크는 컨테이너 간 통신과 외부 네트워크와의 데이터 교환을 가능하게 하는 가상 네트워크 환경을 제공한다.
(2) 동작 원리
도커 네트워크는 물리적 장비 없이 소프트웨어적으로 네트워크 환경을 구성하고 관리하는 시스템인데, 그 동작 원리를 간략하게 알아보자. 도커를 설치하면 호스트 OS에는 docker0라는 가상 브리지 인터페이스가 생성되는데, 이 브리지는 컨테이너와 호스트 OS, 그리고 컨테이너 간의 통신을 중재하는 역할을 한다. docker0는 기본적으로 172.17.0.1과 같은 가상의 IP 주소를 할당받으며, 도커는 이 브릿지 네트워크의 서브넷 내에서 각 컨테이너에 고유한 IP주소를 할당한다. 컨테이너가 생성될 때마다 veth라 불리는 가상 네트워크 인터페이스가 자동으로 생성되고, 이 인터페이스는 브리지에 연결된다. 이로써 컨테이너는 각자의 독립적인 네트워크 네임스페이스를 가지면서도 브리지를 통해 다른 컨테이너와 외부 네트워크와 연결될 수 있는 환경을 갖추게 된다.
컨테이너 간의 통신은 브리지와 가상 인터페이스를 통해 이루어진다. 예를 들어, 컨테이너 1에서 컨테이너 2로 데이터를 전송하는 경우, 컨테이너 1의 veth 인터페이스를 통해 신호가 브리지로 전달되고, 브리지는 패킷의 목적지 IP를 확인한 뒤 컨테이너 2의 veth 인터페이스로 데이터를 전달한다. 이 과정은 물리적 네트워크 장비 없이 소프트웨어적으로 처리되며, 컨테이너 간 신호를 효율적으로 주고받을 수 있도록 설계되어 있다. 도커는 기본적으로 컨테이너 이름을 DNS이름으로 사용하여 컨테이너 간의 통신을 지원하기 때문에 같은 네트워크에 있는 컨테이너는 할당받은 IP주소뿐 아니라 서로의 이름을 사용하여 통신할 수 있다.
또한, 도커는 호스트 OS의 IP Tables를 이용해 트래픽의 흐름을 제어한다. 컨테이너 생성 시 도커는 자동으로 관련 규칙을 추가하고, 컨테이너가 삭제되면 규칙을 업데이트한다. 기본적으로 브리지 네트워크를 제공하지만, 사용자는 필요에 따라 사용자 정의 네트워크를 생성해 특정 컨테이너 간 통신을 격리하거나 구성할 수 있다.
(3) 외부 네트워크와의 연결
도커는 기본적으로 NAT를 사용하여 컨테이너의 사설 네트워크와 외부 네트워크를 연결한다. 컨테이너에서 외부로 나가는 outbound 요청의 경우 NAT를 사용하여 컨테이너의 사설 IP를 호스트의 공인 IP로 변환한다. 이렇게 변환된 패킷은 호스트의 공인 IP로 외부 서버에 도달하고, 응답 패킷은 NAT을 통해 다시 원래의 컨테이너로 돌아간다.
외부에서 컨테이너로 들어오는 inbound 요청의 경우 NAT만으로는 특정 컨테이너에 도달할 수 없기 때문에 포트 포워딩이 필요하다. 호스트의 특정 포트를 컨테이너 내부의 포트에 매핑하여 외부 요청이 해당 컨테이너로 전달되도록 설정한다.
(4) 도커 네트워크 드라이버
도커는 브리지 네트워크 외에도 여러 네트워크를 지원하고 있다. 여기서는 간단하게 표로 정리하고 넘어가자.
실습 명령어 정리
- docker network ls : 네트워크 리스트 조회
- docker network inspect [네트워크명] : 네트워크 상세 정보 조회
- docker network create [네트워크명] : 네트워크 생성
- docker network rm [네트워크명] : 네트워크 삭제
- docker run -p [호스트OS의 포트]:[컨테이너의 포트] : p는 publish 옵션으로 호스트 포트와 컨테이너 포트를 매핑시킴
'공부 > 개발자를 위한 쉬운 Docker' 카테고리의 다른 글
[Docker] 도커 컴포즈 (0) | 2024.11.22 |
---|---|
[Docker] 도커 볼륨 (0) | 2024.11.20 |
[Docker] 이미지 빌드 (0) | 2024.11.17 |
[Docker] 도커 이미지 (0) | 2024.11.17 |
[Docker] 가상화 기술과 도커 (0) | 2024.11.11 |