Skip to content

Instantly share code, notes, and snippets.

@novelview9
Created November 3, 2017 08:55
Show Gist options
  • Select an option

  • Save novelview9/5ad849b828469a70a655d487ea222f4e to your computer and use it in GitHub Desktop.

Select an option

Save novelview9/5ad849b828469a70a655d487ea222f4e to your computer and use it in GitHub Desktop.
test.md
# [๋ณ€์—ญ[Execellentํ•œ Dockerfile์„ ์ž‘์„ฑํ•˜๋Š” ๋ฒ•!(1)
๋ฒˆ์—ญ์— ์•ž์„œ
์ง€๋‚œ 10์›”๋ถ€ํ„ฐ aws ์„œ์šธ ๋ฆฌ์ „์—์„œ๋„ ecs ์„œ๋น„์Šค๊ฐ€ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
์˜ฌ์ดˆ ์ฒ˜์Œ์œผ๋กœ ๋„์ปค๋ฅผ ์ ‘ํ•˜๊ณ  ecs๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ ํ•œ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋Š”๋ฐ,
Aws ์„œ์šธ๋ฆฌ์ „ ์ถœ์‹œ ์†Œ์‹์— ์ง€๊ธˆ ์ผํ•˜๊ณ  ์žˆ๋Š” ๊ณณ์—์„œ๋„ codedeploy๋กœ ๋ฐฐํฌํ•˜๋˜ ๊ฒƒ์„ ecs๋ฅผ ํ†ตํ•ด ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.
๊ด€๋ จํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋“ค์„ ์ฐพ์•„ ๋ณด๋˜ ์ค‘ ์—ฌ๋Ÿฌ ์ข‹์€ ์ž๋ฃŒ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.
[Docker (Compose) ํ™œ์šฉ๋ฒ• - ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ](http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/)
[์ดˆ๋ณด๋ฅผ ์œ„ํ•œ ๋„์ปค ์•ˆ๋‚ด์„œ - ๋„์ปค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?](https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)
[AWS EC2 Container Service(ECS) (1) - ๊ตฌ์กฐ์™€ ํŠน์ง•](http://bluese05.tistory.com/52)
[AWS EC2 Container Registry(ECR) ์–ด๋ ต์ง€ ์•Š์•„์š”](http://bluese05.tistory.com/51)
[How to write excellent Dockerfiles](https://rock-it.pl/how-to-write-excellent-dockerfiles/)
๊ทธ์ค‘ Dockerfile์„ ์ž‘์„ฑํ•˜๋Š” ๋ฒ•๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋„์ปค ๊ณต์‹ ๋ฌธ์„œ์˜ ์ตœ์‹ ๋ช…์„ธ๋ฅผ ๋”ฐ๋ฅด๋ฉด์„œ bad case๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•˜๋ฉด์„œ ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ ์ณ๋‚˜๊ฐ€๋Š” ์นœ์ ˆํ•œ ๊ธ€์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.
๋„ˆ๋ฌด ์ข‹์€ ๊ธ€์ด๋ผ ๋ฒˆ์—ญํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋Š”๋ฐ,
๋ฒˆ์—ญ์„ ํ—ˆ๋ฝํ•ด์ค€ Jakub Skaล‚ecki ๋‹˜๊ป˜ ๋‹ค์‹œํ•œ๋ฒˆ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์ „ํ•ฉ๋‹ˆ๋‹ค.
Prior to translation,
From last October, AWS-ECS service launched in aws Seoul region.
Earlier this year, I learned and used docker first time, and distributing it through ecs
On that news that ecs launched in seoul region, I tried to change the distribute way of my service from github-hook & codedeploy to docker ECS
I looked up several documents related to it and found many good posts.
As for how to write Dockerfile, I read really good post
followed up with the latest spec of the official docs of the Docker, introduced a bad case, explained one by one, and modified in a good way.
This post is excellent as the title that I had to translate it into korean.
Thank you again to Jakub Skaล‚ecki for allowing me to translate this post
๋ฒˆ์—ญ : https://rock-it.pl/how-to-write-excellent-dockerfiles/
- - - -
๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์š”์ฆ˜ ๋„์ปค๋กœ ์ผ์„ ํ•œ๋‹ต๋‹ˆ๋‹ค. Dockerfile ์„ ์ž‘์„ฑํ•˜๋Š”๊ฒƒ์€ ๋„์ปค๋กœ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ธ๋ฐ, ์ด ๋ถ€๋ถ„์— ์žˆ์–ด์„œ ๋ช‡๊ฐ€์ง€ ํŒ์„ ๊ณต์œ  ํ•˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.
### ๋ชฉํ‘œ๋Š”:
์ด๋ฏธ์ง€ ํฌ๊ธฐ, ๋นŒ๋“œ์‹œ๊ฐ„ ๋ฐ ๋ ˆ์ด์–ด ์ˆ˜๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
๋นŒ๋“œ ์บ์‹œ๋ฅผ ์ตœ๋Œ€ํ•œ ์‚ฌ์šฉํ•˜๊ณ  Dockerfile ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
์ปจํ…Œ์ด๋„ˆ๋ฅผ ์พŒ์ ํ•˜๊ฒŒ ์ด์šฉ ๊ฐ€๋Šฅ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
## TL;DR (**Too long; didnโ€™t read)
์ด ๊ฒŒ์‹œ๋ฌผ์€ ์˜ˆ์‹œ์™€ ๋””ํ…Œ์ผ์— ๋Œ€ํ•œ ์„ค๋ช…์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ ๋‚ด์šฉ์„ ์š”์•…ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- `.dockerignore` ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์„ธ์š”
- ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.
- ๋„์ปค ์˜ ์บ์‹ฑ์„ ์ดํ•ดํ•˜์„ธ์š”. `COPY` ์™€ `RUN` ๋ช…๋ น์„ ์ ์ ˆํ•œ ์ ์ ˆํ•œ ์ˆœ์„œ๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”.
- ์—ฌ๋Ÿฌ `RUN` ๋ช…๋ น์–ดํ–‰์„ ํ•œ์ค„๋กœ ํ•ฉ์น˜์„ธ์š”.
- ๊ฐ ๋‹จ๊ณ„ ์ดํ›„ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์€ ๋ฐ”๋กœ ์ œ๊ฑฐํ•˜์„ธ์š”.
- ์ ์ ˆํ•œ base image ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”(alpine ๋ฒ„์ „์ด๋ฉด ์ถฉ๋ถ„ํ• ๊ฒ๋‹ˆ๋‹ค.)
- `WORKDIR` ๊ณผ `CMD` ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.
- ํ•œ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ช…๋ น์–ด ๋˜๋Š” ๋Ÿฐํƒ€์ž„๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•  ๊ฒฝ์šฐ `ENTRYPOINT`๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.
- ์ปจํ…Œ์ด๋„ˆ ์ง„์ž… ์Šคํฌ๋ฆฝํŠธ๋กœ `exec` ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
- `ADD`๋ณด๋‹ค `COPY` ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
- Dockerfile ๋‚ด๋ถ€์˜ ๊ธฐ๋ณธํ™˜๊ฒฝ๋ณ€์ˆ˜, ํฌํŠธ, ๋ณผ๋ฅจ์„ ์ง€์ •ํ•˜์„ธ์š”
## ์‹ค์ œ ์ ์šฉ ์˜ˆ์ œ
์ด์ œ ๋ง‰ ์ œ ๊ฟ€ํŒ๋“ค์„ ์ฝ์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๋Œ€๋‹จํ•ฉ๋‹ˆ๋‹ค! ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ Dockerfiles ์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€, ๋˜ ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ฐจ์ด์ ์ด ๋ญ๊ฐ€ ์žˆ๋ƒ? ๋ผ๊ณ  ๋˜๋ฌผ์–ด ๋ณผ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.
์ €๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์‹ค์ˆ˜ ์‚ฌ๋ก€๋“ค์„ ๋‹ด์€ ๊ฐ„๋‹จํ•œ Dockerfile ์„ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ๊ณ ์ณ๋‚˜๊ฐˆ๊ฑฐ์—์š”! ์ž‘์€ ๋…ธ๋“œ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„์ปค๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์•„๋ž˜๋ฅผ ๋ณด์„ธ์š”:(`CMD` ๋Š” ๊ผฌ์—ฌ์žˆ๊ณ  ์ž‘๋™๋˜์ง€ ์•Š์„๊ฒ๋‹ˆ๋‹ค, ๋‹จ์ง€ ์˜ˆ์‹œ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.)
```
FROM ubuntu
ADD . /app
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y nodejs ssh mysql
RUN cd /app && npm install
# this should start three processes, mysql and ssh
# in the background and node app in foreground
# isn't it beautifully terrible? <3
CMD mysql & sshd & npm start
```
์šฐ๋ฆฌ๋Š” ์ด๋ ‡๊ฒŒ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ฒ ์ฃ . `docker build -t wtf .`
ํ˜น์‹œ ์—ฌ๊ธฐ ๋ชจ๋“  ์‹ค์ˆ˜๋“ค์„ ์ง‘์„ ์ˆ˜ ์žˆ๋‚˜์š”? ์•„๋‹Œ๊ฐ€์š”? ์ž ๊ทธ๋Ÿผ ํ•˜๋‚˜ ํ•˜๋‚˜์”ฉ ํ•จ๊ป˜ ๊ณ ์ณ๋‚˜๊ฐ‘์‹œ๋‹ค.
## 1. .dockerignore ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”
์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ Docker๋Š” ๋จผ์ € `context`์„ ์ค€๋น„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ๋งŒ๋“œ๋Š” ๊ณผ์ •์— ํ•„์š”ํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ˆ˜์ง‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ conext๋Š” Dockerfile ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ฒŒ๋Š” .git ๋””๋ ‰ํ† ๋ฆฌ, ๋‹ค์šด๋กœ๋“œํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ปดํŒŒ์ผํ•œ ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ค๊ณ  ์‹ถ์ง€ ์•Š์„๊ฒ๋‹ˆ๋‹ค. .dockerignore ํŒŒ์ผ์€ .gitignore ํŒŒ์ผ๊ณผ ๊ฑฐ์˜ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
```
.git/
node_modules/
dist/
```
## 2. ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ํ•˜์„ธ์š”
๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ **ํ•  ์ˆ˜๋Š”** ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜, ssh, supervisor๋ฅผ ํ•œ ์ด๋ฏธ์ง€์— **๋‹ด์„ ์ˆ˜๋Š”** ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒŒ **๋‹น์‹ ์„ ๊ดด๋กญํž๊ฑฐ์—์š”.**
- ๋Š˜์–ด๋‚œ ๋นŒ๋“œ ์‹œ๊ฐ„ (์˜ˆ: ํ”„๋ก ํŠธ ์—”๋“œ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐฑ์—”๋“œ ์ „์ฒด๋ฅผ ๊ฐ•์ œ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.)
- ๋งค์šฐ ๋ฉ์น˜ํฐ ์ด๋ฏธ์ง€
- ๋งŽ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค๋กœ๋“ค๋กœ ๋ถ€ํ„ฐ ๋‚˜์˜ค๋Š” ์–ด๋ ค์šด ๋กœ๊ทธ ๊ด€๋ฆฌ(๊ฐ„๋‹จํ•œ stdout์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค)
- ์ˆ˜ํ‰์ ์ธ ์Šค์ผ€์ผ๋ง์‹œ ์ƒ๊ธฐ๋Š” ๋‚ญ๋น„
- ์ข€๋น„ํ”„๋กœ์„ธ์Šค ๋ฌธ์ œ - ์ ์ ˆํ•œ init ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ œ ์กฐ์–ธ์€ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ Docker ์ด๋ฏธ์ง€๋ฅผ ์ค€๋น„ํ•˜๊ณ  [Docker Compose](https://docs.docker.com/compose/)๋ฅผ ์‚ฌ์šฉํ•ด ์†์‰ฝ๊ฒŒ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์‹œ์— ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
Dockerfile์—์„œ ๋ถˆํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•ด ๋ด…์‹œ๋‹ค. SSH๋Š” [docker exec](https://docs.docker.com/engine/reference/commandline/exec/)๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.
```
FROM ubuntu
ADD . /app
RUN apt-get update
RUN apt-get upgrade -y
# we should remove ssh and mysql, and use
# separate container for database
RUN apt-get install -y nodejs # ssh mysql
RUN cd /app && npm install
CMD npm start
```
## 3. ์—ฌ๋Ÿฌ `RUN` ๋ช…๋ น์–ดํ–‰์„ ํ•œ์ค„๋กœ ํ•ฉ์น˜์„ธ์š”.
๋„์ปค๋Š” ๋ ˆ์ด์–ด๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
- Dockerfile์˜ ๊ฐ ์ปค๋งจ๋“œ๋ผ์ธ์€ ์†Œ์œ„ ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
- ๋ ˆ์ด์–ด๋Š” ์บ์‹œ๋˜๊ณ  ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
- ํ•œ ๋ ˆ์ด์–ด์˜ ์บ์‹œ๊ฐ€ ๋ฌดํšจ๋กœ ์ฒ˜๋ฆฌ ๋œ๋‹ค๋ฉด, ๊ทธ ์ดํ›„ ๋ชจ๋“  ํ›„์† ๋ ˆ์ด์–ด๋“ค ๋˜ํ•œ ๋ฌดํšจ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
- ๋ช…๋ น์–ด ๋ณ€๊ฒฝ ํ›„ ์˜ˆ๋ฅผ๋“ค์–ด ๋ณต์‚ฌํ•œ ํŒŒ์ผ์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜, ๋นŒ๋“œ ๋ณ€์ˆ˜๊ฐ€ ์ด์ „๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ฌดํšจ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
- ๋ ˆ์ด์–ด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ์ด์–ด ์œ„์— ํŒŒ์ผ์„ ๋”ํ•˜๊ณ  ๊ทธ ์ดํ›„์— ์‚ญ์ œํ•˜๋ฉด, ์ด๋ฏธ์ง€๋Š” **์—ฌ์ „ํžˆ** ๊ทธ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.(์ปจํ…Œ์ด๋„ˆ์—์„œ๋Š” ์ด์šฉํ•  ์ˆ˜๋Š” ์—†๊ฒ ์ฃ )
๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์–‘ํŒŒ์— ๋น„์œ ํ•ด๋ณด๊ณ  ์‹ถ๋„ค์š”.
https://lizclong.files.wordpress.com/2012/06/577815734_f19c326a03.jpg
๋‘˜๋‹ค ๋‹น์‹ ์„ ์šธ๊ฒŒ ๋งŒ๋“ค๊ฑฐ์—์š”โ€ฆ ์•„ ์ด๊ฒŒ ์•„๋‹ˆ๊ตฐ์š” ํ ํ . ๋‘˜๋‹ค ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ชฝ ๋ ˆ์ด์–ด๋กœ ๋“ค์–ด๊ฐ€๊ฑฐ๋‚˜ ๋ฐ”๊พธ๊ณ ์‹ถ๋‹ค๋ฉด, ๊ทธ ์ด์ „๊ฒƒ๋“ค์„ ์—†์• ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ๋ชจ๋“ ๊ฒŒ OK ์ž…๋‹ˆ๋‹ค.
์ด ์˜ˆ์ œ๋“ค์„ ์ตœ์ ํ™”ํ•ด๋ด…์‹œ๋‹ค. **์šฐ๋ฆฌ๋Š” ๋ชจ๋“  RUN ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค๊ฒ๋‹ˆ๋‹ค.** ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ๋นŒ๋“œ๊ณผ์ •์— ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” apt-get upgrade ๋ช…๋ น์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.(๋ฒ ์ด์Šค ์ด๋ฏธ์ง€์˜ apt-get upgrade์— ์˜์กด ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)
```
FROM ubuntu
ADD . /app
RUN apt-get update \
&& apt-get install -y nodejs \
&& cd /app \
&& npm install
CMD npm start
```
๋ช…๋ น์„ ๋ณ€๊ฒฝ ๋‹จ์œ„์— ๋”ฐ๋ผ ํ•ฉ์ณ์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์„ธ์š”. ํ˜„์žฌ ์œ„ ์ฝ”๋“œ๋Š”, ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ๋งˆ๋‹ค apt-get ๋ถ€ํ„ฐ ์ „์ฒด Nodejs ๋ฅผ ๋‹ค์‹œ์„ค์น˜ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
```
FROM ubuntu
RUN apt-get update && apt-get install -y nodejs
ADD . /app
RUN cd /app && npm install
CMD npm start
```
## 4. ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ 'latestโ€™๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
`latest` ํƒœ๊ทธ๋Š” ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ, ๋‹ค๋ฅธ ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ๋งํ•ด `FROM ubuntu` ํƒœ๊ทธ๋Š” `FROM ubuntu:latest` ์™€ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ โ€˜latestโ€™ํƒœ๊ทธ ์ž์ฒด๊ฐ€ ์ƒˆ๋ฒ„์ „์ด ๋‚˜์™”์„ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ , ์ด๋•Œ๋ฌธ์— ๋นŒ๋“œ๊ฐ€ ์ค‘๋‹จ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” Dockerfile์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํŠน์ •ํ•œ ํƒœ๊ทธ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
์˜ˆ์ œ์—์„œ `16.04` ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค.
```
FROM ubuntu:16.04 # it's that easy!
RUN apt-get update && apt-get install -y nodejs
ADD . /app
RUN cd /app && npm install
CMD npm start
```
## 5. ๊ฐ๊ฐ *RUN* ๋‹จ๊ณ„ ์ดํ›„ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ์€ ๋ฐ”๋กœ ์ œ๊ฑฐํ•˜์„ธ์š”.
์ง€๊ธˆ๊นŒ์ง€ apt-get ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ , ์ปดํŒŒ์ผ์— ํ•„์š”ํ•œ ๋ช‡ ๊ฐœ์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ , ๋‹ค์šด๋กœ๋“œ ํ›„ ์••์ถ•์„ ํ’€์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ถ„๋ช… ์ตœ์ข… ์ด๋ฏธ์ง€์—์„  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. **์šฉ๋Ÿ‰** ๋•Œ๋ฌธ์—์š”!
์˜ˆ์ œ์—์„œ apt-get lists(`apt-get update`๋ช…๋  ์‹œ ์ƒ๊ธด ๊ฒƒ๋“ค)๋ฅผ ์ œ๊ฑฐ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
```
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y nodejs \
# added lines
&& rm -rf /var/lib/apt/lists/*
ADD . /app
RUN cd /app && npm install
CMD npm start
```
## 6. ์ ์ ˆํ•œ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์‚ฌ์šฉ
์˜ˆ์ œ์—์„œ๋Š” `ubuntu`์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์™œ ๊ทธ๋žฌ์„๊นŒ์š”? node ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ `ubuntu`์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ชฉ์ ์˜ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”? ๋” ๋‚˜์€ ์˜ต์…˜์€ node๊ฐ€ ์ด๋ฏธ ์„ค์น˜๋˜์–ด์žˆ๋Š” ํŠน์ˆ˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
```
FROM node
ADD . /app
# we don't need to install node
# anymore and use apt-get
RUN cd /app && npm install
CMD npm start
```
๋˜๋Š” alpine ๋ฒ„์ „์„ ์„ ํƒํ•˜๋Š”๊ฒƒ์ด ๋”๋‚˜์€ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (alpine์€ ํฌ๊ธฐ๊ฐ€ ์•ฝ 4MB์— ๋ถˆ๊ณผํ•œ ์•„์ฃผ ์ž‘์€ ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์„ฑ๋งž์ถค์ž…๋‹ˆ๋‹ค.)
```
FROM node:7-alpine
ADD . /app
RUN cd /app && npm install
CMD npm start
```
Alpine์—๋Š” [apk](https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management)๋ผ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. `apt-get`๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฅด์ง€๋งŒ ์•„์ฃผ ๋ฐฐ์šฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ `โ€”o-cache`, `--virtual` ์˜ต์…˜๊ณผ ๊ฐ™์€ ์ •๋ง ์œ ์šฉํ•œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด์™€ ๊ฐ™์ด ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ์ง€ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋”๋„ ๋ง๊ณ  ๊ผญ ์•Œ๋งž์€ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•ฉ์‹œ๋‹ค. ๋‹น์‹ ์˜ ๋””์Šคํฌ๊ฐ€ ๋‹น์‹ ์„ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค :)
ํฌ์ŠคํŒ…์ด ๊ธธ์–ด์–ด์„œ 6๋ฒˆ ์ดํ›„๋Š” ๋‘๋ฒˆ์งธ ๊ธ€๋กœ ๋น ๋ฅธ ์‹œ์ผ๋‚ด์— ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment