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를 이용하여 가능은 하나 의존적이게 됨
- Linux Kernel에서 Window OS를 띄우는건 불가능하단 소리
- 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는 독립적이므로
취약점 이슈해결이 필요합니다.
- 이러한 문제는 Host OS가 존재하는 Type2의 가상화 환경이여도 Guest OS는 독립적이므로
DockerImage
- Docker Container를 실행하기 위한 이미지 파일
- 도커 이미지는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다.
- 도커 이미지는 불변성을 띄어 새로운 실행환경을 구성한다면 새로운 이미지로 빌드되어야 한다.
DockerLayer
- DockerImage는 수백MB~에서 GB단위가 될 수 있음.
Docker Image는 불변성의 띄어 변경사항이 있다면 새로 이미지를 생성해야함. - Docker Layer 의 버전관리를 이용해 Docker Image의 변경부분에 대해서만 관리할 수 있음
- Git의 Commit과 유사하게 생각하면 이해가 빠름
DockerLayer예시
- Host OS에서 새로운 컨테이너를 실행
docker run --name=base-container -ti ubuntu
- 컨테이너 콘솔에 접속 후 Node 설치
apt update && apt install -y nodejs
- 해당 명령어를 이용해 새로운 이미지로 빌드할수 있음
docker container commit -m "Add node" base-container node-base
- 새로운 이미지 파일에 대한 히스토리 보기
docker image history node-base
- 우리가 설치한 Node에대한 레이어가 맨위에 생긴걸 확인 할 수 있음
- 이제 추가적인 이미지 빌드 작업을 통해 우리의 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 |
---|