[Docker] 도커 가상 네트워크

yoonthegarden·2024년 5월 24일
0

Docker

목록 보기
7/9

Part6. 네트워크

네트워크 기본

네트워크란?

여러 개의 장치들이 서로 연결되어서 정보를 주고받을 수 있는 시스템이다.인터넷에서 정보를 검색할 때도 네트워크를 통해서 정보를 주고받을 수 있다. 네트워크는 기계와 기계 사이를 랜선이라는 케이블을 통해 물리적으로 연결한다. 이 물리적인 케이블로 전기신호를 통해서 정보를 주고받을 수 있다. (like 집과 도로)

전기 신호로 만들어진 정보가 인터넷 선을 타고 기기들 사이를 이동할 수 있다. 실제 바다 건너 미국에 있는 컴퓨터의 정보를 받아올 때도 아시아와 미국을 연결하는 해저 케이블을 통해 정보를 받아온다.

즉, 전 세계의 전자기기들은 물리적인 인터넷 선으로 연결되어 있고, 이 선들이 그물망처럼 촘촘히 짜여져 있다고 해서(net + work) 네트워크라고 부르게 되었다.

네트워크에서 어떤 정보를 보내기 위해서는 목적지의 주소가 필요하다. IP 주소로 장치들의 위치를 관리한다. 따라서 컴퓨터가 인터넷에 연결될 때 IP주소를 할당 받는다. 이 IP 주소를 활용해서 컴퓨터나 기계들이 인터넷에서 서로를 찾고 통신할 수 있다. IP 주소는 8바이트에서 3자리 숫자 4개 조합으로 만들어진 주소이다. (IPv4)

범위의 고유한 값으로는 0.0.0.0 ~ 255.255.255.255 (이로 조합할 수 있는 IP주소는 43억개, 하지만 현재 거의 고갈된 상태.. IPv6가 나옴)이 있다. 주소 역할을 하려면 고유해야하기 떄문에 다른 IP와 중복될 수 없다. IP주소는 각각의 통신사가 관리한다. 고정적인 IP를 받아서 사용할 수 있으며, 변경될 수 도 있다. 일반적으로 가정용 인터넷은 동적 IP를 사용하기 때문에 시간이 지나면서 집에 할당된 IP가 바뀔 수도 있다.

보통 통신사의 인터넷에 가입하면 회선당 하나의 IP를 할당받아 사용한다. 본인 PC에 할당된 IP를 확인해보고 ping 명령어를 통해 다른 서버로 인터넷 신호를 보낼 수 있다. (터미널에서 ping 1.1.1.1 하면 상대방 서버에서 응답이 있는지 확인하는 명령이다.)

→ 네트워크는 기기 간의 정보를 주고받기 위한 통신망이다.
→ 전 세계의 네트워크 신호는 IP 주소 체계를 사용해서 원하는 목적지로 찾아갈 수 있다.

회선당 공인IP가 하나씩 할당되는데, 하나의 인터넷 회선으로 스마트폰, 노트북, TV등 다양한 기기로 인터넷을 사용하고 있다. 이처럼 하나의 IP로 여러 기기가 인터넷을 사용하려면 사설 IP를 활용해야한다.

IP는 공인IP와 사설IP가 있다.

공인 IP는 집 주소처럼 인터넷 상에서 고유하다. 이 IP주소를 통해서 전세계의 기기들과 데이터를 주고받을 수 있다.

사설 IP는 집 내부에서 방 번호를 나누는 것처럼 하나의 공인 IP를 나눠서 정의된다. 이 공인 IP안에서 사설 IP로 나눌 때는 네트워크 장비가 필요하다. 가정에서 일반적으로 공유기를 사용한다. (공유기의 1개의 WAN 포트는 외부에서 들어오는 인터넷 신호를 연결하고, 여러개의 LAN 포트를 통해 사설 IP(인터넷 신호)를 분배한다.) 사설IP는 공유기처럼 하나의 네트워크 장비 안에서만 고유하다.

→ IP는 외부에서 사용하는 공인 IP와 내부에서만 사용하는 사설 IP로 관리할 수 있다. 공인 IP를 공유기에 연결해서 여러 개의 사설 IP로 분리했고, 이 사설 IP들은 공유기에 연결되어 있는 TV, 컴퓨터, 스마트폰이 하나씩 받아서 사용할 수 있다. 이렇게 사설 IP를 사용하면 하나의 공인 IP만 가지고도 여러 기기들로 인터넷을 나눠 사용할 수 있다.

  • 공인망 : 공인 IP를 사용하는 네트워크 통신망 (공인 IP끼리 통신)
  • 사설망 : 기업 안에서 사설 IP를 사용하는 통신망 (공인망에서 라우터를 사용해서 만들어진 내부 네트워크망)
  • 라우터는 기업의 공인 IP 주소를 각각의 사내 서버로 분배해주는 장비이다. (공유기와 비슷한 역할) 실제 기업의 네트워크 환경은 더 복잡한 계층 구조로 되어 있지만 이런 네트워크 장비들을 통해서 맨 아래 있는 실제 서버에 인터넷 선이 연결되고 사설망의 사설 IP가 할당된다. (가정보다 복잡할 뿐, 구조는 동일)


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

네트워크 인터페이스란?

  • 인터넷에 연결하기 위해서 컴퓨터에 장착하는 부품 중 하나이다.
  • 네트워크 인터페이스는 IP를 가질 수 있다.
  • 네트워크 인터페이스의 IP를 할당 받고, 인터넷에 연결하려면 네트워크 장비와 랜선으로 연결되어 있어야 한다. (무선 기능 지원시 연결하지 않고, 와이파이 연결로 가능)
  • 하나의 기기는 한 개 이상의 네트워크 인터페이스를 장착할 수 있다. (유선과 무선이 다 되는 노트북의 경우 무선, 유선 인터페이스 두 개가 장착되어 있다.)

→ 서버에 네트워크 인터페이스가 장착되어 있고, 이 네트워크 인터페이스에 할당된 IP로 데이터를 주고 받는다.

포트란?

하지만 서버는 여러 개의 소프트웨어가 실행된다. 이 중 어떤 소프트웨어로 데이터를 전달할지 지정하는 것이 바로 포트 넘버이다. IP뒤에 :포트번호 로 소프트웨어를 지정할 수 있다. 포트는 물리적으로 존재하진 않고, 서버 안에서 정의해서 사용할 수 있다. 네트워크를 사용하는 프로그램은 실행될 때 자신이 사용할 포트를 지정할 수 있다.

서버에서 실행중인 웹서버는 80(http), 443(https), SSH 통신은 22, FTP (파일 통신) 21 포트를 지정해야 한다. 이처럼 사전에 약속된 포트를 Well-Known Port라 한다.

애플리케이션 8080 포트처럼 개발자가 자신의 소프트웨어가 사용할 포트를 직접 지정할 수도 있다.

아웃바운드와 인바운드

네트워크 통신은 크게 OutBound, InBound로 나눌 수 있다.

  • 아웃바운드 : 하나의 서버를 기준으로 했을 때 서버에서 출발하는 신호
  • 인바운드 : 다른 클라이언트나 외부의 서버에서 출발해서 자신의 서버로 들어오는 통신

외부서버와 내부서버의 통신

  • 외부 서버는 전 세계에서 유일한 공인 IP를 가지고 있는데, 내부 서버는 사설망안에서만 식별 가능한 사설 IP 주소를 가지고 있다.

외부의 공인 IP와 내부의 사설 IP의 통신은 어떻게 될까?
NAT와 포트포워딩 기술

  • 네트워크 신호를 보낼 때 출발지와 목적지에 정보가 있어야 한다.
  • 아웃바운드처럼 내부에서 시작돼 외부로 나가는 통신의 경우, 외부의 공인 IP가 유일한 주소이기 때문에 네트워크 안에서 목적지에 문제없이 도착할 수 있다.
  • 외부서버에서 출발지로 응답을 보낼 경우, 내부에서만 사용하는 사설IP가 아닌 공인 IP로 와야한다. 이때 사설 IP까지 찾아오려면 NAT(Network Address Transration)라는 기술이다.

NAT란?

  • NAT는 공인 IP와 사설 IP를 Mapping해주는 기술이다. (자동 설정됨)
  • 공인 IP와 사설 IP의 매핑 테이블을 만들고 어떤 서버로 전달할지에 대한 정보를 기록한다.
  • 사설망을 구성하는 라우터 장비는 모두 이 기능을 가지고 있다.
  • 사설 IP마다 공인포트번호(랜덤 숫자)를 지정해 출발지를 공인IP:공인포트번호 로 보낸다.

위의 경우, 사설망의 안쪽에 있는 서버에서 외부서버로 요청이 전달되었다가 외부 서버에서 응답이 돌아올 때의 트래픽 처리이다.

바깥쪽 서버에서 사설 IP로 직접 요청을 보내는 인바운드 요청의 경우엔 요청을 보낼 때 NAT 테이블의 규칙에 맞게 자동생성되는 공인포트번호로 지정해서 요청을 전달하는 방법도 있다. 하지만 보통은 외부에서 사내망으로 요청을 보내는 경우에는 포트를 랜덤으로 사용하는 것보다 미리 포트를 지정해 두는 것이 자연스럽다.

외부에서 사내 서버를 접근한다는 것은 사내 서버에서 제공하는 특정 서비스를 사용한다는 것을 의미한다. 내부 서버1이 웹서비스를 제공하면 80포트, 내부 서버 2번이 데이터베이스를 제공하면 5432포트로 접근하는 것처럼 랜덤한 포트가 아니라 사전에 정의되어 있는 포트를 제공하는 것이 더 자연스럽다.

NAT 테이블은 동적으로 정보를 관리하기 때문에 외부에서 서버를 접근하는데 혼란이 생길 수도 있다.

따라서 외부에서 사내망으로 접근할 경우 포트포워딩이라는 기술을 사용한다.

포트포워딩이란?

  • 사용자가 직접 NAT 테이블과 같은 맵핑 정보를 관리하는 것이다.
  • 포트포워딩을 설정해두면 외부에서 공인 IP의 포트에 접근할 때, 포트포워딩 룰에 맞는 사설 IP로 변환해서 트래픽을 전달한다.
  • 사용자가 지정해서 사용해야 한다.

DNS

  • Domain Name System
  • 웹 브라우저에서 네이버, 구글 같은 웹사이트 접속 시 주소창에 접속할 주소를 입력한다. https:www.naver.com 을 도메인 주소라 한다.
  • 도메인 주소를 사용하지 않아도, 웹 서버 IP주소를 입력하면 웹서버에 접속할 수 있다. 하지만 의미없는 숫자의 조합인 IP 주소보다는 의미를 가지고 있는 영어이름이 쉽고, 직관적이다.
  • 사용자가 의미있는 도메인 주소를 사용해서 접근할 수 있도록 도메인 주소와 IP주소를 Mapping 해주는 매핑정보가 있다.
  • DNS 서버는 도메인과 IP 주소 데이터를 가지고 있는 시스템이다.
  • 도메인 주소 ↔ IP 주소 , 이 과정은 PC에서 자동으로 처리된다.
  • 실제 통신은 IP 주소로 이루어지지만 클라이언트는 사람이기 때문에 사람이 사용하기 편한 도메인 주소를 사용하는 것이 일반적이다.

DNS 서버로 주소의 IP검색

nslookup dns주소

nslookup google.com

사내망 환경에서의 DNS 서버

  • 일반적으로 엔터프라이즈 환경에서는 사내망에서 별도로 DNS 서버를 운영한다.
  • 기존 DNS와 동일하나, 정보를 주고 받는 주체들이 사설망에 있는 내부 서버들로 한정되어 있다.
  • 사설 IP와 도메인을 저장한 내부 DNS 서버는 사내 서버들끼리 도메인으로 통신할 수 있도록 정보를 제공한다.
  • 외부 DNS 서버들끼리는 온라인 상에서 연동되고 동기화되기 때문에 어떤 DNS 서버를 사용해도 동일한 정보를 받을 수 있다. 하지만 내부 DNS 서버에서는 내부 DNS 서버에 등록된 정보만 얻을 수 있다.

내부 DNS 서버에 없는 도메인은 아예 접속 불가?

→ 내부 DNS에 google.com 도메인 정보가 없으면 사내망 서버에서는 google.com 도메인 정보를 사용할 수 없다. 하지만 이 부분은 내부 DNS 설정에 따라 다르게 작동한다. 내부 DNS 서버에 데이터가 없으면 내부 DNS 서버가 직접 외부 DNS 서버로 자기한테 없는 값을 물어볼 수 있다. (외부 연동 설정 여부에 따라 다르다.)



도커 가상네트워크(1)

가상 네트워크

컨테이너 가상화란?

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

가상 네트워크란?

서버 한 대 안에서 여러 네트워크를 구성하는 기술이다.
→ 네트워크 망 안에서 컨테이너들이 서로 통신할 수 있고, 내부의 컨테이너와 바깥의 서버와도 통신할 수 있다.
따라서 가상 네트워크에 대해서 얘기할 때는 서버 한 대 안에 초점을 맞춰야 한다. 실습하는 PC도 가상화 기술을 사용하는 서버 한 대의 역할을 하기 때문에 구조도에 표시된 서버를 실습용 PC라 생각하면 된다.

가상 네트워크 아키텍처에서 바깥에 물리 네트워크가 어떻게 구성되어 있는지는 중요하지 않다. 어쨌든 물리 서버에서는 네트워크 인터페이스를 통해 공인 IP나 사설 IP가 할당되어 있을 것이다.

도커는 가상네트워크 기술을 활용해 컨테이너의 네트워크를 구성한다. 가상 네트워크는 실제로 인터넷 선이나 공유기가 없이 오직 한 대의 서버 내에서 논리적으로 정의되어 있는 네트워크이다.

가상네트워크의 구성

  1. 가상의 네트워크 브릿지 네트워크가상의 공유기인 도커 제로를 생성한다.

    • 가상의 공유기 도커 제로를 도커에서는 브릿지라고 부른다.
    • 브릿지는 가상의 IP 주소를 할당 받는다. 일반적으로 172.17.0.1이다.
    • 가상의 IP주소란 실제 존재하는 IP가 아닌 서버나 PC안에서 논리적으로 정의되어 있는 가상의 IP이다.

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

  2. 도커에서 컨테이너 실행하면 도커는 브릿지 네트워크의 IP주소 범위 내에서 컨테이너에 가상의 IP를 할당한다.

    • 공유기에 연결된 기기 한 대에 사설 IP가 할당되는 것과 동일하다.
    • 차이는 물리적인 기계나 인터넷 선 없이 오직 소프트웨어적으로만 가상의 네트워크가 구성된다는 것이다.
  3. 같은 브릿지에서 생성된 네트워크는 브릿지를 통해서 통신할 수 있다. (컨테이너간의 통신 전달)

논리적으로 네트워크를 구성하는 기술을 SDN(Software Defined Network) 라 한다.


가상 네트워크에서 네트워크 신호의 전달

  • 일반적 PC나 서버를 설치하면 물리적인 네트워크 인터페이스에 인터넷 선을 꽂아서 사용한다. 물리 인터페이스에 인터넷 선을 연결하면 기기의 공인 IP나 사설 IP를 할당받는다.
  • PC 위에서 도커를 설치하고 실행하면 도커는 가상의 인터페이스를 한 개 생성한다. 그리고 가상의 인터페이스는 호스트 OS에 만들어진다.
  • 각 컨테이너를 실행할 때 컨테이너에 해당하는 가상 인터페이스들이 Veth라는 접두어로 호스트 OS에 만들어진다. 이때 Veth 뒤에 랜덤하게 고유번호가 할당된다.

→ 호스트 OS에는 실제 존재하는 하드웨어인 물리 인터페이스 1개와 소프트웨어로 만들어진 가상의 인터페이스가 5개 만들어진 상태이다.

→ 이때 가상의 인터페이스로 전달되는 네트워크 신호는 각각의 인터페이스로 해당되는 컨테이너로 전달된다. ex) OS에서 Veth2 인터페이스로 신호를 보내면 Veth2 인터페이스는 컨테이너 2번으로 네트워크 신호를 전달한다.

→ 컨테이너끼리 요청을 보낼 때는 Veth1 → Veth2 인터페이스 여야 한다. 물리네트워크의 경우 도착지 IP에 맞게 네트워크를 통해 기기에 전달하는 것을 네트워크 장비들이 해준다. 하지만 가상 네트워크의 경우 별도의 장비가 없기에 소프트웨어적으로 트래픽을 전달해줘야 한다.

→ 가상의 인터페이스 간의 네트워크 패킷을 전달하는 규칙은 호스트OS의 커널 소프트웨어인 iptables에 정의된다.

iptables란?

  • Linux OS의 패킷 필터링 시스템으로 내부의 네트워크 트래픽 관리 및 제어한다.
  • 서버 내부에서 네트워크 트래픽을 제어하고 라우팅 규칙을 정의한다.
  • 내부에서 발생하는 네트워크 트래픽은 iptables에 정의된 대로 흘러간다.
  • 도커는 컨테이너가 생성되거나 삭제될 때마다 호스트 OS의 iptables 규칙을 업데이트해서 Veth 인터페이스의 트패픽을 제어한다.

→ 도커는 컨테이너 통신을 위해 브릿지 네트워크를 정의하고, 호스트 OS의 가상 인터페이스를 생성한다. 그리고 호스트 OS의 iptables 규칙을 관리하면서 가상 인터페이스들 간의 통신 규칙을 만든다. 따라서 사용자는 별도의 설정을 하지 않아도 같은 브릿지 네트워크에서 생성된 컨테이너들은 서로 통신할 수 있다.

→ 또한, 도커는 가상 네트워크 내부에서 여러 개의 브릿지 네트워크를 관리할 수 있다. 브릿지 네트워크 단위로 분리해 특정 컨테이너들끼리는 통신이 되지 않도록 구성할 수도 있다.


실습

네트워크 리스트 조회

docker network ls

네트워크 상세 정보 조회

docker network inspect 네트워크명

네트워크 생성

docker network create 네트워크명

네트워크 삭제

docker network rm 네트워크명

도커를 설치하면 기본적으로 하나의 브릿지 네트워크가 있다.

docker network ls

  • 기본적으로 도커를 사용하면 3개의 네트워크가 만들어진다.
  • DRIVER는 네트워크의 종류를 의미한다.

docker network inspect bridge

  • 네트워크 이름과 아이디 생성일을 확인할 수 있다.
  • Subnet, Gateway를 확인할 수 있다.
  • Subnet은 네트워크 안에서 생성되는 컨테이너들이 할당받는 IP의 범위를 나타낸다. 172.17.0.0/16 → IP 범위를 숫자로 나타내는 CIDR 방식 (172.17.0.0~172.17.255.255)
  • Gateway는 도커 네트워크에 해당하는 도커 브릿지의 IP주소이다.

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

  • --driver 옵션으로 브릿지 네트워크임을 지정한다.
  • --subnet 옵션으로 네트워크가 사용할 IP 대역대를 지정한다. (10.0.0.0~10.0.0.255)
  • --gateway 옵션으로 bridge 주소를 10.0.0.1로 지정한다.

docker run -d --name ubuntuA devwikirepo/pingbuntu

  • 실습에 사용할 ubuntuA 컨테이너를 생성한다.

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

  • ubuntuB 컨테이너 생성 후 shell에 접근한다.

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

  • second-bridge 네트워크에 ubuntuC 컨테이너를 생성 후 shell에 접근한다.

docker ps 하면 셋다 실행 중임을 알 수 있다.

docker container inspect ubuntuA → 컨테이너의 네트워크 정보를 조회할 수 있다.

ubuntuA, ubuntuB는 Gateway는 동일, IPAddress만 다르다.

ubuntuC는 Gateway, IPAddress가 다르다.

ping 명령어를 통해 확인해보면 ubuntuA, ubuntuB끼리는 통신 가능, ubuntuC는 불가능하다.


도커 가상네트워크(2)

HostOS로의 네트워크 접근을 컨테이너로 포트포워딩

docker run --name 컨테이너이름 -p 호스트OS포트:컨테이너포트 이미지이름

→ 왼쪽은 호스트 OS 포트, 오른쪽은 컨테이너가 사용하는 포트를 지정한다.

→ 도커가 실행 중인 서버의 포트를 사용해서 컨테이너로 접근할 수 있다.

가상 네트워크 안에서 컨테이너를 실행하면 컨테이너들끼리는 통신이 가능하다. 하지만 사용자 PC인 호스트OS나 가상 네트워크 바깥에 있는 서버에서 이 컨테이너로 접근하려면 포트포워딩 기술을 사용해야 한다.

Nginx와 DB 컨테이너가 실행 중이고, 172.17.0.2, 172.17.0.3 IP로 실행 중이라고 하면, 공인망에서 사설망으로 네트워크 신호를 보낼 땐 NAT와 포트포워딩 기술을 활용하듯 여기도 동일하게 사용된다.

따라서 Nginx와 DB 컨테이너는 바깥쪽 192.168.0.20, 192.168.0.30로 네트워크 신호를 보낼 수 있다. NAT은 가상 네트워크가 알아서 설정하기 때문에 특별히 지정하지 않아도 내부의 컨테이너는 바쪽 외부망을 통해 다른 서버로 접근할 수 있다. 하지만 다른 서버로 접근하려면 실제로 도커가 실행 중인 물리 서버나 실습용 PC가 물리적인 네트워크로 연결되어 있어야지만 접근이 가능하다.

외부에서 접근할 경우 192.168.0.10에서 포트포워딩을 해서 특정 포트로 접근했을 때 사용자가 지정한 컨테이너로 전달하도록 포트포워딩을 등록해야 한다. PC의 IP인 192.168.0.10의 8001 포트로 요청을 보내면 Nginx 컨테이너의 80포트로 요청이 전달된다. 호스트OS의 포트는 아무거나 지정해도 상관 없지만 중복은 안된다.

실습

docker run -d --name nginx nginx
docker container inspect nginx
  • 포트포워딩 없이 nginx 실행
  • nginx 컨테이너의 네트워크 정보 확인

→ 컨테이너 IP는 172.17.0.2, 포트포워딩을 지정하지 않았기 때문에 컨테이너 IP를 치면 아무 응답이 없다. 172.17.0.2는 가상 네트워크망의 IP 대역이기 때문에 실제로 물리 네트워크에 속해 있는 호스트OS나 다른 서버에서는 접근할 수 없다.

→ 172.17.0.2는 내부의 가상 네트워크에서만 사용되는 IP이고, 실제로 물리적인 네트워크에서 접근하기 위해서 포트포워딩기술을 사용하는 것이다.

포트포워딩을 설정한 nginx 실행

docker run -d -p 8001:80 --name nginx2 nginx
  • nginx는 80포트여서 80으로 지정
  • 8001 포트에 nginx 실행 및 localhost:8001 접속
  • nginx2는 컨테이너의 80포트로 포트포워딩 되어있어 호스트OS의 8001로 접근하면 내부 nginx2 컨테이너의 80포트로 전달된 것이다.
docker run -d -p 8002:3000 --name redColorApp --env COLOR=red devwikirepo/envnodecolorapp
  • 8002 포트에 redapp실행 및 127.0.0.1:8002 접속
  • localhost == 127.0.0.1 완전히 동일한 주소를 의미한다.
docker run -d -p 8003:3000 --name blueColorApp --env COLOR=blue devwikirepo/envnodecolorapp
  • 8003 포트에 blueapp실행 및 IP주소:8003 접속

로컬 호스트 말고 PC의 IP를 사용해서 접근해도 된다.

ifconfig en0 → 본인의 IP확인

본인IP:포트번호 로 접속해도 들어가진다.

이 IP는 사설 IP이기 때문에 사설망의 IP를 사용하는 기기들은 본인IP:포트번호로 접근했을 때 이 웹서버 컨테이너로 접속할 수 있다.

docker run -d -p 8003:3000 --name yellowColorApp --env COLOR=yellow devwikirepo/envnodecolorapp
  • 8003 포트에 yelloapp 실행 시도
  • 이미 8003으로 포트포워딩되어 있어서 에러남
docker run -d -p 8004:3030 --name greenColorApp --env COLOR=green devwikirepo/envnodecolorapp
  • 8004 포트에 greenapp 실행 및 접속(애플리케이션과 다른 포트)
  • 애플리케이션이 사용하지 않는 포트를 지정했을 경우는 컨테이너는 정상적으로 실행되나, 8004번으로 접근했을 때 이 포트포워딩된 주소는 컬러앱의 3030 포트로 전달되기 때문에 실제로 애플리케이션이 사용되지 않는 포트로 접근되어 정상적인 응답이 돌아오지 않는다.

docker rm -f nginx redColorApp blueColorApp yellowColorApp greenColorApp → 실습 컨테이너 모두 삭제

정리

  • 포트포워딩을 설정하지 않으면 본인 서버나, 다른 서버 모두 접근 불가하다.
  • 8001는 80포트로 지정됐기에 localhost나 127.0.0.1, 본인IP의 8001포트로 접근했을 때 nginx2의 응답이 가능하다
  • 실습용 PC가 아니라 같은 사설망에 있는 다른 PC, 기기에서 접근하려면 본인IP:포트 로만 접근가능하다.


가상 네트워크와 DNS

토커는 컨테이너들이 기본적으로 사용할 수 있는 DNS 서버를 제공한다. DNS 서버에는 IP주소와 도메인명이 저장되어 있다. 여기서 Domain은 컨테이너 이름으로 자동 저장된다. 따라서 컨테이너는 기본적으로 컨테이너의 IP가 아닌 컨테이너의 이름으로 서로 통신할 수 있다.

이 DNS서버는 외부의 DNS 서버와 연동되어 있어 구글같은 외부 도메인도 사용할 수 있다. 하지만 기본으로 생성되는 브릿지 네트워크는 DNS 기능이 제공되지 않고, 사용자가 직접 생성한 브릿지만 컨테이너의 이름을 통해서 통신할 수 있다.

도메인 주소를 사용하면 IP주소가 바뀌는 환경에서 다른 서버들이 영향받지 않고 연결이 일관적으로 이뤄진다는 장점이 있다.

실습

docker network create --driver bridge --subnet 10.0.0.0/24 second-bridge
  • 새로운 네트워크 생성
  • docker network ls → second-bridge 생성 확인 가능
docker run -it --network second-bridge --name containerA devwikirepo/pingbuntu bin/bash
  • second-bridge에서 containerA 실행 및 shell 접근
cat /etc/resolv.conf
  • DNS서버 주소 확인
  • 같은 네트워크의 컨테이너들은 IP가 아닌 컨테이너 이름으로 통신 가능
ping containerB
  • 핑테스트 → 도메인 없음, 아직 containerB 생성 전
docker run -d --network second-bridge --name containerB devwikirepo/pingbuntu
docker inspect containerB
  • second-bridge에서 containerB 실행 및 containerB 상세 정보 확인 (새로운 셸에서 실행 할 것)
ping containerB
  • 핑테스트 → 정상적 연결 , containerB IP주소로 요청됨
docker rm -f containerB
  • containerB 삭제
ping containerB
  • 핑테스트 → 도메인 없음

docker rm -f containerA
docker network rm second-bridge

→ 실습 마치기

토커의 네트워크 드라이버

  • 브릿지 네트워크(Bridge) : 도커 브릿지를 활용해 컨테이너간 통신, NAT 및 포트포워딩 기술을 활용해 외부 통신 지원 → 대부분 브릿지 네트워크 활용, 컨테이너는 서로 통신할 수 있고, 외부의 서버에서 접근하려면 포트포워딩 사용해야한다. 각각의 컨테이너들은 NAT을 통해 외부로 요청보낼 수 있다.
  • 호스트 네트워크(Host) : 호스트OS의 네트워크를 공유, 모든 컨테이너는 호스트 머신과 동일한 IP를 사용, 호스트 OS가 사용하는 포트와 중복 불가능
  • 오버레이 네트워크(Overlay) : Kubernetes에서 사용, 호스트 머신이 다수일 때 네트워크 관리 기술 → 여러 개의 호스트 머신이 있을 때, 이 호스트 머신들을 하나의 네트워크처럼 동작하게 만들어 준다. 쿠버네티스에서 주로 사용하는 네트워크 드라이버 방식이다.
  • Macvlan 네트워크 : 컨테이너에 MAC 주소를 할당하여 물리 네트워크 인터페이스에 직접 연결

Leafy 네트워크

docker network create leafy-network

→ leafy-network라는 브릿지 네트워크 생성, 새롭게 네트워크 만든 이유는 기본 네트워크는 DNS 기능을 제공하지 않기 때문이다.

→ DNS 사용하지 않으면 SpringBoot에서 DB에 접근할 때 name(도메인)이 아닌 IP를 통해 접근해야 한다. but IP는 자동으로 할당되기 때문에 DB 컨테이너가 재시작되면 IP도 변경될 수 있다.

docker run -d --name leafy-postgres --network leafy-network devwikirepo/leafy-postgres:1.0.0

→ leafy-network로 네트워크 지정
→ leafy-postgres가 도메인 명인 컨테이너 실행

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

→ leafy-network로 네트워크 지정

→ 프론트엔드 실행할 때는 80포트 포트포워딩

포트포워딩이 되어 있지 않은 leafy-postgres는 사용자의 PC에서 접근 불가이다. 포트포워딩이 되어있는 leafy, leafy-frontend는 실습PC의 IP의 80, 8080 으로 접근가능하다. 실습 PC는 localhost, 127.0.0.1, PC의 IP에 포트 추가하면 접근 가능하다. 실습 PC와 같은 네트워크 망에 있는 다른 기기들은 PC의 IP에 포트를 추가하면 접근 가능하다.

이렇게 외부에 접근이 필요한 컨테이너는 포트포워딩을 통해서 호스트PC의 IP를 컨테이너와 연결할 수 있고, DB같이 직접 연결할 필요가 없는 컨테이너는 포트포워딩을 설정하지 않음으로써 컨테이너들끼리만 통신할 수 있도록 설정한다.

docker ps
2. 구성 환경 삭제
docker rm -f leafy-front leafy leafy-postgres

profile
https://garden-ying.tistory.com/

0개의 댓글