예전에 가볍게 읽는 도커 안내서라는 내용으로 짧게 강의를 한 적이 있었는데 정리한 내용을 묵히기 아쉬워서 공유하려고 한다.
도커의 등장
- 프로젝트를 할 때 잘 동작하던 라이브러리가 다른 라이브러리를 설치하니 안되거나, OS 버전이 맞지 않아 에러가 발생하는 경험을 해본 적이 있을 것이다.
- 이렇듯 하나의 서버에 여러개의 프로그램을 설치하는 것도 문제이지만 서로 사용하는 라이브러리의 버전이 다르거나 동일한 포트를 사용하는 경우는 설치가 훨씬 더 까다롭다.
- 특히 요즘은 MSA를 지향하면서 굉장히 많은 서버를 설치하고 관리해야 하는 일이 많아졌고 이러한 서버 관리에 대한 혁신적인 기술을 필요로 하였다.
도커가 뭔가요?
정의
- 컨테이너 기반의 오픈소스 가상화 플랫폼
가상화란
- 가상화는 물리적인 하드웨어(HW) 장치를 논리적인 객체로 추상화 하는 것을 의미
- 하나의 하드웨어(HW)를 여러개 처럼 동작시키거나 반대로 여러 개의 장치를 묶어 하나의 장치 인 것처럼 사용자에게 공유자원으로 제공할 수 있다는 것
- 일반적으로 우리는 하나의 컴퓨터(서버)에 하나의 OS를 설치해서 사용
- 가상화를 이용하면 여러 운영 체제를 하나의 물리적 머신에서 동시에 실행
가상화의 동작방식
1. 호스트형 가상화: 호스트 OS위에 게스트 OS 전체를 가상화하여 사용. VMWare, Virtual Box
2. 하이퍼바이저 가상화: 호스트 OS 없이 하드웨어에 하이퍼바이저를 설치하여 사용.
- 전가상화: DOM0에서 번역을 한 후 하이퍼바이저에 요청을 날리면 하이퍼바이저가 하드웨어에 전달.
- OS의 종류에 영향을 받지 않는다.
- 번역가가 있기 때문에 속도가 느리다.
- 반가상화: 성능 문제를 해결하기 위해 나온 기술로, 직접 각각의 가상 머신에서 번역을 해서 하이퍼바이저에 전달해주는 방식
3. 컨테이너 가상화: 호스트 OS 위에 논리적으로 컨테이너를 나누어 사용.
컨테이너
- 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술
- 커널을 공유하는 방식이기 때문에 OS 입장에서는 그냥 프로세스를 실행하는 것이기 때문에 실행 속도가 빠르고, 성능 상의 손실이 거의 없다.
- 가상화 방식에서는 VM을 나눌 때 각 VM마다 OS를 갖는다. 하지만 컨테이너는 다르게 애플리케이션 간에 OS(운영체제) 또한 공유를 한다.
- VM보다 더욱 가벼워 확장성이 뛰어나며 이식성 또한 뛰어나는 등 다양한 이점
이미지(Image)
- 컨테이너 실행에 필요한 파일과 설정값(포트번호, 명령어…)등을 포함하고 있는 것
- 우분투 이미지는 우분투를 실행하기 위한 모든 파일을, MySQL이라면 MySQL을 위한 모든 파일을 가지고 있음.
- 상태값을 가지지 않고 변하지 않음(Immutable)
- 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장
- 이미지는 도커 허브에 등록되어 다운로드 받아 사용할 수 있다.
- 레이어 저장
- 이미지는 여러 파일이 겹겹이 쌓아져있는 형태.
-
- 이렇게 함으로써 기존 이미지에 새로운 파일이 추가되었을 때 다시 새로운 이미지를 다운받지 않고 기존 이미지에 쌓기만 하면 되기 때문에 효율적.
도커파일
- 도커 허브에 있는 이미지 뿐만 아니라 Dockerfile로 직접 이미지를 만들 수도 있다.
- 자체 DSL(Domain-specific language) 언어를 이용하여 이미지 생성 과정을 작성
# vertx/vertx3 debian version
FROM ubuntu:18.04
MAINTAINER boaz@boaz.com
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh
EXPOSE 8080
EXPOSE 7000
CMD ["start.sh"]
참고
https://eunjinii.tistory.com/m/10
반응형
'Docker & Kubernetes' 카테고리의 다른 글
Kubernetes context의 역할 알아보기 (0) | 2023.08.27 |
---|---|
Docker in Docker 사용해보기 (0) | 2023.07.31 |
쿠버네티스를 구축할 때 swap 메모리를 꺼놓아야 하는 이유 - swap 메모리란/꺼놓아야 하는 이유 (3) | 2022.04.03 |
JSON과 비교를 통한 YAML 알아보기 (0) | 2022.03.31 |
kubeadm란? 쿠버네티스에서의 클러스터/역할 (2) | 2022.03.28 |