도커 네트워크-#1 컨테이너 네트워킹

혀어어언·2023년 4월 8일
0

Docker

목록 보기
5/11

네트워크 개요

Docker 컨테이너와 서비스가 강력한 이유 중 하나는 컨테이너와 서비스를 서로 연결하거나 도커가 아닌 워크로드에 연결할 수 있기 때문입니다.
Docker 컨테이너와 서비스는 Docker에 배포되었다는 사실이나 해당 피어가 Docker 워크로드인지 여부를 알 필요조차 없습니다.
Docker 호스트가 Linux, Windows 또는 이 두 가지를 혼합하여 실행되는지 여부에 관계없이 Docker를 사용하여 플랫폼에 구애받지 않고 네트워크를 관리할 수 있습니다.

네트워크 드라이버

Docker의 네트워킹 서브시스템은 드라이버를 사용하여 플러그할 수 있습니다. 기본적으로 다음과 같은 드라이버가 존재하며 핵심 네트워킹 기능을 제공합니다

  • bridge

    • 기본 네트워크 드라이버. 브리지 네트워크는 일반적으로 앱이 통신이 필요한 독립형 컨테이너에서 실행될 때 사용됩니다.
  • 호스트

    • 독립 실행형 컨테이너의 경우 컨테이너와 Docker 호스트 간의 네트워크 격리를 제거하고 호스트의 네트워킹을 직접 사용합니다.
  • 오버레이

    • 오버레이 네트워크는 여러 Docker 데몬을 함께 연결하고 스웜 서비스가 서로 통신할 수 있도록 합니다. 오버레이 네트워크를 사용하여 스웜 서비스와 독립 실행형 컨테이너 간 또는 서로 다른 Docker 데몬의 두 독립 실행형 컨테이너 간 통신을 용이하게 할 수도 있습니다.
    • 이 전략을 사용하면 이러한 컨테이너 간에 OS 수준 라우팅을 수행할 필요가 없습니다.
  • IPvlan

    • IPvlan 네트워크는 사용자가 IPv4 및 IPv6 주소 지정에 대한 완전한 제어를 제공합니다.
    • VLAN 드라이버는 이를 기반으로 운영자가 레이어 2 VLAN 태깅을 완벽하게 제어하고 언더레이 네트워크 통합에 관심이 있는 사용자를 위해 IPvlan L3 라우팅까지 제어할 수 있도록 합니다.
  • 맥블랜

    • 맥블랜 네트워크를 사용하면 컨테이너에 MAC 주소를 할당하여 네트워크에서 물리적 장치로 표시할 수 있습니다. Docker 데몬은 MAC 주소에 따라 트래픽을 컨테이너로 라우팅합니다.
    • Docker 호스트의 네트워크 스택을 통해 라우팅되지 않고 물리적 네트워크에 직접 연결될 것으로 예상되는 레거시 애플리케이션을 처리할 때는 macvlan 드라이버를 사용하는 것이 최선의 선택인 경우가 있습니다.
  • none

    • 컨테이너에 대한 모든 네트워킹을 비활성화합니다.
    • 일반적으로 사용자 정의 네트워크 드라이버와 함께 사용되며, 스웜 서비스에는 none을 사용할 수 없습니다.
  • 네트워크 플러그인

    • Docker와 함께 타사 네트워크 플러그인을 설치하여 사용할 수 있습니다.
    • 이러한 플러그인은 Docker Hub 또는 제3의 제공자로부터 사용할 수 있습니다.

상황별 네트워크 드라이버 선택

사용자 정의 브리지 네트워크

  • 동일한 Docker 호스트에서 통신하기 위해 여러 컨테이너가 필요한 경우에 가장 적합합니다.

호스트 네트워크

  • 네트워크 스택이 Docker 호스트에서 격리되어서는 안 되지만 컨테이너의 다른 측면을 격리하려는 경우에 적합합니다.

오버레이 네트워크

  • 서로 다른 Docker 호스트에서 실행되는 컨테이너가 통신해야 하거나 여러 앱이 스웜 서비스를 사용하여 함께 작동하는 경우에 적합합니다.

맥블랜 네트워크

  • 가상 머신 설정에서 마이그레이션하거나 컨테이너가 네트워크에서 각각 고유한 MAC 주소를 가진 물리적 호스트처럼 보이도록 해야 할 때 가장 적합합니다.

제3자 제공 네트워크 플러그인

  • ocker를 특수 네트워크 스택과 통합할 수 있습니다.

컨테이너 네트워킹

컨테이너는 오로지 IP주소, 게이트웨이, 라우팅 테이블, DNS 서비스, 그리고 다른 네트워킹 세부 정보가 있는 네트워크 인터페이스만 볼 수 있습니다.
즉, 컨테이너는 자신이 어떤 네트워크에 붙었는 지 알 수 없습니다.

컨테이너 관점의 네트워킹에 대해서 알아보겠습니다.

공개 포트(Published Port)

docker create 또는 docker run 명령어를 사용하여 컨테이너를 생성하거나 실행하는 경우, 컨테이너는 기본적으로 자신의 포트를 노출하지 않습니다.

외부 서비스가 포트를 사용할 수 있도록 하기 위해서 또는 다른 네트워크에서 도커 컨테이너가 실행되도록 하기 위해서는 --publish 또는 -p 플래그를 사용해야만 합니다.

이를 통해 컨테이너 내부에 방화벽 규칙이 생성되어, 컨테이너 포트가 외부와 연결되는 Docker 호스트의 포트에 매핑됩니다.

  • 예시
Flag valueDescription
-p 8080:80컨테이너의 TCP 80 포트를 도커 호스트 8080 포트와 매핑
-p 192.168.1.100:8080:80컨테이너의 TCP 포트 80를 호스트 IP 192.168.1.100에 연결하기 위한 Docker 호스트의 포트 8080에 매핑
-p 8080:80/udp컨테이너의 UDP 포트 80을 Docker 호스트의 포트 8080에 매핑
-p 8080:80/tcp -p 8080:80/udp컨테이너의 TCP 포트 80을 Docker 호스트의 TCP 포트 8080에 매핑하고, 컨테이너의 UDP 포트 80을 Docker 호스트의 UDP 포트 8080에 매핑

IP주소와 호스트명

기본적으로 컨테이너는 연결되는 모든 Docker 네트워크에 대해 IP 주소를 얻으며, 연결한 네트워크의 IP 풀에서 IP 주소를 받습니다. Docker 데몬은 각 컨테이너에 대해 DHCP 서버 역할을 효과적으로 수행합니다. 각 네트워크에는 기본 서브넷 마스크와 게이트웨이도 있습니다.

컨테이너가 시작되면 --network 플래그를 사용하여 단일 네트워크에만 연결할 수 있습니다. 도커 네트워크 연결 명령을 사용하여 실행 중인 컨테이너를 여러 네트워크에 연결할 수 있습니다.

network 플래그를 사용하여 컨테이너를 시작할 때 --ip 또는 --ip6 플래그를 사용하여 해당 네트워크에 있는 컨테이너의 IP 주소를 지정할 수 있습니다.

도커 네트워크 연결을 사용하여 기존 컨테이너를 다른 네트워크에 연결하는 경우, 해당 명령의 --ip 또는 --ip6 플래그를 사용하여 추가 네트워크에 있는 컨테이너의 IP 주소를 지정할 수 있습니다.

같은 방식으로 컨테이너의 호스트 이름은 기본적으로 Docker에서 컨테이너의 ID가 됩니다.

호스트 이름은 --hostname을 사용하여 재정의할 수 있습니다.

도커 네트워크 연결을 사용하여 기존 네트워크에 연결할 때 --alias 플래그를 사용하여 해당 네트워크에서 컨테이너의 추가 네트워크 별칭을 지정할 수 있습니다.

0개의 댓글