An open API service indexing awesome lists of open source software.

https://github.com/dl0312/docker-tutorial

๐Ÿ‘ถ It's time to study docker
https://github.com/dl0312/docker-tutorial

Last synced: 15 days ago
JSON representation

๐Ÿ‘ถ It's time to study docker

Awesome Lists containing this project

README

        

# Docker Tutorial

## Docker๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Docker๋Š” container ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒํ™” ๋„๊ตฌ์ด๋‹ค. ๊ณ„์ธตํ™”๋œ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒํ™”๋œ container์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด container์˜ ํŠน์ • ์ƒํƒœ๋ฅผ ํ•ญ์ƒ ๋ณด์กดํ•ด๋‘๊ณ , ํ•„์š”ํ•  ๋•Œ ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. docker๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์˜ ๋‹จ์ ์€ ๊ทน๋ณตํ•˜๋ฉด์„œ ์žฅ์ ๋งŒ์„ ๊ทน๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ ๊ฐ€์ƒํ™” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

Docker๋Š” ๋‹จ์ˆœ ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋„˜์–ด์„œ ํ™˜๊ฒฝ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ์–ด๋Š ํ”Œ๋žซํผ์—์„œ๋‚˜ ์žฌํ˜„๊ฐ€๋Šฅํ•œ **Application Container**๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž, OSX๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ด๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” `ruby`, `node`, `mysql` ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋’ค์—์„œ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋‚ด ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ํŒŒ์›Œ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ž์›์˜ ๋‚ญ๋น„์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Docker๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋‚ด OS์— `ruby`๋‚˜ `mysql`์„ ์„ค์น˜ํ•˜๋Š” ๋Œ€์‹  Docker Engine์„ ์„ค์น˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ Docker Engine์•ˆ์— `ruby`๋‚˜ `mysql`์„ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Docker Engine์— ์„ค์น˜๋œ ์ด๋ฏธ์ง€๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ๋“ฑ์„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” OS์˜ `Kernel`์„ ์ด์šฉํ•œ๋‹ค.

## Image

Image๋Š” Container๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ ์ •๋œ ์ด๋ฏธ์ง€์ด๋ฉฐ ๋ถˆ๋ณ€^Immutable^ํ•œ ์ €์žฅ ๋งค์ฒด์ด๋‹ค.

Docker Image๋“ค์€ OS๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” OS๋กœ Packageing ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ๋‚ด OS์™€ ๊ฐ ์ด๋ฏธ์ง€๋“ค์ด Packaging๋œ OS๋Š” ๊ฐ™์€ Kernel์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

๋งŒ์•ฝ Linux๋ฅผ ์“ด๋‹ค๋ฉด, Debian์ด๋‚˜ Ubuntu, Alpine ๊ฐ™์€ Kernel์„ ์“ธ ๊ฒƒ์ด๊ณ , MS๋ฅผ ์“ด๋‹ค๋ฉด, Microsoft Server Core๋‚˜ Microsoft Nano Server๋ฅผ ์“ธ ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, ruby์˜ gem์ฒ˜๋Ÿผ ๊ฐ™์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•„์š”ํ•œ ๊ณผ์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ OS์™€ ํ•จ๊ป˜ ๋ฏธ๋ฆฌ Packaging ํ•ด๋†“๋Š”๋‹ค.

### Command

**docker image ํ™•์ธ**

```shell
$ docker images
```

**docker image ์‚ญ์ œ**

```shell
$ docker rmi
```

โš ๏ธ ์ข…๋ฃŒ์ƒํƒœ๋ฅผ ํฌํ•จํ•œ image์—์„œ ํŒŒ์ƒ๋œ container๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น image๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Ÿฌํ•œ image๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋จผ์ € ํŒŒ์ƒ๋œ container๋“ค์„ ๋ชจ๋‘ ์ข…๋ฃŒํ•˜๊ณ , ์‚ญ์ œ๊นŒ์ง€ ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

## Container

Container๋Š” ์ถ”์ƒ์ ์ธ Docker Image๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰๋œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์ƒ๋จธ์‹ ์„ ๋œปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ^Mutable^ํ•˜๋‹ค. ํŠน์ •ํ•œ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์— ์–ด๋–ค ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋”ํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๋ฅผ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

**docker container ํ™•์ธ**

```shell
$ docker ps
```

**docker container ์‚ญ์ œ**

```shell
$ docker rm
```

## Dockerfile

`Code`์™€ `OS`, ๋‹ค๋ฅธ ์˜์กด์„ฑ๋“ค์„ ์ •์˜ ํ•ด๋†“์€ ํŒŒ์ผ์ด๋‹ค. ์ด ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ Docker Image๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ณผ๊ฑฐ์— ์‚ฌ์šฉ๋œ ์„œ๋ฒ„ ์šด์˜ ๊ธฐ๋ก๋“ค์„ ์ฝ”๋“œํ™” ํ•ด๋†“์€ ๊ฒƒ์ด๋‹ค.

```shell
$ docker build
```

```shell
$ docker run -p 8000:8000 -it IMAGE ID node server.js
```

```shell
$ docker run -it IMAGE ID /bin/sh
```

### Dockerfile instructions

FROM - ์ดํ›„์˜ instruction์— ์‚ฌ์šฉํ•  Base Image๋ฅผ ์„ค์ •ํ•œ๋‹ค. FROM ๋ช…๋ น์–ด๋Š” ํ•ญ์ƒ Dockerfile์˜ ์ฒซ instruction์ด์–ด์•ผํ•œ๋‹ค..

WORKDIR - ์ดํ›„์— ๋‚˜์˜ฌ ADD, COPY, CMD, ENTRYPOINT๋‚˜ RUN๊ฐ™์€ instruction๋“ค์˜ ์ž‘์—… ์œ„์น˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

ADD - ํŒŒ์ผ์ด๋‚˜ ํด๋” ์™ธ๋ถ€ URL๋“ค์„ ์†Œ์Šค์—์„œ ๋ณต์‚ฌํ•˜์—ฌ image์˜ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋ณต์‚ฌํ•œ๋‹ค.

## Docker build์˜ Debugging

Docker๋Š” `docker build`๋กœ Dockerfile์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๊ฐ ์‹œํ–‰๋งˆ๋‹ค ์ž„์‹œ ์ด๋ฏธ์ง€์ธ **intermediate image**๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

```shell
Step 4/6 : ADD . /app
---> d6522788204e // ์ด๊ฒƒ์ด intermediate image
```

๋”ฐ๋ผ์„œ docker์—์„œ ์ถœ๋ ฅํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ด์™ธ์— ์ข€ ๋” ๊นŠ๊ฒŒ debugํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€์„ ์‹คํ–‰ํ•œ ๋’ค

```shell
$ docker run -it d6522788204e /bin/sh
```

ํ•ด๋‹น shell์•ˆ์—์„œ ๋‹ค์Œ ์‹œํ–‰์„ ์ง์ ‘ ํ•ด๋ณด๋ฉด์„œ ์–ด๋–ค ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋Š” ์ง€, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š” ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

## TDD ๊ด€์ ์—์„œ Dockerfile ๋ฐ”๋ผ๋ณด๊ธฐ

**TDD ๊ณผ์ •**

1. TDD์—์„œ๋Š” ๋จผ์ € ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ ,
2. ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ•˜๊ณ ,
3. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ/์ˆ˜์ •ํ•œ ํ›„,
4. ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
5. ์ค‘๋ณต๋œ ์ฝ”๋“œ ๋“ฑ์„ ๋ฆฌํŒฉํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
6. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

Dockerfile๋„ ๊ฐ™์€ ์‹์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ๋„์ปค ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ 
2. ๋„์ปค ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ์— ์‹คํŒจํ•˜๊ณ ,
3. ๋„์ปค ํŒŒ์ผ์„ ์ž‘์„ฑ/์ˆ˜์ •ํ•œ ํ›„,
4. ๋„์ปค ์ด๋ฏธ์ง€ ๋งŒ๋“œ๋Š” ๋ฐ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
5. ํ•„์š” ์—†๋Š” ๋ถ€๋ถ„์€ ์ง€์šฐ๊ณ  ํ•ฉ์น  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์€ ํ•ฉ์นฉ๋‹ˆ๋‹ค. (=ํšจ์œจํ™”)
6. 1๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

## Reference

- [๐Ÿ“น Docker Tutorial - Part 1 - What is Docker, and Key Concepts](https://youtu.be/T25Z4CUwYjE)
- [๐Ÿ“„ ๋„์ปค(Docker) ํŠœํ† ๋ฆฌ์–ผ : ๊น ๊น€์— ๋ฐฐํฌ๊นŒ์ง€](https://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/)