CI&CD/Docker

Docker 통신 메커니즘

TSpoons 2024. 8. 1. 10:45

Docker는 어떤 방식으로 동작하는지 찾기 위해 통신 방식을 조사해보았다. UDS라는 통신을 쓴다고 하는데 파이썬에서 TCP/IP로 동작하는 socket 방식과 다른 건가 의문을 가지다가 조사해보았다.


UDS(Unix Domain Socket)는 IPC(Inter-Process Communication)의 강력한 방법 중 하나로, 같은 호스트 내의 프로세스 간 통신을 위해 설계되었습니다. 네트워크 소켓과 유사한 API를 사용하지만, 실제로 네트워크 스택을 거치지 않아 더 효율적입니다.
 
Docker의 구조는 크게 다음과 같이 두 가지로 구분됩니다!
Docker client : 우리가 명령어를 입력하는 부분,
Docker demon : 실제로 컨테이너를 관리하는 부분
 
UDS는 클라이언트와 데몬 사이를 잇는 전화선이라고 생각하면 되고,
Linux에서 docker를 사용할 때, /var/run/docker.sock 파일이 그 역할을 합니다.
 
컴퓨터 내부에서만 통신하므로 빠르고 안전하고, 복잡한 네트워크 설정이 필요 없다는 장점이 !!

docker context inspect --format '{{.Endpoints.docker.Host}}'

 

UDS vs TCP/IP

 

  • 프로토콜의 차이:
    • UDS: 운영 체제 내부의 IPC(Inter-Process Communication) 메커니즘입니다.
    • TCP/IP: 네트워크를 통한 컴퓨터 간 통신 프로토콜입니다.
  • 통신 범위:
    • UDS: 같은 컴퓨터 내의 프로세스 간 통신에만 사용됩니다.
    • TCP/IP: 네트워크를 통해 다른 컴퓨터와도 통신할 수 있습니다.
  • 구현 방식:
    • UDS: 파일 시스템의 특별한 파일로 구현됩니다.
    • TCP/IP: 네트워크 스택을 통해 구현됩니다.
  • 주소 지정:
    • UDS: 파일 시스템 경로를 사용합니다 (예: "/var/run/docker.sock").
    • TCP/IP: IP 주소와 포트 번호를 사용합니다.
  • 성능:
    • UDS: 네트워크 스택을 거치지 않아 일반적으로 더 빠릅니다.
    • TCP/IP: 네트워크 오버헤드가 있어 UDS보다 느릴 수 있습니다.
  • 사용 사례:
    • UDS: 로컬 시스템 내 프로세스 간 통신 (예: Docker 클라이언트와 데몬 간)
    • TCP/IP: 네트워크를 통한 원격 통신

 

os에 따른 Docker 작동방식

Docker 엔진은 컨테이너 관리를 위한 핵심 구성 요소로, 다양한 운영 체제에서 효율적인 통신 방식을 제공합니다. 주요 통신 프로토콜로는 Unix Domain Socket(UDS)과 TCP가 있습니다.

리눅스 환경에서는 UDS가 기본 통신 방식입니다. /var/run/docker.sock 파일을 통해 Docker 클라이언트와 데몬 간 통신이 이루어집니다. 이 방식은 보안성과 성능면에서 우수하며, 로컬 시스템 내 프로세스 간 통신에 최적화되어 있습니다.

윈도우에서 Docker Desktop을 사용할 경우, 내부적으로 리눅스 VM을 실행하여 Docker 엔진을 구동합니다. 윈도우 클라이언트는 명명된 파이프(Named Pipe)를 통해 이 VM과 통신합니다. 기본 파이프 경로는 \\.\pipe\docker_engine입니다. 이 방식은 윈도우 환경에서 UDS와 유사한 역할을 수행합니다.

macOS에서도 Docker Desktop은 경량 VM을 사용합니다. 통신 방식은 리눅스와 유사하게 UDS를 사용하며, 소켓 파일 위치는 /var/run/docker.sock입니다. macOS 클라이언트는 이 소켓을 통해 VM 내부의 Docker 엔진과 통신합니다.

원격 접속이 필요한 경우, 모든 플랫폼에서 TCP/IP 프로토콜을 사용할 수 있습니다. 기본 포트는 2375(비보안)와 2376(TLS)입니다. 이 방식은 네트워크를 통한 원격 관리나 클러스터 환경에서 유용하지만, 보안 설정에 주의가 필요합니다.

Docker는 이러한 통신 채널을 통해 REST API를 제공합니다. 사용자가 docker 명령어를 실행하면, Docker CLI는 이 API를 호출하여 컨테이너, 이미지, 네트워크 등을 관리합니다.

결론적으로, Docker는 각 운영 체제의 특성을 고려한 최적의 통신 방식을 제공하여, 효율적이고 안전한 컨테이너 관리 환경을 구축합니다. 개발자와 운영자는 이러한 통신 구조를 이해함으로써 더욱 효과적인 Docker 활용이 가능합니다.