본문 바로가기

Docker

[Docker]Docker란?

반응형

Docker란?

발표영상

https://www.youtube.com/watch?v=U8k1JdzJHaQ

들어가기전..

가상화란?

가상화는 소프트웨어를 사용하여 프로세서, 메모리, 스토리지 등과 같은 단일 컴퓨터의 하드웨어 요소를 일반적으로 가상 머신(VM)이라고 하는 다수의 가상 컴퓨터로 분할할 수 있도록 해주는 컴퓨터 하드웨어 상의 추상화 계층을 구축합니다. 실제 기반 컴퓨터 하드웨어의 단지 일부에서만 실행 됨에도 불구하고, 각각의 VM은 자체 운영체제(OS)를 실행하며 마치 독립적인 컴퓨터인 것처럼 작동합니다.

무어의 법칙

  • 반도체의 성능은 24개월마다 성능이 2배로 증가하고, 가격 또한 2배 싸진다는 내용의 법칙

하드웨어와 소프트웨어 발전 속도의 차이점

  • 빠른 하드웨어 발전속도에 비해 소프트웨어 발전속도는 느림
  • 하나의 하드웨어 장치에서 서버를 구동 시 실제 물리적 자원들을 10%만 사용하고, 나머지는 낭비됨

가상화 아키텍처

  • Virtualization Layer 영역 내에서 각각의 하드웨어 자원을 할당받음.
    • 독립적으로 OS가 실행될 수 있음

하이퍼바이저

Type 1 (BareMetal Hypervisor)

  • 하드웨어 영역에서 관리되는 가상화 OS
  • 오버헤드가 적음
  • 보안적 관점에서 우수한 아키텍처(각 가상 OS들은 서로 연관성이 없음)
  • 관리 콘솔이 필요함

Type2 (Hosted Hypervisor)

  • Host OS를 통해 가상화 OS 생성
  • 가상화 에뮬레이팅 작업을 거쳐야 해서 오버헤드가 큼
  • 가상 OS들을 관리하는 Host OS 있다는 관점에서 보안적으로 문제가 될수도 있음
  • 관리 콘솔은 필요없음

가상화와 컨테이너 방식의 차이점

첨부된 이미지의 가상화 아키텍처는 HyperVIsor Type2 (Host Os존재)입니다.

  가상화 컨테이너
리소스 운영체제를 사용하기 위한 라이브러리, 커널등을 모두 포함하기 때문에 리소스 규모가 큼 해당 컨테이너에서 필요한 라이브러리등만을 설치하고,커널레벨은 Host OS Container 공유
보안레벨 Guest OS 별 OS가 존재하고, 커널 레벨을 공유하지 않아 보안이 뛰어남 Host OS와 커널 레벨을 공유하기 때문에 Host OS가 취약점이 있다면 보안적 이슈가 생김
유지보수 OS 취약점 발견 시 각 Guest OS 업데이트 필요 커널레벨을 공유하기 때문에 Host OS 업데이트만 필요
OS 운영체제를 새로 구성하기 때문에 OS에 의존하지 않으므로, Window OS에서 Linux OS구현가능 같은 커널 I/O를 공유하므로 Linux에서 Window OS를 구현할 수 없음. Window에서 WSL 기술을 사용하여 Linux OS를 구현 할수 있음

Docker

  • Host OS 와 커널 I/O를 공유함
    • Linux Kernel에서 Window OS를 띄우는건 불가능하단 소리
      Wine Image를 이용하여 가능은 하나 의존적이게 됨
  • Docker를 사용하는 이유는 이식성, 확장성(Scale out)

격리성

  • Host OS와의 격리된 환경을 의미하며, 컨테이너의 설정은 Host OS에 영향을 주지 않음

이식성

  • Docker 컨테이너는 Docker 환경에서 언제나 동일하게 실행됨

경량

  • 필요한 라이브러리들만을 가지고 있어 리소스 소모량이 적음
  • 커널 단계를 공유 하므로, 오버헤드가 적음

버전관리

  • 변경 사항에 대해 새로운 레이어를 추가해 효율적으로 관리 할 수 있음

VM 가상화와 Docker 가상화 아키텍처

  • 가상화 환경에서는 바이너리 Kernel단위의 Guest OS와 Binary ,Library등을 독립된 개체로 들고있음
  • 컨테이너 환경에서는 같은 버전의 APP에서는 Bianry,Library 등을 공유하고 Kernel 단위는 Host OS
    Kernel를 공유함

Docker의 탄생이유

만약 관리해야 할 서버가 수천대라면?

기존 가상화 방식(Hypervisor를 통한 GuestOS 생성)은 무거웠다.

  • OS단위(Kernel단위)로 가상화를 진행하니 리소스 소모가 큼

독립된 환경으로 실행되는 Guest OS의 버전의 관리

  • 만약 OS단위의 취약점이 발견된다면 각 Guest OS의 버전을 업데이트 또는 취약점 이슈해결 필요
    • 이러한 문제는 Host OS가 존재하는 Type2의 가상화 환경이여도 Guest OS는 독립적이므로
      취약점 이슈해결이 필요합니다.

DockerImage

  • Docker Container를 실행하기 위한 이미지 파일
  • 도커 이미지는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다.
  • 도커 이미지는 불변성을 띄어 새로운 실행환경을 구성한다면 새로운 이미지로 빌드되어야 한다.

DockerLayer

  • DockerImage는 수백MB~에서 GB단위가 될 수 있음.
    Docker Image는 불변성의 띄어 변경사항이 있다면 새로 이미지를 생성해야함.
  • Docker Layer 의 버전관리를 이용해 Docker Image의 변경부분에 대해서만 관리할 수 있음
  • Git의 Commit과 유사하게 생각하면 이해가 빠름

DockerLayer예시

  1. Host OS에서 새로운 컨테이너를 실행
 docker run --name=base-container -ti ubuntu
  1. 컨테이너 콘솔에 접속 후 Node 설치
 apt update && apt install -y nodejs
  1. 해당 명령어를 이용해 새로운 이미지로 빌드할수 있음
 docker container commit -m "Add node" base-container node-base
  1. 새로운 이미지 파일에 대한 히스토리 보기
docker image history node-base
  1. 우리가 설치한 Node에대한 레이어가 맨위에 생긴걸 확인 할 수 있음

  1. 이제 추가적인 이미지 빌드 작업을 통해 우리의 Node 설치가 적용된 이미지를 실행 할 수 있음
docker run --name=app-container -ti node-base

  • ubuntu 이미지에서 nginx 이미지를 새로 실행한다면 Docker에서 Layer A,B,C에 대한 부분은
    Docker Build Cache 기술을 통해 기존 리소스를 재활용

  • 우리가 소스코드를 Git을 이용해 버전관리하는 것처럼 Docker또한 OS단위의 버전관리를 진행함

DockerFile

  • 특정 명령어를 수행하는 Docker Container 내부 스크립트를 만들 수 있음
명령 설명 명령 설명
FROM 베이스 이미지 지정 VOLUME 볼륨 마운트
RUN 명령 실행 USER 사용자 지정
CMD 컨테이너 실행 명령 WORKDIR 작업 디렉토리
LABEL 라벨 설정 ARG Dockerfile 안의 변수
EXPOSE 포트 노출 ONBUILD 빌드 완료 후 실행되는 명령
ENV 환경 변수 STOPSIGNAL 종료 시그널 설정
ADD 파일/디렉토리 추가 HEALTHCHECK 컨테이너의 상태 체크
COPY 파일 복사 SHELL 기본 쉘 설정
ENTRYPOINT 컨테이너 실행 명령    

DockerFIle 예시

  # server image는 ubunutu 18.04를 사용
  FROM ubuntu:18.04 
  # Dockerfile 작성자
  MAINTAINER Wimes <yms04089@kookmin.ac.kr> 

  # image가 올라갔을 때 수행되는 명령어들
  # -y 옵션을 넣어서 무조건 설치가 가능하도록 한다.
  RUN \
      apt-get update && \
      apt-get install -y apache2

  # apache가 기본적으로 80포트를 사용하기 때문에 expose를 이용해 apache server로 접근이 가능하도록 한다.
  EXPOSE 80 

  # 컨테이너가 생성 된 이후에 내부의 아파치 서버는 항상 실행중인 상태로 만들어준다.
  # apachectl을 foreground(즉, deamon)상태로 돌아가도록 한다.
  CMD ["apachectl", "-D", "FOREGROUND"]
  • Docker Container 내부에서 실행할 명령어들을 Docker File에서 정의할 수 있음
    • 편의성 증대뿐만 아니라 다른 운영환경에서도 동일한 환경 구성 가능

DockerFile과 Docker Image의 차이점

  • Docker Image는 Docker Container가 실행될 수 있는 런타임 환경을 제공
  • Docker File은 인스턴스 화된 DockerImage에 대한 실제 명령작업 또한 수행할 수 있음
    • DockerFile로 빌드되는 이미지는 매번 새로운 이미지로 빌드 됨

DockerContainer

  • Docker Image를 실행한 상태


참고사이트

가상화란?

https://selog.tistory.com/entry/가상화-Virtualization가상화-개념-쉽게-이해하기

DockerLayer

https://hstory0208.tistory.com/entry/Docker-도커의-레이어Layer에-대해-알아보자
https://docs.docker.com/guides/docker-concepts/building-images/understanding-image-layers/

Docker Cotainer, Image, File

https://hstory0208.tistory.com/entry/Docker도커에-대해-알아보자

https://tech.cloudmt.co.kr/2022/06/29/도커와-컨테이너의-이해-3-3-docker-image-dockerfile-docker-compose/

https://wooono.tistory.com/123
https://tech.cloudmt.co.kr/2022/06/29/도커와-컨테이너의-이해-1-3-컨테이너-사용법/

반응형

'Docker' 카테고리의 다른 글

[Docker] docker pull image / HTTP Status 500 Error  (0) 2021.05.25