Docker 란!

찌글렛·2022년 2월 15일
0

CS

목록 보기
10/15

1. Docker 란

도커?

  • Go 언어로 작성된 리눅스 컨테이너 기반의 오픈 소스 가상화 플랫폼

컨테이너?

  • 이미지의 실행 가능한 인스턴스
  • 서버(host Os) 운영상에서 리소스를 논리적으로 구분하여 마치 별도의 서버인 것 처럼 사용할 수 있게 하는 기술
  • OS 뿐만 아니라 Application 단위도 가능
  • 컨테이너를 생성, 삭제, 시작, 중지, 이동, 백업을 쉽게 할 수 있다.

이미지?

  • 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 변하지 않는 상태
  • 읽기전용(read only) 레이어로 구성
  • 같은 이미지로 여러 개의 컨테이너를 생성할 수 있다.
  • 한 이미지를 컨테이너로 올리고 그 해당 상태를 이미지로 저장하여 로드 할 수 있다.

도커 아키텍처

2. VM vs Docker

VM

  • Host OS 위에 Guest OS 전체를 가상화하여 사용하는 방식
  • 여러가지 OS를 가상화할 수 있지만, 하이퍼바이저 위에 Guest OS 위에 Binary 와 libs 등을 모두 구성해야 하기에 무겁고 성능저하가 발생(오버헤드 발생)
  • Host OS를 자원을 처음부터 분리(물리적 구분) 시켜 사용하기 때문에 느리다.

Docker

  • Host OS 위 Docker 엔진 위에서 바로 동작하며 Host OS 자원(커널)을 공유(논리적구분)하기 때문에 Host OS 자원이 좋을 수록 빠르다.
  • Container 위에 Docker engine 을 설치해 또 Container 를 올릴 수 있다.

컨테이너로 실행된 프로세스는 커널을 공유하지만, Linux namespaces, 컨트롤 그룹(cgroup), 루트 디렉터리 격리(chroot) 등의 커널 기능을 활용해 격리되어 실행된다.

3. Linux namespace

한 덩어리의 데이터에 이름을 붙여 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념 Linux namespace는 커널에서 제공하고 있으며, 하나의 시스템에서 프로세스를 격리(Isolation) 시킬 수 있는 가상화 기술

PID namespace

  • pocess ID 이며, 프로세스에 할당된 고유한 ID를 말하며 이를 통해 프로세스를 격리할 수 있다.
  • namespace가 다른 프로세스 끼리는 서로 액세스 할 수 없다.

Network namespace

  • 네트워크 디바이스, IP주소, Port번호, 라우팅 테이블, 필터링 테이블 등의 네트워크 리소스를 namespace마다 격리시켜 독립적으로 가질 수 있다.
  • 이 기능을 이용하면 OS상에서 사용중인 Port번호가 있더라도 컨테이너 안에서 동일한 port번호를 사용할 수 있다.( --net host)

UID namespace

  • UID, GID를 namespace별로 독립적으로 가질 수 있도록 한다.
  • namespace 안과 호스트 OS상에서 서로 다른 UID, GID를 가질 수 있다.

Mount namespace

  • 호스트 OS와 namespace가 서로 다른 격리된 파일 시스템 트리를 가질 수 있도록 한다.

UTS namespace

  • namespace 별로 호스트명이나 도메인 명을 독자적으로 사용할 수 있다.

IPC namespace

  • 프로세스 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있다.

4. Controll Group (cgroup)

cgroup은 프로세스와 스레드를 그룹화하여, 그 그룹안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능 호스트 OS의 CPU나 메모리와 같은 자원에 대해 그룹별로 제한을 둘 수 있다

제한 지원

  • Memory
  • CPU
  • Nework
  • Device
  • I/O

5. Container Network


docker는 호스트 서버의 물리적 네트워크와 Docker의 가상 네트워크가 혼합되어 네트워크가 이루어져 있다.
호스트 서버에서 Docker 에게 명령어를 전달하려면 네트워크로 연결되어 있어야 한다.

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:b4ff:fe55:60a4 prefixlen 64 scopeid 0x20
ether 02:42:b4:55:60:a4 txqueuelen 0 (Ethernet)
RX packets 2870956323 bytes 229621298263 (213.8 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2857386536 bytes 270109230521 (251.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

docker0

  • docker가 실행되면서 자동으로 생성되는 가상의 네트워크 장치이다.
  • docker0 가상네트워크는 브릿지모드로 동작하도록 되어있다.
  • 브릿지 모드는 이 브릿지에 연결한 네트워크 장비들을 외부와 통신하도록 해준다.
  • docker0 는 일반적인 interface가 아니며, virtual ethernet bridge 이다.

network driver

  • bridge
    기본 네트워크 드라이버.
    브리지 네트워크는 기본적으로 L2 통신 기반이며, 일반적으로 애플리케이션이 통신이 필요한 독립 실행형 컨테이너에서 실행될 때 사용
  • host
    독립형 컨테이너의 경우 컨테이너와 Docker 호스트 간의 네트워크 격리를 제거하고 호스트의 네트워킹을 직접 사용
  • overlay
    오버레이 네트워크는 여러 Docker 데몬을 함께 연결하고 스웜 서비스가 서로 통신할 수 있도록 합니다. 또한 오버레이 네트워크를 사용하여 Swarm 서비스와 독립 실행형 컨테이너 간 또는 서로 다른 Docker 데몬에 있는 두 개의 독립 실행형 컨테이너 간의 통신을 용이하게 할 수 있다.

0개의 댓글