> ## Content Index
> Fetch the complete content index at: https://blog.everyhelloworld.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# docker (1) - docker의 개념
- URL: https://blog.everyhelloworld.com/docker-hello-world-1/
- Published: 2023-11-05T03:26:47.000Z
- Updated: 2023-11-06T02:55:06.000Z
- Author: Dave Lee
- Tags: docker, devlog

## 들어가기

이 글은 4편으로 구성될 docker에 관한 설명 중 첫번째 글이다.

도커는 다음에 대한 문제의식에서 시작한다.

"한 컴퓨터 내에 독립된 환경을 가상머신보다 더 가볍게 돌릴 수는 없을까?"

## 가상머신 vs docker

가상머신과 docker를 비교해놓은 그림을 보면 왜 도커가 더 효율적으로 작동하는지 알 수 있다. 이미지는 도커 공식 홈페이지에도 올라와있다.

### 가상 머신

가상머신의 경우 host위에 guest 시스템을 가상환경으로 구성한 다음 os부터 하나씩 설치하게 된다. 만약 3개의 가상머신을 돌린단면, 이것이 모두 linux라 하더라도 별도의 OS/필요 프로그램을 한벌씩 다 설치하는 셈이다. 

![](https://blog.everyhelloworld.com/content/images/2023/11/Screenshot-2023-11-01-at-9.16.30-PM.png)

### docker on linux, windows

linux는 container라는 독립적이고 격리된 환경을 제공한다. 이 환경이 docker의 핵심 역할을 한다. 단일한 os가 돌아가고 있으므로 os가 여러벌인 가상머신에 비해 훨씬 가볍다. windows에서도 WSL2를 이용해 linux 커널이 windows위에서 바로 돌아간다.

![](https://blog.everyhelloworld.com/content/images/2023/11/Screenshot-2023-11-01-at-9.16.21-PM.png)

### docker on mac

다만 mac 위에서 docker를 돌릴 때는, mac위에 우선 가벼운 linux를 한벌 얹고 시작한다. 약간의 손실은 있을 수 있으나 최적화가 잘 되어있다고 한다.

![](https://blog.everyhelloworld.com/content/images/2023/11/Screenshot-2023-11-01-at-9.16.21-PM_mac.png)

## container 개념

container는 같은 linux 커널 하에서도 다음과 같은 독립적인 환경을 제공한다.

- namespace - container별 독립적인 process tree, network interface, mount point 등을 제공한다.
- control group - cpu, memory, disk io, network 에 대한 사용량을 독립적으로 제공한다.
- 이것 말고도 몇개 더 제공

이 정도면 container 내에서 user는 자신이 container에 있다기보다는 독립적인 시스템에 있다고 생각하게 된다.

## docker의 image 

docker에는 image라는 개념이 있다. 가령 linux에 nginx를 설치하고 이를 서비스하고 싶다고 해보자.

- 어떤 파일에 초기상태의 linux에 무엇을 해야 하는지를 적어둔다.
- 이 파일을 docker가 읽고 nginx를 설치해준다.
- 이 결과물을 image라고 부른다.
- 이를 docker로 실행시킨다. (run)

즉 docker image란, container를 실행하기 위한 "불변"의 파일 시스템과 설정의 "스냅샷"이라고 말할 수 있다. 여기에는 모든 종속성과 실행에 필요한 코드를 포함하고 있다.

image는 읽기 전용인 여러개의 layer로 구성되며 더 이상 변경할 수 없다. image 생성시 어떤 파일의 삭제를 지시하더라도, 아래 layer에서 파일을 제거하는 것이 아니라 다음 layer에서 이 파일에 대한 접근을 없애는 방향으로 작업이 진행된다.

하나의 image는 종종 다른 image를 base로 해서 구성될 수 있다. 

- wordpress image는 mysql image를 base로 해서 구성된다.
- node image는 debian image를 base로 해서 구성된다.

마지막으로 우리가 어떤 image를 가지고 container를 띄우면 docker는 여기에 쓰기 가능한 layer를 하나 추가해준다. 따라서 우리는 띄운 container 안에서 이것 저것 할 수 있게 된다.

![](https://blog.everyhelloworld.com/content/images/2023/11/img-1.png)

##