도커 시작 전 *반드시* 알아야 할 네트워크 상식

박가은·2025년 4월 8일


개발자라면 누구나 한번쯤은 들어봤을 도커 같은 기술을 제대로 이해하려면, IP, 포트, NAT 와 같은 네트워크 기본 개념들을 제대로 알고 있어야 합니다. 또한 개발을 하다보면 네트워크에 대한 이해도가 필요해지는 순간이 옵니다.

따라서 지금부터 도커 네트워크를 이해하기 위해 꼭 알아야 할 핵심 네트워크 개념들에 대해서 알아보겠습니다.


IP 란?

아이피 (IP, Internet Protocol) 주소는 네트워크 상에서 기기 (컴퓨터, 스마트폰 등) 를 식별하기 위한 주소입니다.
사람에게 집 주소가 있듯, 기기에도 IP 주소가 있어야 서로 통신할 수 있습니다.


포트란?

IP 주소가 어느 기기인지를 알려준다면, 포트 (Port) 는 그 기기 안의 어떤 프로그램인지를 식별하는 번호입니다.
같은 IP 주소를 가진 기기 안에서도 여러 포트 번호를 통해 다양한 서비스를 동시에 실행할 수 있습니다.

  • 예시:
    • 80번 포트: HTTP 웹 서버
    • 443번 포트: HTTPS 웹 서버

웹 브라우저는 URL에서 포트 번호를 명시하지 않아도, 사용하는 프로토콜에 따라 기본 포트를 자동으로 사용합니다.

  • http:// → 80
  • https:// → 443

https://www.youtube.com -> 정상적으로 접속 가능
https://www.youtube.com:443 -> 정상적으로 접속 가능
https://www.youtube.com:80 -> 맞지않는 포트번호로는 접속 불가


공인 IP vs 사설 IP

공인 IP (Public IP)

  • 인터넷 상에서 전 세계적으로 유일한 주소
  • 인터넷 서비스 제공자 (ISP (Internet Service Provider)) 로부터 할당받음
  • 외부에서 접근 가능

사설 IP (Private IP)

  • 내부 네트워크 (예: 집, 회사, 학교 등) 에서만 사용되는 IP 주소
  • 외부 인터넷에서는 접근 불가

사설 IP 주소 대역

사설 IP는 다음 범위 안에서만 사용합니다:

클래스CIDR 표기주소 범위
A10.0.0.0/810.0.0.0 ~ 10.255.255.255
B172.16.0.0/12172.16.0.0 ~ 172.31.255.255
C192.168.0.0/16192.168.0.0 ~ 192.168.255.255

CIDR(사이더) 표기법이란?

CIDR (Classless Inter-Domain Routing) 은 IP 주소를 표현하고 주소 범위를 나누기 위한 표기법입니다.

형식: IP주소/숫자

예: 192.168.0.0/24 <- 슬래쉬 뒤에 이 숫자가 prefix

CIDR에서 가능한 IP 수는 아래 공식으로 계산할 수 있습니다.
(가능한 IP 수) = 2 ^ (32 - (prefix 길이))

192.168.0.0/24 에서 알 수 있는 사실

  • 네트워크 주소: 192.168.0
  • 사용할 수 있는 호스트 수: 256개 (0~255)
    (실제로는 254개만 사용 가능. 0은 네트워크 식별용, 255는 브로드캐스트용)

라우터 (router)

라우터는 내부 네트워크와 외부 인터넷을 연결해주는 장비입니다.

  • ISP로부터 받은 공인 IP를 통해 인터넷에 연결
  • 내부 장치에는 각각 사설 IP를 자동 할당
  • 외부 통신 시 NAT을 사용해 사설 IP ↔ 공인 IP 변환 처리

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

  • 네트워크 인터페이스 : 컴퓨터나 네트워크 장비가 네트워크에 연결되어 데이터를 주고받기 위한 물리적 또는 가상의 연결 지점
  • 포트 : 해당 인터페이스를 통해 들어오는 데이터가 어떤 프로그램으로 전달되어야 하는지 구분하는 번호

인바운드와 아웃바운드

  • 인바운드 (Inbound) : 외부 → 내부로 들어오는 요청 (예: 외부에서 내 서버 접속)
  • 아웃바운드 (Outbound) : 내부 → 외부로 나가는 요청 (예: 내가 인터넷에 접속)

NAT

NAT (Network Address Translation) 는 네트워크 주소 변환 기술입니다.
내부 사설 아이피 주소를 공인 아이피 주소로 변환하거나 그 반대로 바꾸는 기능입니다.
여러 대의 내부 장치가 하나의 공인 아이피를 통해 인터넷과 통신하고, IPv4 의 주소 부족 문제 해결에 도움을 줍니다.


포트 포워딩

포트 포워딩 (Port Forwarding) 은 외부에서 내부 네트워크의 특정 장치 (서버) 로 접근할 수 있도록 포트를 연결해주는 설정입니다.

  1. 내 컴퓨터에서 내부 서버가 192.168.0.10:8080 에서 실행 중 이다.
  2. 외부 사용자가 공인IP:80 으로 접근
  3. 포트 포워딩 설정을 통해 외부 사용자가 공인IP:80 를 통해 192.168.0.10:8080 에 접근할 수 있게 한다.
    -> 라우터가 요청을 내부 서버로 포워딩 해주는 구조

DNS 서버란?

DNS (Domain Name System) 는 도메인 이름을 IP 주소로 변환해주는 시스템입니다.

  • 사용자는 naver.com 처럼 도메인을 기억하지만, 실제 네트워크 통신은 223.130.200.104 같은 IP 주소로 이루어집니다.
  • DNS는 이런 매핑 작업을 처리해줍니다.

도커 네트워크에서도 컨테이너 이름이 곧 도메인 역할을 하며, 내부 DNS 기능을 통해 서로 통신합니다.


지금까지 도커를 잘 이해하기 위해서 네트워크에 대해서 알아봤습니다. 지금부터는 도커의 가상 네트워크에 대해서 알아보겠습니다.

도커를 공부하는 개발자가 반드시 알아야 할 도커 상식

네트워크는 크게 공인망과 사설망으로 나뉩니다.

공인망

: 외부 네트워크를 사용한 통신망

  • 외부에서 접근가능한 네트워크

사설망

: 내부 네트워크를 사용한 통신망

  • 내부에서만 통신이 가능한 네트워크
  • 라우터는 내부 서버들에게 사설아이피를 할당합니다.

라우터

는 아까 말했듯이 공인 아이피 ↔ 사설 아이피 간의 중계 역할을 합니다.

  • 외부에서 들어오는 요청은 공인 아이피를 통해 라우터에 도달하고, 라우터는 이를 내부 서버 (사설아이피) 로 전달합니다. (외부 요청 --공인아이피--> 라우터 -> 내부서버)
  • 반대로, 내부 서버에서 외부로 나갈 때도 라우터가 NAT 기능을 통해 사설 아
    이피로 변환해줍니다. (내부서버 (사설아이피) --NAT--> 공인아이피)

라우터를 통해 내부 서버들은 사설 IP를 할당받고, 이러한 사설망 내의 서버 위에서 도커가 실행됩니다.
도커는 해당 서버 안에서 자체적으로 가상 네트워크 환경을 구축하여 컨테이너 간의 통신을 관리합니다.
지금부터 도커의 가상 네트워크에서 사용되는 여러가지 용어와 개념들에 대해서 정리하고 알아보겠습니다.


도커 가상 네트워크란?

도커의 가상 네트워크에서는 크게 브릿지 네트워크로 나뉘고 그 안에서 각각의 컨테이너들이 동작합니다.

도커 명령어를 통해 가상의 네트워크 브릿지를 생성할 수 있습니다.


도커 네트워크 관련 명령어

네트워크 리스트 조회 (현재 어떤 브릿지들이 생성되어 있는지)

docker network ls


이렇게 뜨는것이 기본적인 상태 입니다.

네트워크 상세 정보 조회

docker network inspect {네트워크명}


해당 명령어를 실행하면 사진과 같이 많은 정보들이 나옵니다.
그중에서 우리가 봐야할 것은

바로 이 부분입니다.
Subnet 다음에 오는 주소는 공인아이피로 부터 할당받은 사설아이피고 밑에 Gateway 다음에 오는 주소는 사이더를 이용하여 내부 서버에 할당받은 아이피 주소 입니다.
Subnet 옆에 오는 주소는 사이더 표기법이고, prefix 가 16이므로 172.17.255.255 까지 이용가능함을 알 수 있습니다.

네트워크 생성

docker network create {네트워크명}

네트워크 삭제

docker network rm {네트워크명}

위와 같은 두 명령어를 통해 네트워크를 생성하고 삭제할 수 있습니다.


지금부터는 오늘 배운 개념들에 대해서 실습을 통해 알아보겠습니다.
각각 다른 브릿지에 있는 두 컨테이너가 서로 접속 가능한지 알아보겠습니다.

실습과정

  1. second-bridge 라는 이름의 브릿지를 한개 더 만들어보겠습니다.
docker network create second-bridge


2. docker network ls 명령어를 통해 확인해보면 사진과 같이 새로운 브릿지 second-bridge 가 생성되었음을 확인할 수 있습니다.
3. 지금부터는 bridgeubuntuA, ubuntuB, second-bridgeubuntuC 를 생성해보겠습니다.

docker run -d --name ubuntuA devwikirepo/pingbuntu

아무 설정없이 컨테이너를 생성하면 기본 브릿지에서 생성됩니다.

macOS 라면 cmd + tab 을 눌러 화면을 한개 더 띄우고 아래의 명령어를 실행시켜 보겠습니다.

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

ubuntuA 와 달리 -it 로 실행시키면 컨테이너 내부에 접근할 수 있습니다.
한번 더 cmd + tab 을 눌러 화면을 한개 더 띄우고 아래의 명령어를 실행시켜 보겠습니다.

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

명령어를 이용하여 ubuntuA, ubuntuBbridgeubuntuCsecond-bridge 에 생성했습니다.
정말 그럴까요? docker inspect {컨테이너 명} 을 이용하여 확인해보겠습니다.
ubuntuA 를 생성한 쉘에서 확인하겠습니다.

docker inspect ubuntuA, docker inspect ubuntuB 의 실행결과

docker inspect ubuntuC 의 실행결과

각 컨테이너가 저희의 예상과 같이 실행되고 있음을 알 수 있습니다.

이제 컨테이너 끼리 서로 접속해보겠습니다. 이때 ping {IP} 을 사용합니다.
위에 inspect 명령어를 사용했을때 IPAddress 옆에 있는 아이피주소가 그 컨테이너가 할당받은 아이피 입니다.

ubuntuB 가 실행중인 쉘에서 ping {ubuntuA IP} 를 실행하면 요청이 정상적으로 작동합니다.

ping {ubuntuC IP} 를 실행하면 요청이 가지 않습니다. 즉 두개의 다른 브릿지에 있는 컨테이너는 통신할 수 없음을 알 수 있습니다.

ubuntuC 가 실행중인 쉘에서 ping {ubuntuA or B IP} 를 실행해도 통신할 수 없습니다.

0개의 댓글