Study: DeveloperTools(DevTool)/DevTool: Container

[Docker] Dockerfile ์ •๋ฆฌ: Docker image๋ฅผ ์ƒ์„ฑํ•˜์ž (feat. Docker ์ปค๋ฉ˜๋“œ)

DrawingProcess 2022. 9. 4. 17:17
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” 'Dockerfile'์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋†“์€ ๊ธ€์ž…๋‹ˆ๋‹ค.
๋งŒ๋“ค์–ด์ง„ Docker ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๋Š” ๊ณผ์ •, Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •, ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ณผ์ • ๋“ฑ ๊ธฐ์ดˆ์ ์ธ ๋„์ปค์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ ๋‚ด์šฉ์ด๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. Dockerfile ์— ๋Œ€ํ•˜์—ฌ

1.1 Dockerfile์ด๋ž€?

Docker File์ด๋ž€ Docker Image๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ๋‚ด์— ์ž‘์„ฑ๋œ ์ธ์ŠคํŠธ๋Ÿญ์…˜๋“ค์„ ์ฐธ์กฐํ•˜์—ฌ Docker File์„ ์ž‘์„ฑํ•˜๋ฉด, ์„ค์ •๋œ ๋‚ด์šฉ๋Œ€๋กœ Docker Image๋ฅผ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.

1.2 Docker ์ด๋ฏธ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ

1.2.1 Docker ์ด๋ฏธ์ง€ ์ฐพ์•„๋ณด๊ธฐ

์•ž์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด Docker Image๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์ง์ ‘ Dockerfile์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๋‚˜ ํŠน์ • ์œ ๋ช… ์˜คํ”ˆ์†Œ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ pre-request ๊ณผ์ •์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ํ™˜๊ฒฝ ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋กœ ์ฐพ์•„๋ณด๊ณ  Dockerfile๋ฅผ ์ž‘์„ฑํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

$ docker search nginx
NAME				DESCRIPTION                	STARS     OFFICIAL   AUTOMATED
nginx				Official build of Nginx.   	17430     [OK]       
linuxserver/nginx		An Nginx container…   		178                  
...
  • NAME: ๊ฒ€์ƒ‰๋œ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋Š” '๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฃผ์†Œ/์ €์žฅ์†Œ ์†Œ์œ ์ž/์ด๋ฏธ์ง€ ์ด๋ฆ„' ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
  • DESCRIPTION: ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
  • STARS: ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ›๋Š” ํ‰๊ฐ€ ํšŸ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • OFFICIAL: [OK] ํ‘œ์‹œ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€์— ํฌํ•จ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฏธ๋“ค์›จ์–ด ๋“ฑ์„ ๊ฐœ๋ฐœํ•œ ์—…์ฒด์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•œ ์ด๋ฏธ์ง€๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • AUTOMATED: [OK] ํ‘œ์‹œ๋Š” ๋„์ปค ํ—ˆ๋ธŒ์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ž๋™ํ™” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

1.2.2 Docker ์ด๋ฏธ์ง€ ๋‚ด๋ ค๋ฐ›๊ธฐ

์›ํ•˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ์˜ ๋ช…๋ ค์–ด๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ docker pull nginx

search๋กœ ํ™•์ธ์‹œ ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„ํ˜น ์—†๊ฑฐ๋‚˜ ์ง์ ‘ ์ปค์Šคํ…€ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ Dockerfile์„ ์ž‘์„ฑํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1.3 Dockerfile ์ž‘์„ฑ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ

1.3.1 Dockerfile ์ž‘์„ฑ

๊ธฐ๋ณธ์œผ๋กœ Dockerfile ์ด๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Dockerfile์— ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ ์ž‘์„ฑ ๋‚ด์šฉ์€ ํ•˜๋‹จ์˜ '2. Dockerfile ์ž‘์„ฑํ•˜๊ธฐ'์—์„œ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$ touch Dockerfile

1.3.2 Docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ: docker build

Dockerfile์ด ์œ„์น˜ํ•œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, 1.0์ด๋ผ๋Š” ๋ฒ„์ „์„ ๊ฐ€์ง„ docker_name์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Dockerfile์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ๋นŒ๋“œ์‹œ์—๋Š” ์ถ”๊ฐ€ ์˜ต์…˜(-f)์„ ์ค˜์„œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$ docker build --tag docker_name:1.0 .

docker build ๋ช…๋ น์–ด๋Š” ๋„์ปค ๋ฐ๋ชฌ์— ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋ž€ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํŒŒ์ผ ์ง‘ํ•ฉ์ด๋ฉฐ, ๋นŒ๋“œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ์™€ ๊ทธ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ํฌํ•จ๋œ ์ „์ฒด ํŒŒ์ผ์ด๋‹ค.

๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์—๋Š” COPY๋‚˜ ADD์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ์—๋Š” ํ•„์š”ํ•œ ํŒŒ์ผ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋“์ดํ•˜๊ฒŒ ๋นŒ๋“œ ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ .dockerignore ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ปจํ…์ŠคํŠธ์—์„œ ์ œ์™ธํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1.3.3 Docker ์ด๋ฏธ์ง€ ์‹คํ–‰ํ•˜๊ธฐ: docker container ๋„์šฐ๊ธฐ

์ค‘์š”ํ•œ ์ : ๋ช…๋ น์„ ์ž…๋ ฅํ•  ๋•Œ, ๋ชจ๋“  ์˜ต์…˜์„ ์„ ์–ธํ•œ ํ›„์— ์ด๋ฏธ์ง€๋ฅผ ์ ์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

$ docker run -dit --name docker_name docker_name:1.0
  • ์œ„ ๋ช…๋ น์€ docker_name:1.0 ์ด๋ฏธ์ง€๋ฅผ docker_name์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์›Œ๋‹ฌ๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์˜ต์…˜ ์ •๋ฆฌ

Option Description
-i
--interactive
์ปจํ…Œ์ด๋„ˆ์˜ ํ‘œ์ค€ ์ž…๋ ฅ(stdin)์„ ํ™œ์„ฑํ™”. (์ฃผ๋กœ -it ํ•จ๊ป˜ ์‚ฌ์šฉ)
-t
--tty
tty(๊ฐ€์ƒ ํ„ฐ๋ฏธ๋„)์„ ํ• ๋‹น.
๋ฆฌ๋ˆ…์Šค์— ํ‚ค๋ณด๋“œ๋ฅผ ํ†ตํ•ด ํ‘œ์ค€ ์ž…๋ ฅ(stdin)์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค. (์ฃผ๋กœ -it ํ•จ๊ป˜ ์‚ฌ์šฉ)
--name ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ง€์ •.
-d
--detach
์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰.
--rm docker run ๋ช…๋ น์–ด๊ฐ€ ๋๋‚˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ ์ž๋™ ์‚ญ์ œ.
-p
--publish
ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐ (ํฌํŠธํฌ์›Œ๋”ฉ).
-p <ํ˜ธ์ŠคํŠธ ํฌํŠธ>:<์ปจํ…Œ์ด๋„ˆ ํฌํŠธ>
ex) -p 80:8888  - ํ˜ธ์ŠคํŠธ์— 8888๋กœ ์ ‘์†ํ•˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ 80ํฌํŠธ๋กœ ์ž๋™ ์ ‘์†.
-v
--volume
ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋””๋ ‰ํ† ๋ฆฌ ์—ฐ๊ฒฐ(๋งˆ์šดํŠธ)
-v <ํ˜ธ์ŠคํŠธ ์ ˆ๋Œ€๊ฒฝ๋กœ>:<์ปจํ…Œ์ด๋„ˆ ์ ˆ๋Œ€๊ฒฝ๋กœ>
ex) -v /Users:/usr. - ์ปจํ…Œ์ด๋„ˆ /usr์— ์ €์žฅํ•˜๋Š” ํŒŒ์ผ์€ ํ˜ธ์ŠคํŠธ์˜ /Users ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅ.
--restart ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ์‹œ, ์žฌ์‹œ์ž‘ ์ •์ฑ… ์„ค์ •
--restart="always" : ํ•ญ์ƒ ์žฌ์‹œ์ž‘
--restart="on-failure" : ์ข…๋ฃŒ ์Šคํ…Œ์ดํ„ฐ์Šค๊ฐ€ 0์ด ์•„๋‹ ๋•Œ ์žฌ์‹œ์ž‘
* --rm ์˜ต์…˜๊ณผ --restart ์˜ต์…˜์€ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
--privileged ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ํ˜ธ์ŠคํŠธ์˜ ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ์‚ฌ์šฉ
  • ์ถ”๊ฐ€ ์˜ต์…˜์ด ๋งŽ๊ฑฐ๋‚˜ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€๋ฅผ ๋„์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, docker compose์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.
  • docker compose์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [Docker] docker compose ์ •๋ฆฌ (feat. docker-compose.yml)๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ, privileged ์„ค์ •์„ ์•ˆํ•ด์ค˜์„œ... ๋ฌธ์ œ ์ƒ๊ธด ์ ์ด ์žˆ์–ด ๊ด€๋ จ ๋‚ด์šฉ์€ [Docker] Privileged Container์— ๋Œ€ํ•˜์—ฌ์— ๋”ฐ๋กœ ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.^^

1.3.4 Docker ๋‚ด๋ถ€ ํŒŒ์ผ ๊ณต์œ ํ•˜๊ธฐ: docker cp๋กœ ๋กœ์ปฌ, ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํŒŒ์ผ ๊ณต์œ 

1) ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋กœ์ปฌ๋กœ ๋ณต์‚ฌ

$ docker cp tmp_container:/root/data/test.md ~/data/

2) ๋กœ์ปฌ์˜ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์œผ๋กœ ๋ณต์‚ฌ

$ docker cp ~/data/test.md tmp_container:/root/data/

 

2. Dockerfile ์ž‘์„ฑํ•˜๊ธฐ

2.1 Dockerfile ์ž‘์„ฑํ•˜๊ธฐ: ์ฃผ์š” ์ง€์‹œ์ž ์†Œ๊ฐœ

Dockerfile ๋‚ด ์ฃผ์š” ์ง€์‹œ์ž๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

FROM ํ•ด๋‹น ๋„์ปค ์ด๋ฏธ์ง€์˜ ๋ฐ”ํƒ•์ด ๋  ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •
WORKDIR ์ด๋ฏธ์ง€ ๋‚ด๋ถ€์—์„œ COPY, RUN, CMD, ENTRYPOINT์˜ ๋ช…๋ น์ด ์‹คํ–‰๋  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •
COPY ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์œผ๋กœ ๋ณต์‚ฌ
ADD ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ COPY์™€ ๋™์ผํ•˜๊ณ , ์••์ถ•์„ ํ‘ธ๋Š” ๋“ฑ ์ถ”๊ฐ€๊ธฐ๋Šฅ์ด ๋” ์žˆ์Šต๋‹ˆ๋‹ค.
VOLUME ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋‚ด์šฉ์„ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ŠคํŠธ์— ์ €์žฅํ•˜๋„๋ก ์„ค์ •
RUN ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ •์˜
CMD ์ด๋ฏธ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆํ™” ๋  ๋•Œ(์‹คํ–‰๋  ๋•Œ)๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ •์˜
EXPOSE ์ด๋ฏธ์ง€์˜ ํ•ด๋‹น ํฌํŠธ๋ฅผ ์™ธ๋ถ€๋กœ ๊ฐœ๋ฐฉ
ENTRYPOINT ENTRYPOINT๋ฅผ ์ž…๋ ฅํ•˜๋ฉด CMD์— ์ „๋‹ฌ๋œ ์ธ์ž๋“ค์€ ์ „๋ถ€ ENTRYPOINT์˜ ์ธ์ž๋กœ ์ „๋‹ฌ
LABEL ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„ ๋“ฑ์„ ๋ช…์‹œ
ENV
๋„์ปค ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •
ARG
์ด๋ฏธ์ง€ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ฅผ ์ •์˜

ํ•˜๋‹จ์˜ 'Dockerfile ์ž‘์„ฑํ•˜๊ธฐ: ์ง€์‹œ์ž ์šฉ๋ก€ ๋ฐ ์ž์„ธํ•œ ์„ค๋ช…'์—์„œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋”์šฑ ์ž์„ธํ•˜๊ฒŒ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2.2 Dockerfile ์ž‘์„ฑํ•˜๊ธฐ: ์ง€์‹œ์ž ์šฉ๋ก€ ๋ฐ ์ž์„ธํ•œ ์„ค๋ช…

FROM

ํ•ด๋‹น ๋„์ปค ์ด๋ฏธ์ง€์˜ ๋ฐ”ํƒ•์ด ๋  ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ž…๋‹ˆ๋‹ค.

FROM centos:centos8

centos๋Š” ์ด๋ฏธ์ง€๋ช…์ด๋ฉฐ, centos8๋Š” ํƒœ๊ทธ๋ช…์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ 
๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(regestry)๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, docker hub์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

WORKDIR

Docker ์ด๋ฏธ์ง€ ๋‚ด๋ถ€์—์„œ COPY, RUN, CMD, ENTRYPOINT์˜ ๋ช…๋ น์ด ์‹คํ–‰๋  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

WORKDIR /workdir

COPY

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์•ˆ์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

COPY . /workdir

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ์ด๋ฏธ์ง€ ๋‚ด๋ถ€ /workdir ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์˜ต์…˜์œผ๋กœ ์ฃผ์–ด ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.).

ADD

ADD pinpoint-agent-1.8.4.tar.gz /workdir

๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ COPY์™€ ๋™์ผํ•˜๊ณ , ์•„๋ž˜์˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋กœ ๋” ์žˆ์Šต๋‹ˆ๋‹ค.

  • source๊ฐ€ remote URL ์ด๋ฉด ๋‹ค์šด๋ฐ›์€ ๋’ค destination ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • source๊ฐ€ ์ž˜ ์•Œ๋ ค์ง„ ์••์ถ•ํŒŒ์ผ ํ˜•์‹์ด๋ฉด(tar, zip ๋“ฑ) ์••์ถ•์„ ํ’€์–ด์ค๋‹ˆ๋‹ค.
  • source๊ฐ€ remote URL + ์••์ถ•ํŒŒ์ผ ํ˜•์‹์ด๋ฉด ์••์ถ•์„ ํ’€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋ž˜๋„ ์œ„์™€ ๊ฐ™์ด ํŠน์ˆ˜ํ•œ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด COPY๋ฅผ ์“ฐ๋Š”๊ฒŒ ๊ฐ€๋…์„ฑ์— ์ข‹์Šต๋‹ˆ๋‹ค.

VOLUME

VOLUME์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋‚ด์šฉ์„ ์ปจํ…Œ์ด๋„ˆ์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํ˜ธ์ŠคํŠธ์— ์ €์žฅํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 

VOLUME ๋ช…๋ น์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์„ ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด? (bind mount)

  • docker run ๋ช…๋ น์—์„œ -v ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜,
    • ex) -v /home/sjchoi/package:/workdir
  • docker-compose.yml ํŒŒ์ผ์— ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ex) volumes: /home/sjchoi/package:/workdir

RUN

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด์ด๋ฉฐ, ์ฃผ๋กœ ํ™˜๊ฒฝ์„ธํŒ…ํ•˜๊ฑฐ๋‚˜ ์„ค์น˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

RUN sudo apt-get update

CMD

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•  ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆํ™” ๋  ๋•Œ(์‹คํ–‰๋  ๋•Œ)๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.
์ฃผ์˜: CMD๋Š” Dockerfile ๋‚ด ํ•˜๋‚˜๋งŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์„ฑ๋ฒ•์ด ์กฐ๊ธˆ ํŠน์ดํ•œ๋ฐ, ์ด 3๊ฐ€์ง€ ์ž‘์„ฑ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

  • CMD command param1 param2 […]
    • FROM ์œผ๋กœ ์„ค์ •ํ•œ ์ด๋ฏธ์ง€์— ํฌํ•จ๋œ ์‰˜ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CMD [“executable”, “param1”, “param2” [, …]]
    • ๋„์ปค์—์„œ ๊ถŒ์žฅํ•˜๋Š” ํ˜•ํƒœ์ด๋ฉฐ, ์‰˜ ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋˜์ ธ์ฃผ๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
    • ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
      • CMD ["echo", "Hello, name"]
        $ Hello, name
    • ๋งŒ์•ฝ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์‰˜์„ ์‹คํ–‰์‹œํ‚ค๋ฉด์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
      • CMD ["/bin/bash", "-c", "echo Hello, $name"]
  • CMD [“param1”, “param2” [, …]]
    • ENTRYPOINT์— ์ง€์ •๋œ ๋ช…๋ น์— ์‚ฌ์šฉํ•  ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

EXPOSE

expose๋Š” ํ˜ธ์ŠคํŠธOS์— ํฌํŠธ๋ฅผ ๊ณต๊ฐœํ•˜์ง€ ์•Š๊ณ , ์ปจํ…Œ์ด๋„ˆ๋งŒ ํฌํŠธ๋ฅผ ๊ณต๊ฐœ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธOS์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๊ณ  ๋งํฌ ๋“ฑ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ปจํ…Œ์ด๋„ˆ-์ปจํ…Œ์ด๋„ˆ๊ฐ„์˜ ํ†ต์‹ ๋งŒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋“ฑ์— ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก , EXPOSE๋กœ ์ง€์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ํ•ด๋‹น ํฌํŠธ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•ด๋‹น ํฌํŠธ๋ฅผ ๋งคํ•‘(ํฌํŠธํฌ์›Œ๋”ฉ)์‹œ์ผœ์•ผ ํ•œ๋‹ค.

EXPOSE 3000 4000

ENTRYPOINT

CMD์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‹คํ–‰๋  ํ”„๋กœ์„ธ์Šค(๋ช…๋ น)๋ฅผ ์ง€์ •ํ•˜๋Š” ์ธ์ŠคํŠธ๋Ÿญ์…˜์ž…๋‹ˆ๋‹ค.
ENTRYPOINT๋ฅผ ์ž…๋ ฅํ•˜๋ฉด CMD์— ์ „๋‹ฌ๋œ ์ธ์ž๋“ค์€ ์ „๋ถ€ ENTRYPOINT์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์˜ ์šฉ๋„๋ฅผ ์–ด๋А์ •๋„ ์ œํ•œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FROM golang:1.10

ENTRYPOINT ["go"]
CMD [""]

ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ž…๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด์˜ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ go ๊ฐ€ ์ž…๋ ฅ๋œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ go ์ดํ›„์˜ ๋ช…๋ น์–ด๋งŒ ์ธ์ž๋กœ ๋„˜๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ docker container run gotest:latest version
$ go version go1.10.3 linux/amd64 # ์ถœ๋ ฅ

LABEL

์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ์ด๋ฆ„ ๋“ฑ์„ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

LABEL email="dhslrl321@gmial.com"
LABEL name="jang"
LABEL version="1.0"
LABEL description="My Spring Application?"
  • ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” MAINTAINER ๋ช…๋ น์–ด์˜ ๊ฒฝ์šฐ, ์ด์ œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(deprecated).

ENV

๋„์ปค ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

ENV WORKPATH=/home/workdir

ARG

์ด๋ฏธ์ง€ ๋นŒ๋“œํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
๋”ฐ๋ผ์„œ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์‹œ์— ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ARG classpath=.
ENV CLASSPATH=${classpath}

CMD ["java", "Main"]

์™ธ๋ถ€์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›์„์ˆ˜๋„ ์žˆ๋‹ค
--build-arg๋ฅผ ํ†ตํ•ด ์ธ์ž๋ฅผ ์ „๋‹ฌํ•œ๋‹ค

$ docker image build --build-arg classpath=/workapce/javatest -t javatest:latest .โ€‹

 

3. Dockerfile ๊ณต์œ ํ•˜๊ธฐ

3.1 Dockerfile ๊ณต์œ ํ•˜๊ธฐ: docker hub

์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋„์ปค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋„์ปค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์ด ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด docker hub์ž…๋‹ˆ๋‹ค. https://hub.docker.com ์‚ฌ์ดํŠธ์— ๊ฐ€์ž…ํ•˜๋ฉด ๋„์ปค ํ—ˆ๋ธŒ์— ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•ด์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.1.1 Dockerfile ์ถ”๊ฐ€ tag ์ƒ์„ฑํ•˜๊ธฐ

 ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€์— <docker hub ๊ณ„์ •>/<๋ฆฌํฌ์ง€ํ† ๋ฆฌ์ด๋ฆ„>:<ํƒœ๊ทธ> ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ํƒœ๊ทธ๋ฅผ ๋ถ™์ž…๋‹ˆ๋‹ค. 

$ docker tag docker_name:1.0 DrawingProcess/test:1.0

์œ„์˜ ๋ช…๋ น์–ด๋Š” docker_name:1.0 ์ด๋ฏธ์ง€๋ฅผ DrawingProcess ๊ณ„์ • test ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— 1.0 ๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ฆฌ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

3.1.2 docker hub ๋กœ๊ทธ์ธํ•˜๊ธฐ

docker login ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„์ปค ํ—ˆ๋ธŒ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. ...
Username: DrawingProcess
Password:
...

3.1.3 docker hub ์— ์ด๋ฏธ์ง€ push ํ•˜๊ธฐ

๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด docker push๋กœ ์ด๋ฏธ์ง€๋ฅผ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.

$ docker push DrawingProcess/test:1.0

3.1.4 docker hub ์— ์˜ฌ๋ฆฐ ์ด๋ฏธ์ง€ ์‚ฌ์šฉํ•˜๊ธฐ

ํ‘ธ์‹œ๊ฐ€ ๋๋‚˜๋ฉด ๋„์ปค ํ—ˆ๋ธŒ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 docker run -d --rm -p 5000:5000 DrawingProcess/docker_name:1.0

3.2 Dockerfile ๊ณต์œ ํ•˜๊ธฐ: Docker ์ด๋ฏธ์ง€ ์••์ถ•ํ•˜๊ธฐ

ํ˜„์žฌ ๋„์›Œ๋‘” ์ด๋ฏธ์ง€๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

docker save -o package.tar.gz package:latest

3.3 Dockerfile ๊ณต์œ ํ•˜๊ธฐ: Docker ์ปจํ…Œ์ด๋„ˆ ์••์ถ•ํ•˜๊ธฐ

ํ˜„์žฌ ๋„์›Œ๋‘” ์ปจํ…Œ์ด๋„ˆ ์ž์ฒด๋ฅผ ์••์ถ•ํ•ฉ๋‹ˆ๋‹ค.

docker export <container_name> > map.tar.gz

 

์ฐธ๊ณ 

 

๋ฐ˜์‘ํ˜•