Docker #1

Kim Yongbin·2022년 11월 27일
1

GDSC

목록 보기
6/6

이 글은 GDSC-yonsei 리드님의 도커세션을 듣고 난 후 내용을 정리한 포스트입니다.

1. 시스템 구조(네트워크 소켓)

서버간 통신은 어떤 식으로 이루어질까?

기본적인 시스템 구조

기본적인 시스템 구조이다.
user level의 Application에서 OSI 7계층을 통하여 hardware의 NIC(Netwrork Interface Card)까지 도달하는 시스템 구조이다.

NIC: Network Interface Card (Network Adapter)

서버간 통신 구조

우리가 브라우저에서 www.naver.com을 입력했을 때로 예시를 들어보면 해당 브라우저(Application)에서 소켓에 요청에 대한 정보를 write하고 TCP → IP → Driver → NIC를 통해 랜선으로 데이터가 넘어간다. 이후 네이버 메인 페이지 요청이 받아지는 서버의 NIC에서 역으로 NIC → Driver → IP → TCP → Socket으로 데이터가 넘어간다. 해당 endpoint를 처리하는 application socket에서 데이터를 읽고 이에 대한 response를 내어준다.

2. 시스템 구조(VM, Docker)

VM (Virtual Machine)

Virtual Machine?

VM은 호스트 하드웨어에서 실행하는 프로그램으로 호스트 OS 또는 다른 VM과 격리된 환경을 제공한다.

VM을 사용하지 않는다면 하나의 프로그램이 호스트 CPU의 모든 자원을 차지한 채 죽었을 때 다른 프로그램들도 모두 정상작동하지 않는 참사가 발생할 수 있다.

VM을 통해 리소스를 제한을 하며 각각의 프로그램을 격리시킬 수 있다.

VM 시스템 구조

VM은 프로그램(application)이므로 user level에서 돌아간다. 이때 VM의 hardware는 초기 세팅 이후 일반적으로 user가 건드릴 수 없으니 호스트 관점에서는 kernel에에서 돌아간다.

VM에서 크롬을 통해 네이버에 접속한다고 하면 해당 request는 VM의 NIC를 통해 나와 Host의 TCP→IP→ VNet#n으로 전달된다. 이후 Virtual Bridge(VNet#0) → eth0을 통해 host의 NIC로 전달된다. 이후 랜선을 타고 반대쪽 endpoint로 전달된다.

모든 VM들은 각각 VNet(Virtual Network)가 하나씩 매칭되어 있다. 각 VM에서는 Host의 NIC에 바로 접근이 불가하여 VNet#n → Virtual Bridge를 통해 접근이 가능하다

❓ VM 구조를 보면 TCP ~ NIC까지 모두 중복된다. → 이를 하나로 합친다면..?

Docker

Docker 시스템 구조

기존 VM에서 User mode만 남긴 것이 Container이다. 이 Container들은 Docker Engine을 통해 데이터를 전달할 수 있다. VM과 유사하게 각 컨테이너들은 각각 Veth를 하나씩 할당 받고 Docker 0이라고도 불리는 가상 브릿지를 통해 eth0에 데이터를 넘기고 NIC에 접근할 수 있다.

veth #n: 각 컨테이너에 연결되는 가상의 네트워크 인터페이스

eth0: 외부와 통신할 수 있는 호스트의 Network Interface ⇒ 이를 통해서만 호스트의 NIC에 접근이 가능하다.

Docker0: eth0과 각각의 veth를 연결해주는 브릿지. IP주소는 172.17.0.1로 고정

Docker Engine

Docker Engine은 기본적으로 리눅스 커널 기반으로 만들어졌다. 따라서 Mac이나 윈도우에서는 중간에 추가적인 layer가 필요하다. 이 Layer가 바로 Docker Desktop이다.

3. Docker Image

Docker Registry부터 Pull/Push 하는 것은 Docker Image를 주고 받는 것이다.

Docker Image & Docker Container

  • Image: 붕어빵 틀
  • Container: 붕어빵 ⇒ Docker image를 실행한 것이 Docker Container이다.

Docker Image Layering

Docker pull을 통해 특정 Image(약 1GB) 버젼을 2개 pull 받았을 때, 이 파일들의 크기는 2GB가 아니다.

Docker Image는 Layer를 하나씩 쌓듯이 관리되는데 Ver 1.0과 Ver 1.3에서 하단 4개의 layer는 변화가 없고 제일 위의 layer에서만 차이가 있다면 하단 layer 4개는 공유하고 위의 layer만 다운을 받는다.

⇒ 1GB의 파일 2개를 받아도 2GB가 안되는 이유

따라서, 공유하는 layer가 있기 때문에 Image는 기본적으로 read-only이다.

  • Image에 Writable layer를 올려서 실행시킨 것이 Container

4. Docker Context

Docker의 Socket

도커에는 3개의 소켓이 있다.

  1. Docker Context: ssh-socket & unix-socket
  2. TCP-scoket (2375)

Docker Context

Unix-socket

Docker 명령어가 입력되면 File System을 통해 Docker Engine의 Unix-Socket으로 들어간다. 이후 해당 명령어를 Docker Engine이 실행한다.

Docker 원격으로 컨트롤: ssh-socket

SSH(Secure Shell)를 통해 원격으로 docker를 컨트롤 할 수 있다.

profile
반박 시 여러분의 말이 맞습니다.

0개의 댓글