
개발자라면 누구나 한번쯤은 들어봤을 도커 같은 기술을 제대로 이해하려면, IP, 포트, NAT 와 같은 네트워크 기본 개념들을 제대로 알고 있어야 합니다. 또한 개발을 하다보면 네트워크에 대한 이해도가 필요해지는 순간이 옵니다.
따라서 지금부터 도커 네트워크를 이해하기 위해 꼭 알아야 할 핵심 네트워크 개념들에 대해서 알아보겠습니다.
아이피 (IP, Internet Protocol) 주소는 네트워크 상에서 기기 (컴퓨터, 스마트폰 등) 를 식별하기 위한 주소입니다.
사람에게 집 주소가 있듯, 기기에도 IP 주소가 있어야 서로 통신할 수 있습니다.
IP 주소가 어느 기기인지를 알려준다면, 포트 (Port) 는 그 기기 안의 어떤 프로그램인지를 식별하는 번호입니다.
같은 IP 주소를 가진 기기 안에서도 여러 포트 번호를 통해 다양한 서비스를 동시에 실행할 수 있습니다.
웹 브라우저는 URL에서 포트 번호를 명시하지 않아도, 사용하는 프로토콜에 따라 기본 포트를 자동으로 사용합니다.
http://→ 80https://→ 443
https://www.youtube.com -> 정상적으로 접속 가능
https://www.youtube.com:443 -> 정상적으로 접속 가능
https://www.youtube.com:80 -> 맞지않는 포트번호로는 접속 불가
사설 IP는 다음 범위 안에서만 사용합니다:
| 클래스 | CIDR 표기 | 주소 범위 |
|---|---|---|
| A | 10.0.0.0/8 | 10.0.0.0 ~ 10.255.255.255 |
| B | 172.16.0.0/12 | 172.16.0.0 ~ 172.31.255.255 |
| C | 192.168.0.0/16 | 192.168.0.0 ~ 192.168.255.255 |
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라우터는 내부 네트워크와 외부 인터넷을 연결해주는 장비입니다.
NAT (Network Address Translation) 는 네트워크 주소 변환 기술입니다.
내부 사설 아이피 주소를 공인 아이피 주소로 변환하거나 그 반대로 바꾸는 기능입니다.
여러 대의 내부 장치가 하나의 공인 아이피를 통해 인터넷과 통신하고, IPv4 의 주소 부족 문제 해결에 도움을 줍니다.
포트 포워딩 (Port Forwarding) 은 외부에서 내부 네트워크의 특정 장치 (서버) 로 접근할 수 있도록 포트를 연결해주는 설정입니다.
192.168.0.10:8080 에서 실행 중 이다.공인IP:80 으로 접근공인IP:80 를 통해 192.168.0.10:8080 에 접근할 수 있게 한다.DNS (Domain Name System) 는 도메인 이름을 IP 주소로 변환해주는 시스템입니다.
naver.com 처럼 도메인을 기억하지만, 실제 네트워크 통신은 223.130.200.104 같은 IP 주소로 이루어집니다.도커 네트워크에서도 컨테이너 이름이 곧 도메인 역할을 하며, 내부 DNS 기능을 통해 서로 통신합니다.
지금까지 도커를 잘 이해하기 위해서 네트워크에 대해서 알아봤습니다. 지금부터는 도커의 가상 네트워크에 대해서 알아보겠습니다.
네트워크는 크게 공인망과 사설망으로 나뉩니다.
: 외부 네트워크를 사용한 통신망
: 내부 네트워크를 사용한 통신망
는 아까 말했듯이 공인 아이피 ↔ 사설 아이피 간의 중계 역할을 합니다.
(외부 요청 --공인아이피--> 라우터 -> 내부서버)(내부서버 (사설아이피) --NAT--> 공인아이피)라우터를 통해 내부 서버들은 사설 IP를 할당받고, 이러한 사설망 내의 서버 위에서 도커가 실행됩니다.
도커는 해당 서버 안에서 자체적으로 가상 네트워크 환경을 구축하여 컨테이너 간의 통신을 관리합니다.
지금부터 도커의 가상 네트워크에서 사용되는 여러가지 용어와 개념들에 대해서 정리하고 알아보겠습니다.
도커의 가상 네트워크에서는 크게 브릿지 네트워크로 나뉘고 그 안에서 각각의 컨테이너들이 동작합니다.
도커 명령어를 통해 가상의 네트워크 브릿지를 생성할 수 있습니다.
네트워크 리스트 조회 (현재 어떤 브릿지들이 생성되어 있는지)
docker network ls

이렇게 뜨는것이 기본적인 상태 입니다.
네트워크 상세 정보 조회
docker network inspect {네트워크명}

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

바로 이 부분입니다.
Subnet 다음에 오는 주소는 공인아이피로 부터 할당받은 사설아이피고 밑에 Gateway 다음에 오는 주소는 사이더를 이용하여 내부 서버에 할당받은 아이피 주소 입니다.
Subnet 옆에 오는 주소는 사이더 표기법이고, prefix 가 16이므로 172.17.255.255 까지 이용가능함을 알 수 있습니다.
네트워크 생성
docker network create {네트워크명}
네트워크 삭제
docker network rm {네트워크명}
위와 같은 두 명령어를 통해 네트워크를 생성하고 삭제할 수 있습니다.
지금부터는 오늘 배운 개념들에 대해서 실습을 통해 알아보겠습니다.
각각 다른 브릿지에 있는 두 컨테이너가 서로 접속 가능한지 알아보겠습니다.
second-bridge 라는 이름의 브릿지를 한개 더 만들어보겠습니다.docker network create second-bridge

2. docker network ls 명령어를 통해 확인해보면 사진과 같이 새로운 브릿지 second-bridge 가 생성되었음을 확인할 수 있습니다.
3. 지금부터는 bridge 에 ubuntuA, ubuntuB, second-bridge 에 ubuntuC 를 생성해보겠습니다.
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, ubuntuB 는 bridge 에 ubuntuC 는 second-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} 를 실행해도 통신할 수 없습니다.