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