Docker를 간단하게 알아보자!

Karim·2022년 2월 7일
55

Docker 운영

목록 보기
1/4
post-thumbnail

1. Docker 란

도커?

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

컨테이너?

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

이미지?

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

💡 도커 아키택처

2. VM vs Docker

제가 학교에서 공부할 땐 VMware를 통해 가상 서버를 올리고 테스트 하는 일이 많았어요~
회사에 들어와보니 Docker를 이용하였고, Docker의 이점을 더 알게됐어요.

🥊 vs

  • 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

  • process 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와 namesapce가 서로 다른 격리된 파일시스템 트리를 가질 수 있도록 한다.

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<link>
        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 데몬에 있는 두 개의 독립 실행형 컨테이너 간의 통신을 용이하게 할 수 있다.

📌 여담

  • 도커 로고 너무 귀엽다 🐳

📚 참고

profile
나도 보기 위해 정리해 놓은 벨로그

4개의 댓글

comment-user-thumbnail
2022년 2월 11일

도커는 사랑인데요.

1개의 답글
comment-user-thumbnail
2022년 2월 14일

글 잘봤습니다!!
혹시 network driver 제목처럼 핑크색 같은 제목은 어떻게 쓰셨는지 물어봐도 될까요?

1개의 답글