프로그래밍/Docker

Docker 컨테이너와 이미지의 개념과 강점 알아보기

Lou Park 2022. 1. 4. 00:34

Docker series

[ x ] Docker 개념정리 포스팅

[ - ] Docker 실습 포스팅 [https://jizard.tistory.com/324]

 

고래위의 컨테이너를 보세요!

 

컨테이너 Container

Docker는 LXC라는 컨테이너 기술에 기반한 상위 레벨의 컨테이너 기술이다. LXC는 Linux Container의 약자로, 단일 리눅스 시스템에 동작하고 있는 프로세스를 격리시켜 독자적 환경을 구축할 수 있게 해준다.

 

Host OS와 격리된 환경을 만들어 준다는 점에서 가상 머신(Virtual Machine)과 유사하지만, 약간의 차이점이 있다.  VM을 사용하여 하나의 서버에서 여러 애플리케이션을 구동하는 방법은 Host OS 위에 여러 Guest OS를 띄워서 구성하는 것인데, Hypervisor는 각각의 Guest OS에 자원들(CPU, 메모리, 네트워크 리소스 등)을 나누어 할당한다. 반면 Container는 Host OS의 커널과 Read-only bin/lib 파일, 그리고 하드웨어 자원들을 공유한다. 그렇기때문에 Container는 VM에 비해서 가볍고, 메모리도 적게 차지하고, Overhead도 적다. 

 

이렇게 운영체제의 커널이 하나의 사용자 공간 인스턴스가 아닌, 여러개의 격리된 사용자 공간 인스턴스를 갖출 수 있도록하는 가상화 방식을 OS 수준의 가상화(Operating-system-level virtualization)라고 한다.

출처: https://www.eginnovations.com/blog/containers-vs-vms/

하나의 서버에서 돌리는 프로그램 A, B가 있다고 하자. 프로그램 A는 mysql 5.7 버전을 사용하고, 프로그램 B는 mysql 8.0 버전을 사용한다고하면, 서버 컴퓨터에는 mysql 소프트웨어 버전은 어떤 버전으로 설치해야할까? Container를 사용하면 mysql 5.7과 mysql8.0를 각각 다른 컨테이너로 만들어서 구동시키고, 내/외부 포트번호도 지정해주는 것이 가능하다.

 

 

이미지 Image

Docker Engine은 이미지(Image) 생성, 컨테이너 구동을 담당하는 엔진이다. 초등학생때 데몬툴즈(Daemon Tools)라는 프로그램으로 CD게임을 불법다운로드했었는데 데몬을 실행하려면 iso 이미지를 먼저 선택해야했다. 그때의 그 이미지와 비슷하다. Docker에서의 이미지는 Container를 동작시키기 위해 필요한 모든 파일, 설정값 등을 포함한 "정적" 설정들의 집합이다. Immutable하다는 의미에서 프로그램과 프로세스의 차이에서 프로그램과 비슷하다. 컨테이너는 이미지가 실행된 상태로, 하나의 이미지로 다수의 컨테이너를 생성 할 수 있다. 

 

이 이미지들은 직접 구성할 수도있으며, Docker Hub에서 내려받아 사용할 수도있다. 다운받은 이미지들을 레이어(Layer)로 쌓아올려서 사용할 수도 있다. 이미지는 다음과 같이 Dockerfile에 Docker DSL을 사용하여 생성과정을 기술해서 생성할 수 있다. 

# https://www.daleseo.com/dockerfile/
# Base 이미지를 nodeJS alpine 버전으로 사용
FROM node:alpine

# 작업 디렉토리 전환
WORKDIR /usr/src/app

# local 컴터에있는  package.json 파일을 현재 워킹 디렉토리에 복사 
COPY package*.json ./

# local machine 에서 npm install 실행 
RUN npm install

COPY . .

EXPOSE 5000

ENTRYPOINT ["node"]
CMD ["index.js"]

 

 

*귀찮은 초기 서버세팅들을 이미지로 만들어 두면 다음에 또 쓸 수 있다.

 

Docker Compose

도커 컴포즈는 다중 컨테이너를 구동하는 도커 애플리케이션을 정의할 수 있게 해주는 툴이다. YAML 파일에 설정들을 해주면 docker-compose up 명령어 한줄로 서비스를 실행시킬 수 있다.

 


 

참고자료

http://koushki.net/2018/06/the-difference-between-vm-and-container/

https://aaronryu.github.io/2020/08/20/an-introduction-to-docker/

https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/

https://ko.wikipedia.org/wiki/%EC%9A%B4%EC%98%81_%EC%B2%B4%EC%A0%9C_%EC%88%98%EC%A4%80_%EA%B0%80%EC%83%81%ED%99%94