Docker

[Docker] 1. 도커Docker를 왜 만들었을까? - 도커 큰그림 그리기

big whale 2024. 2. 23. 14:01

Reference

 

1. 컨테이너 기술이 등장하기 전 과거

옛날엔 한 서버에서 여러 개의 app을 돌리기 안전하지 않았다.

따라서, app 하나 추가할 때 서버를 하나 사야했는데, 이 app 구동에 필요한 사양을 추측해서 서버를 사야했다.

따라서, 남는 사양 → 낭비

VMware의 등장

  • 한 서버에서 여러 개의 VM을 운영함으로써 여러개의 app을 안전하게 구동할 수 있게 되었다.

VM 류의 단점

  • 각각의 가상머신은 OS 위에서 구동되기 때문에 CPU, RAM, Storage 많이 사용함.

Container의 등장으로 해결

  • container는 VM과 비슷하지만 차이가 있음.

Container vs VM 차이점

  • 컨테이너: 호스트에 OS가 설치되어 있고, 하나의 호스트에서 여러 개의 컨테이너가 호스트의 OS를 컨테이너들끼리 공유하는 구조
  • 가상머신: 각 가상머신당 개별 OS 필요.

장점

  • 각 컨테이너에서 별도의 CPU, RAM, Storage가 필요하지 않게 되었다.
  • OS 라이센스 문제 없음.
  • OS 패치 문제 없음.
  • portable → 노트북, 클라우드, VM 어디에서나 같은 컨테이너 사용 가능

Linux Container

  • 많은 개인, 단체의 기여로 만들어짐(ex. 구글: 리눅스 커널)

컨테이너의 주요 기술

  • kernel namespaces
  • control groups

그밖에

  • 도커가 등장하기 전까지 컨테이너 기술은 사용하기 어려워서 잘 쓰이지 않았다.(리눅스 엔지니어 필요, 거대 기업에서 사용)
  • 컨테이너는 구동 머신의 커널을 이용한다. 따라서 각 머신 OS별 컨테이너 구현이 다르다.
  • 리눅스에서 windows container 구동 방법 → WSL2 사용

 

2. Docker

도커는 리눅스와 윈도우 환경에서만 작동한다.

맥: docker desktop사용(hyperkit가 경량 리눅스 가상환경을 만들어주면, 이 위에서 도커가 돌아간다.)

Docker Engine(도커 엔진)

컨테이너를 구동하고 orchestrate하는 런타임 환경이다.

Open Container Initiative(OCI)

컨테이너 표준 설립 기구

컨테이너 표준 스펙들

  • image spec
  • runtime spec
  • distributed spec

 

3. Docker Big Picture

도커를 설치하면 두 개의 주요 컴포넌트가 있다.

  • docker client
  • docker daemon(server or engine)

Images

도커 이미지: OS의 파일시스템과 app을 포함하는 객체(멈춘 컨테이너, 클래스와 유사)

  • openvidu 이미지만 있었는데 ubuntu 이미지 추가한 상태
  • 만약 nginx 이미지 추가하면 nginx를 구동하기 위한 os 코드 조금 + nginx로 구성된 이미지가 받아질 것이다.

docker container 명령어들

docker container run -it ubuntu:latest /bin/bash // ubuntu:latest 이미지 구동하는데, bash shell 실행
docker container ls // 현재 구동중인 컨테이너 리스트 반환
docker container exec -it vigorous_chatterjee bash // 호스트 터미널과 이미지 터미널 합치고 bash 실행 
ctrl - p q // 데몬 상태로 만들고 빠져나오기
docker container stop vigorous_chatterjee // 컨테이너 중지

Dockerfile

Docker Image를 어떻게 빌드할 것인지에 대해 작성된 문서

예제 dockerfile

seon@Userui-MacBookAir psweb % cat Dockerfile 
# Test web-app to use with Pluralsight courses and Docker Deep Dive book
FROM alpine

LABEL maintainer="nigelpoulton@hotmail.com"

# Install Node and NPM
RUN apk add --update nodejs npm curl

# Copy app to /src
COPY . /src

WORKDIR /src

# Install dependencies
RUN  npm install

EXPOSE 8080

ENTRYPOINT ["node", "./app.js"]
seon@Userui-MacBookAir psweb % 

이미지 빌드 코드

docker image build -t test:test .

dockerfile이 있는 위치에서 위 명령어를 실행하면, <이름>:<태그> = test:test인 이미지가 빌드됨

docker container run -d --name web1 -p 8080:8080 test:latest