๐ ํด๋น ํฌ์คํ ์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์ ๋๋ค. ํฌ์คํ ์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ๋์ปค ์ด๋ฏธ์ง์ ๋ํด ์์๋ณด๊ณ , ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃจ์ด๋ณด๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐ ํ์ฉ๋๋ Dockerfile์ ๋ํด์๋ ๋ฐฐ์๋ณด์. ์ฐธ๊ณ ๋ก Dockerfile์ ๋ํด์๋ ์๊ฒ๋๋ง ์ํ์ฝ๋ฉ ๊ฐ์๋ฅผ ํตํด ๋ฐฐ์ด์ ์ด ์์๋ค. Dockerfile์ด ๋ฌด์์ธ์ง์ ๋ํด ๋ชจ๋ฅธ๋ค๋ฉด ๊ฐ๋จํ ์ด์ ํฌ์คํ ์ ์ฝ๊ณ ์ค๋ ๊ฒ๋ ์ข์ ๋ฏ ํ๋ค.
1. ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์, docker commit
๋ฆฌ๋ ์ค ๋ฐฐํฌํ ์ค Ubuntu๋ ํจํค์ง๋ฅผ apt ๋ ํฌ์งํ ๋ฆฌ์์, CentOS๋ ํจํค์ง๋ฅผ yum ๋ ํฌ์งํ ๋ฆฌ์์ ์ค์นํ๋ ๊ฒ์ฒ๋ผ, ๋ Python์ ํจํค์ง๋ pypi ๋ผ๋ ๋ ํฌ์งํ ๋ฆฌ ๋๋ anaconda ๋ ํฌ์งํ ๋ฆฌ๋ก๋ถํฐ ์ค์นํ๋ ๊ฒ์ฒ๋ผ ๋์ปค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ค์น๋ฐ์ ์ ์๋ ๋ ํฌ์งํ ๋ฆฌ๊ฐ ์กด์ฌํ๋ค. ๊ทธ๊ฒ์ ๋ฐ๋ก Docker Hub์ด๋ค. ์ด์ ํฌ์คํ ์์ ์ ์ ๋ค๋ฃจ๊ธด ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๋ณต์ต์ฐจ ๋ค์ ๋ฐฐ์๋ณด๋๋ก ํ์.
๋์ปค ํ๋ธ๋ ๋๊ตฌ๋ ์ง ์์ ๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ ์ฌ๋ฆด ์ ์๋ค. ๊ทธ๋์ ๋จ์ด ์ฌ๋ฆฐ ์ด๋ฏธ์ง๋ฅผ ์์ฝ๊ฒ ๋ค์ด๋ฐ์ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ๊ณต์(Official) ๋ผ๋ฒจ์ด ์๋ ์ด๋ฏธ์ง๋ ์ฌ์ฉ๋ฒ์ ์ฐพ์ ์ ์๊ฑฐ๋ ์ ๋๋ก ๋์ํ์ง ์์ ์ ์๋ค. ๋์ปค ํ๋ธ์ ์ด๋ค ์ด๋ฏธ์ง๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํด์๋ Docker Hub ์ฌ์ดํธ์ ๊ฐ์ ๊ฒ์ํ ์๋ ์์ง๋ง ๋์ปค ์์ง์์๋ docker search ๊ด๋ จ ๋ช ๋ น๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. ์ฐธ๊ณ ๋ก search ๊ด๋ จ ๋ช ๋ น์ด๋ ์ด์ ์ ๋ฆฌ๋ ์ค์์ yum, apt์์๋ search ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์์ฑํด๋ณด์. ๋์ปค ์ด๋ฏธ์ง๋ง์ ๋ค์ด๋ก๋ ๋ฐ๋ ๊ฒ์ docker pull ๋ช ๋ น์ด๋ก ๋ด๋ ค๋ฐ์ ์ ์๋ค. ํ์ง๋ง ์ด๊ฒ์ ๋จ์ง ์ ๋ง '์ด๋ฏธ์ง ๋ง์ ๋ค์ด๋ก๋'๋ฐ๋ ๊ฒ๋ง ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ณดํต ๋์ปค๋ก ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ์๋ ๋ง๋ ์ปจํ ์ด๋์ ๋ด๊ฐ ์ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ํ, ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ํํ๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์๋ docker run ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ฐ๋ถํฌ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๊ณ ๊ทธ ์ด๋ฏธ์ง๋ก๋ถํฐ ๋๋ง์ ์ปจํ ์ด๋๋ฅผ ์ฑ์ํด๋ณด๋๋กํ์. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ปจํ ์ด๋ ์์ผ๋ก ๋ค์ด๊ฐ์ zedd.txt ๋ผ๋ ํ์ผ์ ํ๋ ์์ฑํ ๋ค, ๋ค์ ํธ์คํธ๋ก ๋น ์ ธ๋์๋ณด์.
$ docker run -it --name create_container ubuntu:20.04
# echo "Hello zedd" >> /zedd.txt
# exit
์ด์ ํธ์คํธ๋ก ๋์๋ค๋ฉด ์์์ ๋ง๋ create_container ๋ผ๋ ์ด๋ฆ์ ๋๋ง์ ์ปจํ ์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด๋ณด์. ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ docker commit ๋ช ๋ น์ด์ด๋ค. commit ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด ํ์์ ๊ฐ๋๋ค.
$ docker commit [OPIONS] CONTAINER [REPOSITORY[:TAG]]
์์์ [REPOSITORY:[TAG]] ๋ผ๋ ๊ฒ์ ์ด์ ํฌ์คํ [2-1.๋ชฉ์ฐจ] ์์ ๋ฐฐ์ด์ ์ด ์์ผ๋ฏ๋ก ์ค๋ช ์ ์๋ตํ๊ฒ ๋ค. commit์ OPTIONS ์ข ๋ฅ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๊ธด ํ์ง๋ง, ์ฌ๊ธฐ์๋ -a์ -m ์ต์ ๋ง ์์๋ณด์. -a๋ ํด๋น ์ปจํ ์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ์ฆ, ์ ์(author)๊ฐ ๋๊ตฌ์ธ์ง ํ์๋ฅผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ -m ์ git์ ์ฌ์ฉํ ๋ ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์ฒจ์ธํ๋ ๊ฒ์ฒ๋ผ, ๋์ปค commit ์์๋ ๋ฉ์ธ์ง๋ฅผ ๋จ๊ธธ ์ ์๋ ์ต์ ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํธ์คํธ์์ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด zedd_image๋ผ๋ ์ด๋ฆ์ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด๋ณด์.
$ docker commit \
-a "zedd" \
-m "create zedd's own image" \
create_container \
zedd_image:v1
๊ทธ๋ฆฌ๊ณ ์์ฑํ ์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ถ๋ ฅํด๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋๋ง์ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์์์ ์ ์ ์๋ค.
2. ๋์ปค ์ด๋ฏธ์ง ๊ตฌ์กฐ ํํค์น๊ธฐ
๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํด์๋ ๋ด๊ฐ ์์ฑํ ๋์ปค ์ด๋ฏธ์ง๊ฐ ์ด๋ค ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์๋์ง ์ดํดํ ํ์๊ฐ ์๋ค. ์ฐ์ ์ผ์ข ์ ํ๊ฒฝ ์ธํ ์ด ํ์ํ๋ค. ์์์ ๋ง๋ zedd_image:v1 ์ด๋ผ๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค๊ณ , ์ด ์ปจํ ์ด๋์ ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ํ ๋๋ง์ ๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด๋ณด์. ์ด๋ฏธ์ง ์ด๋ฆ์ zedd_image:v2๋ก ์์ฑํ๊ฒ ๋ค. 1๋ฒ ๋ชฉ์ฐจ์ ๋ช ๋ น์ด์ ์ด์ด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์.
$ docker run -it --name create_container_v2 zedd_image:v1
# echo "Hello zedd 2" >> /zedd_v2.txt
# exit
$ docker commit \
-a "zedd" \
-m "create zedd's own second image" \
create_container_v2 \
zedd_image:v2
๊ทธ๋ฆฌ๊ณ ๋์ปค ์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ฉด ์๋์ฒ๋ผ 3๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ๋ค.
๊ทธ๋ฌ๋ฉด ์ 3๊ฐ์ ์ด๋ฏธ์ง์ ๋ํ ๋ฉํ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ docker inspect ๋ช ๋ น์ด๋ก ํ์ธํค๋ณด์. ๋ฉํ์ ๋ณด๋ ์ฌ๋ฌ๊ฐ๊ฐ ์์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ์ค์์ Layers์ ๋ํ ๋ถ๋ถ๋ง ๋ณด๊ณ ์ถ๋ค.(์ฐธ๊ณ ๋ก ์ด๋ฏธ์ง๋ Layer๋ค๋ก ๊ตฌ์ฑ๋จ) ์๋์ Layer๋ค์ ๊ตฌ์ฒด์ ์ธ ํด์ฌ๊ฐ์ ์ค์ต์ ๋ฐ๋ผ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์์์ ์์๋์.
์ Layers ๋ฉํ ์ ๋ณด๋ฅผ ๋น๊ตํด๋ณด์. ์ด์ ์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ ๋์ปค ์ด๋ฏธ์ง๋ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฐ๋๋ฉฐ ์ปจํ ์ด๋์์ ๋ณ๊ฒฝ๋ ์ฌํญ๋ง ๋ณ๋๋ก ์ ์ฅํ๋ค๊ณ ํ๋ค. ๊ทธ ์๋ฏธ๋ฅผ ์ฌ๊ธฐ์๋ ํ์ธํ ์ ์๋ค. ubuntu:14.04์์ ๊ฐ๊ณ ์๋ 3๊ฐ์ Layer ์ ๋ณด๋ zedd_image:v1 ์ Layer ์ค 3๊ฐ๋ฅผ ์ฐจ์งํ๊ณ ์์์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง 1๊ฐ Layer(๋ ธ๋์ ์ )๊ฐ ์ถ๊ฐ๋์๋๋ฐ, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ zedd_image:v1 ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ ํ์ฉํ๋ ์ปจํ ์ด๋์๋ค๊ฐ zedd.txt ๋ผ๋ ํ์ผ์ ํ๋ ์์ฑํ๋ ๊ฒ(๋ณ๊ฒฝ ์ฌํญ)์ ๋ํ Layer์ด๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก zedd_image:v2 ์ด๋ฏธ์ง๋ zedd_image:v1 ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์ปจํ ์ด๋๋ก๋ถํฐ ๋ง๋ค์ด์ง ๊ฒ์ด๋ฏ๋ก ์ด๋ฒ์ ๊ณตํต์ ์ผ๋ก 4๊ฐ์ Layer ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ zedd_2.txt ๋ผ๋ ํ์ผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ ์ Layer๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ฐธ๊ณ ๋ก ์์ ๊ฐ์ด inspect ๋ช ๋ น์ด๊ฐ ์๋ history ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์๋ ๋์ปค ์ด๋ฏธ์ง์ ๊ตฌ์กฐ๋ฅผ ์์๋ณผ ์ ์๋ค.
๋์ปค ์ด๋ฏธ์ง ๊ตฌ์กฐ์์ ํ ๊ฐ์ง ๋ ์์๋ณผ ์๋ฆฌ๊ฐ ์๋ค. ์ด๋ ์์ฑํ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ฉด์ ์ดํดํด๋ณผ ์ ์๋ค. ์ฐ์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๊ธฐ ์ํด์๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด์ฉ๋๊ณ ์๋ ์ปจํ ์ด๋๋ค์ ๋ชจ๋ ๋ฉ์ถ๊ณ ์ญ์ ์์ผ์ผ ํ๋ค. ๋ฌผ๋ก docker rm -f ์ต์ ์ ์ฃผ์ด ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ๋ก ์ญ์ ํ ์๋ ์์ง๋ง, ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ด์ด ํ์ผ์ ์ค์ ๋ก ์ญ์ ์ํค๋ ๊ฒ์ด ์๋ ๋จ์ํ '์ด๋ฏธ์ง ์ด๋ฆ๋ง' ์ญ์ ํ๊ธฐ ๋๋ฌธ์ ์ค์ง์ ์ธ ์ญ์ ๋ฅผ ์ํํ์ง๋ ์๋๋ค. ์ฐธ๊ณ ๋ก docker rm -f ์ต์ ์ ๋ฃ์ด ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ฉด ์ด๋ฏธ์ง ์ด๋ฆ์ด ์ญ์ ๋์ด ์ด๋ฏธ์ง ์ด๋ฆ์ด <none> ์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. ์ด๋ฌํ ์ด๋ฏธ์ง๋ค์ ๋๊ธ๋ง(dangling) ์ด๋ฏธ์ง๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ง์ฝ ๋๊ธ๋ง ์ด๋ฏธ์ง๋ง์ ์ถ๋ ฅํด ๋ณด๊ณ ์ถ๋ค๋ฉด docker images -f dangling=true ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์ 3๊ฐ์ง ์ด๋ฏธ์ง ์ค zedd_image:v1 ์ด๋ผ๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ์์ผ๋ณด์. zedd_image:v1 ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๊ธฐ ์ํด์๋ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์๊ฐ๊ณ ์๋ create_container_v2 ๋ผ๋ ์ปจํ ์ด๋๋ฅผ ๋จผ์ ์ญ์ ์์ผ์ผ ํ๋ค.
$ docker rm create_contaeinr_v2
$ docker rmi zedd_image:v1
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด "Untagged: ... " ๋ผ๋ ๋ฉ์ธ์ง๋ง ๋ฐ์ํ ๊ฒ์ ์ ์ ์๋ค.
์ด ๋ฉ์ธ์ง๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ด๋ฏธ์ง์ ์ค์ ๋ ์ด์ด ํ์ผ์ด ์ญ์ ๋์ง๋ ์์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์๋ํ๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ชจ๋ก ํ๊ณ ์๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ ํ์ฌ ์กด์ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ ์์์์๋ ํ์ฌ zedd_image:v2๊ฐ zedd_image:v1 ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ชจ๋ก ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด๋ฏธ์ง์ ๋ถ์ฌ๋ ์ด๋ฆ๋ง ์ญ์ ํ๋ค๋ ๋ป์ด๋ค.
๊ทธ๋ฌ๋ฉด ๋ค์์ผ๋ก zedd_image:v2 ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํด๋ณด์. ํ์ฌ zedd_image:v2 ๋ฅผ ๋ถ๋ชจ๋ก ํ๋ ๋ณ๋์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด zedd_image:v1 ๋์๋ ๋ค๋ฅธ ์ถ๋ ฅ ๋ฉ์ธ์ง๊ฐ ํ์๋๋ ๊ฒ์ ์ ์ ์๋ค.
์์ฒ๋ผ "Deleted ..." ๋ผ๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉด ํด๋น ์ด๋ฏธ์ง์ ๋ ์ด์ด ํ์ผ์ด ์ค์ ๋ก ์ญ์ ๋์์์ ์๋ฏธํ๋ค. ์ ๊ฒฐ๊ณผ์ ๊ฐ์ฅ ์ฒซ๋ฒ์จฐ "Deleted.." ์ ์๋ ํด์ฌ๊ฐ ID๋ zedd_image:v2๋ฅผ ๊ฐ๋ฆฌํค๋ ID๊ฐ์ด๋ฉฐ, ๊ทธ ๋ฐ์ 3๊ฐ์ ํด์ฌ๊ฐ๋ค์ ํด๋น ์ด๋ฏธ์ง์ ์ค์ ๋ ์ด์ด ํ์ผ์ ๊ฐ๋ฆฌํค๋ ID๋ค์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ด ์๋ค. ์ด๋ฒ์ ์ญ์ ํ zedd_image:v2 ๋ผ๋ ์ด๋ฏธ์ง๋ ์ด์จ๊ฑด ๊ฐ์ฅ ์์ ๋ถ๋ชจ๋ ubuntu:14.04 ๋ผ๋ ์ด๋ฏธ์ง์ด๋ค. ๊ทธ๋ฐ๋ฐ zedd_image:v2 ๋ผ๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ์์๋ ubuntu:14.04 ์ด๋ฏธ์ง๋ ์ญ์ ๋์ง ์์๋ค. ์๋ํ๋ฉด ์ญ์ ํ๋ zedd_image:v2 ๋ผ๋ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ ๋ ํจ๊ป ์ญ์ ๋๋ ๋ฒ์์ ubuntu:14.04 ์ด๋ฏธ์ง๋ ํฌํจ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ข ํท๊ฐ๋ฆด ์๋ ์๋๋ฐ, ํน์ ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ๋ ค๋ฉด ์๋์ ๊ฐ์ด 2๊ฐ์ง๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค! (https://github.com/alicek106/start-docker-kubernetes/issues/15)
3. ๋์ปค ์ด๋ฏธ์ง๋ ํ์ผ์ฒ๋ผ ์ถ์ถํ๊ณ ๋ก๋ํ์
๋์ปค ์ด๋ฏธ์ง๋ฅผ ๊ตฌ์ฑํ๋ ๋ ์ด์ด๋ค๋ ์ค์ง์ ์ผ๋ก๋ ํ์ผ ํํ๋ก ๋์ด ์๋ค. ๋ฐ๋ผ์ ๋ณ๋๋ก ์ ์ฅํ๊ฑฐ๋ ์ฎ๊ธฐ๊ธฐ ์ํด ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋จ์ผ ๋ฐ์ด๋๋ฆฌ ํ์ผ ํํ๋ก ์ ์ฅํ ์๋ ์๋ค. docker save ๋ช ๋ น์ด๋ฅผ ํ์ฉํ๋ฉด ์ปจํ ์ด๋์ ์ปค๋งจ๋, ์ด๋ฏธ์ง ์ด๋ฆ๊ณผ ํ๊ทธ ๋ฑ ์ด๋ฏธ์ง์ ๋ชจ๋ ๋ฉํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ํ๋์ ํ์ผ๋ก ์ถ์ถ์ด ๊ฐ๋ฅํ๋ค. -o ์ต์ ์๋ ์ถ์ถํ์ฌ ๋ง๋ค ํ์ผ ์ด๋ฆ์ ๋ช ์ํด์ฃผ๋ฉด ๋๋ค.
$ docker save -o [์ด๋ฏธ์ง ์ถ์ถ ํ์ผ ์ด๋ฆ] [IMAGE]
์ด๋ ๊ฒ ํ์ผ๋ก ์ถ์ถํ ๋ค, load ๋ช ๋ น์ด๋ก ๋์ปค์ ๋ค์ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ ์ ์๋ค. -i ์ต์ ๋ค์ ์ถ์ถํ ํ์ผ ์ด๋ฆ์ ๋ช ์ํด์ฃผ๋ฉด ๋๋ค.
$ docker load -i saved_image.tar
save, load ๋ช ๋ น์ด์ ์ ์ฌํ ๋์์ ํ๋ ๋ช ๋ น์ด๋ก, export, import ๋ช ๋ น์ด๋ ์กด์ฌํ๋ค. ํ์ง๋ง ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค. ์ฐ์ export ๋ช ๋ น์ด๋ ์ปจํ ์ด๋์ ๋ํด ์ํํด์ผ ํ๋ค. ์๋ํ๋ฉด export๋ ์ปจํ ์ด๋์ ๋ํ ๋ฉํ ์ ๋ณด๋ค์ ๋ชจ๋ ํฌํจํด์ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ ๋จ์ง ์ปจํ ์ด๋์ ํ์ผ์์คํ ์ tar ํ์ผ๋ก ์ถ์ถํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ํ์ผ ์์คํ ์ ์ด๋ฏธ์ง๊ฐ ์๋ ์ปจํ ์ด๋ ์ํ์์๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ export ๋ช ๋ น์ด๋ฅผ ์ปจํ ์ด๋์ ๋ํด์ ์ํํด์ผ ํ๋ค๊ณ ํ ๊ฒ์ด๋ค. ์ด์ ๋ฐ๋๋ก import ๋ช ๋ น์ด๋ฅผ ํตํด export๋ก ์ถ์ถํ tar ํ์ผ์ ๋ก๋ํ ์ ์๋ค. ๋จ, import๋ก ๋ก๋ํ๊ณ ๋ ๋ค์๋ ํด๋น tar ํ์ผ์ด ์ปจํ ์ด๋๊ฐ ์๋ ์ด๋ฏธ์ง ํํ๋ก ๋ง๋ค์ด์ง์ ์์๋์.(์ฌ์ค ์ปจํ ์ด๋ ์ํ๋ก ๋ง๋ค์ด์ง ์๊ฐ ์์)
$ docker export -o container.tar [CONTAINER]
$ docker import container.tar [์์ฑํ IMAGE ์ด๋ฆ]
ํ์ง๋ง ์ด๋ ๊ฒ ์ด๋ฏธ์ง ๋๋ ์ปจํ ์ด๋๋ฅผ ๋จ์ผ ํ์ผ๋ก ์ ์ฅํ๋ ๊ฒ์ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋๋ค. ์๋ํ๋ฉด ์ถ์ถ๋ ์ด๋ฏธ์ง๋ ๋ ์ด์ด ๋จ์๋ก ํ์ผ์ด ๊ตฌ์ฑ๋์ด ์๋ ๊ฒ์ด ์๋ ๋จ์ผ ํ์ผ ํํ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ด๋ฏธ์ง ์ฉ๋์ ๊ฐ๊ธฐ ์ฐจ์งํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด 3๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ๊ณ , ๊ฐ๊ฐ์ ํ์ผ ํํ๋ก ์ถ์ถํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ 3๊ฐ์ ์ด๋ฏธ์ง๋ ๊ณตํต์ ์ผ๋ก Ubuntu:14.04 ์ด๋ฏธ์ง๋ฅผ ๋ชจ๋ ํ๋์ ๋ถ๋ชจ๋ก ์ผ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ณตํต์ ์ธ ๋ ์ด์ด๊ฐ ์กด์ฌํ๋ค. ์ฌ๊ธฐ์ ๋ง์ฝ 3๊ฐ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๊ฐ ํ์ผ ํํ๋ก ์ถ์ถํ๊ฒ ๋๋ฉด ๊ณตํต์ ์ธ ๋ ์ด์ด์ ์ฉ๋์ด 3๊ฐ์ฉ ์ค๋ณต๋์ ์ถ์ถ๋๋ฏ๋ก ํ์ผ ์ฉ๋ ์ธก๋ฉด์์ ๋นํจ์จ์ ์์ ์ ์ ์๋ค.
4. ๋๋ง์ ์ด๋ฏธ์ง ๋ฐฐํฌํด๋ณด๊ธฐ
์ด๋ฒ ๋ชฉ์ฐจ์์๋ ๋ด๊ฐ ์์ฑํ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฅธ ์ฌ๋๋ค๋ ๊ฐ๋ค ์ฌ์ฉํ ์ ์๋๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์. ๋ฐ๋ก ์ง์ ๋ชฉ์ฐจ์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ๊ฐ์ธ์ด ๋ง๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ํ์ผ ํํ๋ก ์ถ์ถํ์ฌ ๋ด๊ฐ ๊ณต์ ํ๊ณ ์ถ์ ์ฌ๋๋ค์๊ฒ ์ ์กํ๊ฑฐ๋ ํ ์๋ ์๊ฒ ์ง๋ง, ์ ์กํด์ผ ํ ์๋๋ฐฉ ์๊ฐ ๋ง์์ง๊ฑฐ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๊ฒ ๋๋ค. ์ด๋ฅผ ์์ฝ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด ์์ค์ฝ๋๋ฅผ ๋ฌด๋ฃ๋ก Github, Gitlab ํ๋ซํผ์ ์ฌ๋ ค๋๊ณ ๊ณต์ ํ๋ ๊ฒ์ฒ๋ผ ๋์ปค๋ ๊ทธ๋ฌํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก, ๋์ปค์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํ๋ ์ด๋ฏธ์ง ์ ์ฅ์์ธ Docker Hub๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ์ด์ ๋ํด์๋ ์ด์ ์ ๊ฐ๋จํ๊ฒ ๋ฐฐ์๋ณธ ์ ์ด ์๋ค. ๋์ปค ํ๋ธ๋ ๊ณ์ ๊ฐ์ ์ด ๋ฌด๋ฃ์ด๋ฉฐ Publicํ ๋ ํฌ์งํ ๋ฆฌ๋ ๋ฌด๋ฃ๋ก ๋ฌด์ ํ์ผ๋ก ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋จ, Privateํ ๋ ํฌ์งํ ๋ฆฌ๋ ๊ณ์ ๋น 1๊ฐ๊น์ง ๋ฌด๋ฃ๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ทธ ์ด์์ Private ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค๋ ค๊ณ ํ๋ค๋ฉด ์ ๋น ์์ ์ ๊ตฌ๋ ๋ฃ๋ฅผ ๋ด์ผ ํ๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋์ปค ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ(Docker Private Registry)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ฆ, ๊ฐ์ธ์ด Docker Hub์ ๊ฐ์ ์ด๋ฏธ์ง ์ ์ฅ์๋ฅผ ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ๋ง๋ค ์ ์๋ค. ๋ค๋ง, ์ด๋ด ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ง์ ์ด๋ฏธ์ง ์ ์ฅ์๋ก ์ด์ํ ์๋ฒ, ์ ์ฅ ๊ณต๊ฐ, API ๋ฑ๊ณผ ๊ฐ์ ๊ฒ์ ๋ชจ๋ ๊ด๋ฆฌํด์ผ ํ๋ค.
๋ง์ฝ ๊ฐ์ธ์ด๋ ์กฐ๊ทธ๋งํ ํ ๋จ์(์ฌ์ด๋ ํ๋ก์ ํธ ๋จ์)๋ก ๊ฐ๋ฐ์ ์งํํ๋ค๋ฉด Docker Hub๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ๋์ ์ ์๋ค. ๋ค๋ง, ํ์ฌ์ ๋ด๋ถ๋ง๊ณผ ๊ฐ์ ๊ณณ์์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํด์ผ ํ๋ค๋ฉด ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ๋์ปค ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์์ฒด ๊ตฌ์ถํ์ฌ ์ด์ํ๋ ๊ฒ์ด ๋ ์ข์ ๋ฐฉ์์ด ๋ ์ ์๋ค. ์ค์ ๋ก, ๊ตฌ๊ธ์ด ์ด์ํ๋ GCP์์๋ gcr.io ๋ผ๋ ์ ๋์ด๋ก ์ด์ํ๊ณ ์๋ Container Registry ํ๋ก๋ํธ๊ฐ ์๊ณ , Github์์๋ ghcr.io ๋ผ๋ ์ ๋์ด๋ฅผ ์ฌ์ฉํด์ ์ผ์ข ์ ์ปจํ ์ด๋ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ด์ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ๊ตญ์ ์นด์นด์ค์์๋ D2hub ์ด๋ผ๋ ์ด๋ฆ์ ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ค์ ๋ก ์ด์ํ๊ณ ์๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ Docker Hub์ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ํ๊ณ ํ์ธํด๋ณด๋๋ก ํ์. ์ฐ์ Docker Hub ๊ณ์ ์ด ์๋ค๋ฉด ๊ฐ์ ํด์ ๊ณ์ ์ ์์ฑํ๋ค. ์ด ๋, ๊ฐ์ ํ ๋ ๋ช ์ํ๋ username์ ์ถํ์ ๋ด๊ฐ ๋ง๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ํ ๋ ๋ช ์ํ๋ Repository ์ด๋ฆ์ ๊ฐ์ด ๋ช ์ํด์ฃผ์ด์ผ ํ๋ฏ๋ก ๊ธฐ์ตํด๋์. ๊ทธ๋ฆฌ๊ณ Publicํ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํ๋ ์๋์ฒ๋ผ ์์ฑํด๋ณด์. ์ด ๋ ๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ์ ๋ด๊ฐ ๋ง๋ค ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ๋์ผ ํ๋ค. ํ์๋ ์๋์ ๊ฐ์ด ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค. username์ jo181 ์ด๊ณ , ๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ์ zedd์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ VM์ ์ฐ๋ถํฌ์์ ubuntu:14.04๋ฅผ ์ด๋ฏธ์ง๋ก ํ๋ ๋๋ง์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋ค, ๋๋ฏธ ํ์ผ์ ํ๋ ๋ง๋ค๊ณ ๋๋ง์ ์ด๋ฏธ์ง๋ก์ ๋ง๋ค์ด๋ณด์. ๋๋ง์ ์ด๋ฏธ์ง ์ด๋ฆ์ ์๋์ ๊ฐ์ ๊ท์น์ ๋ฐ๋์ ๋ฐ๋ผ์ผ ํ๋ค.(๊ท์น์ ์ฌ์ฉ๋ Repository, Image ์ด๋ฆ์ ํ์ ๋์ปค ๊ณ์ ์ ๋ง์ถฐ์ ์์ฑํจ)
$ docker run -it --name zedd_container ubuntu:14.04
# echo "Hello Zedd!" >> zedd.txt
# exit
$ docker commit \
-a "zedd" \
-m "my own image for pushing to Docker Hub" \
zedd_container \
docker.io/jo181/zedd:v1
ํน์๋ผ๋ ์์์ commit์ ํ ๋, ์ด๋ฏธ์ง ์ด๋ฆ ๊ท์น์ ์ง์ผฐ์ด์ผ ํ๋๋ฐ, ์๋ชปํด์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ค๋ฉด docker tag ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง์ ์ด๋ฆ์ ์ถ๊ฐํ ์ ์๋ค.(์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋ ์ด๋ฆ์ ์ถ๊ฐํ๋ ๊ฒ)
$ docker tag [๊ธฐ์กด ์ด๋ฏธ์ง ์ด๋ฆ] [์๋ก ์ถ๊ฐํ ์ด๋ฏธ์ง ์ด๋ฆ]
์ด์ ๋ค์ ์์๋ ๋์ปค ํ๋ธ์ ๋ก๊ทธ์ธ์ ํ๋ฉด ๋๋ค. docker login [DNS ๋๋ IP ์ฃผ์] ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋๋ฐ, DNS ๋๋ IP ์ฃผ์๋ฅผ ์๋ตํ๋ฉด ๋ํดํธ๋ก ๋์ปค ํ๋ธ์ ๋ก๊ทธ์ธ์ ์๋ํ๋ค. ์ฐธ๊ณ ๋ก ๋์ปค ์์ง์์ ๋ก๊ทธ์ธํ ์ ๋ณด๋ ํธ์คํธ์ ํ์ผ ์์คํ ์ ์๋ ๊ฒฝ๋ก์ ์๋ json ํ์ผ์ ์ ์ฅ์ด ๋๋ค.
/ํธ์คํธ ๊ณ์ ๋ช
/.docker/config.json
ํ์๋ ์๋์ ๊ฐ์ด ๋ก๊ทธ์ธ์ด ์ฑ๊ณต๋์์์ ์ ์ ์์ผ๋ฉฐ ํธ์คํธ์ root ๊ณ์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์, ์๋ ๋ ธ๋์ ๋ค๋ชจ์นธ ๊ฒฝ๋ก์ ๋์ปค ํ๋ธ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋์์์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ push ๋ช ๋ น์ด๋ก ๋์ปค ํ๋ธ์ ๋ด ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋์์ผ๋ณด๋๋ก ํ์. push ๋ช ๋ น์ด๋ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์ ๋์ปค ํ๋ธ์์์ username๊ณผ ๋ ํฌ์งํ ๋ฆฌ ์ด๋ฆ์ ๋ฐ๋์ ๋ช ์ํด์ฃผ์ด์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ณณ์ ์ด๋ฏธ์ง๋ฅผ ์ ์ ๋ก๋ํ ์ ์๊ฒ ๋๋ค.
$ docker push [REPOSITORY[:TAG]]
๊ทธ๋ฐ๋ฐ ํน์ดํ ์ ์ด ์๋ค. ์ ์ถ๋ ฅํ๋ฉด์ ๋ณด์ํ๋ ํด์ฌ๊ฐ์ผ๋ก ํ์๋ ๋ ์ด์ด๋ค 4๊ฐ์ค ๋งจ ์๋จ์ 1๊ฐ ๋ ์ด์ด๋ง ์ ์ธํ๊ณ ๋๋จธ์ง๋ Ubuntu ๋ก๋ถํฐ ๋ง์ดํธ๋์๋ค๊ณ ํ๋ค. ์ด๋ ์ด๋ฏธ ๋์ปค ํ๋ธ์ Ubuntu:14.04 ๋ผ๋ ์ด๋ฏธ์ง์ ๋ ์ด์ด๋ค์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ Ubuntu:14.04๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ push ํ๋ค๊ณ ํด๋ ์ด๋ฏธ ์กด์ฌํ๋ ๋ ์ด์ด๋ค์ ๋์ปค ํ๋ธ์ ์๋ ๊ฒ์ ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฒ์ด๋ค! ์์์ zedd.txt ๋ผ๋ ํ์ผ์ ์์ฑํ ํ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ๋งจ ์๋จ์ 1๊ฐ ๋ ์ด์ด๋ง Push ๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด์ ์ ์ ๋ก๋ ๋์๋์ง ๋์ปค ํ๋ธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๊ฐ๋ณด์.
v1 ์ด๋ผ๋ ํ๊ทธ ์ด๋ฆ์ ๊ฐ์ง ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค! ๊ทธ๋ฐ๋ค์ ์ด์ ๋์ปค ํ๋ธ์ ์ฌ๋ผ๊ฐ ์ ์ด๋ฏธ์ง๋ฅผ ๋๊ตฐ๊ฐ์ ํธ์คํธ ๋์ปค ์์ง์์ ๋ค์ด๋ฐ๊ณ (pull) ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ํ์์ pull ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
$ docker pull docker.io/jo181/zedd:v1
๊ทธ ์ด์ธ ๊ธฐํ์ ์ผ๋ก ๋์ปค ํ๋ธ์์๋ Github์ฒ๋ผ ์กฐ์ง ๋จ์๋ก ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , ์กฐ์ง ๋ด์์๋ ํ ๋จ์๋ก ๋ง๋ค์ด ์ด๋ค ํ์๊ฒ ํน์ ๊ถํ์ ์ฃผ๊ณ ์์ฃผ๊ณ ํ๋ ๊ถํ ๋ถ๋ฆฌ ๋ฐ ํ ๋น๋ ๊ฐ๋ฅํ๋ค. ๋ํ ํน์ ์ด๋ฏธ์ง ๋ ํฌ์งํ ๋ฆฌ(์ ์ฅ์)์ ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋ฉด ํน์ URL๋ก http ์์ฒญ์ ์ ์กํ๋๋ก ํ๋ ์นํ (WebHook)๋ ๋ง๋ค ์ ์๋ค.
์ฑ ์์๋ ๋์ปค ํ๋ธ๊ฐ ์๋ ๋์ปค ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ์ด์ํ๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ๋ค. ์ฑ ์ผ๋ก ์ฝ์ด์ ์ด๋์ ๋ ๊ณต๋ถํ๊ธด ํ์ง๋ง, nginx์ ๊ฐ์ด ํ์๊ฐ ์ ํด๋ณด์ง ๋ชปํ๋ ๊ฐ๋ ์ด ๋์์ ํด๋น ํฌ์คํ ์์๋ ๋ด์ง ์๊ณ ์ถํ์ ๋์ปค ๊ด๋ จ ์ค๋ ฅ์ด ๋ง์ด ๋์์ ๋ ๋ค์ ๋ค์ฌ๋ค๋ณด๊ณ ์ ํ๋ค. ๋ง์ฝ ๋์ปค ์ฌ์ค ๋ ์ง์คํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์ง๊ธ ๋น์ฅ ๊ถ๊ธํ๋ค๋ฉด ์ฑ ์๋ณธ์ ๊ผญ ์ฝ์ด๋ณด๊ธธ ๊ถ์ฅํ๋ค.
5. ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ, Dockerfile
4๋ฒ ๋ชฉ์ฐจ๊น์ง ๋ด์ฉ์ผ๋ก ํด์ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ ๋ฐ ์์๋ ์๋์ ๊ฐ๋ค.
- ๋์ปค ํ๋ธ์ ๊ฐ์ ๋ ์ง์คํธ๋ฆฌ๋ก๋ถํฐ Ubuntu, CentOS์ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑ
- ์์ฑํ ์ปจํ ์ด๋ ์์ ๋ด๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ (์์ค์ฝ๋ ๋ฑ..)์ ์ค์น
- ํด๋น ์ปจํ ์ด๋๋ฅผ ์ปค๋ฐ(commit) ํ๋ฉฐ ๋๋ง์ ์ด๋ฏธ์ง๋ก ์์ฑ
๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค๊ณ ํ๋ฉด, ๋งค๋ฒ ๋ด๊ฐ ๊ตฌํ์ํฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ํ๋ ํ๊ฒฝ์ด๋ ์์ค์ฝ๋ ๋ฑ์ ์์ฑํ ์ปจํ ์ด๋์ ๋ณต์ฌ, ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํด์ผ๋ง ํ๋ค. ๊ฐ๋จํ ๋ก์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฉด ์์ค์ฝ๋๋ ์ ์ ๊ฒ์ด๋ค ๋ณด๋ ๋ณต์ฌ, ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ ๋ฐ๋ ๋น๊ต์ ๊ฐ๋จํ ์ผ์ผ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ก์ง์ด ๋ณต์กํด์ง๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง์ ๋ฐ๋ผ, ์ผ์ผ์ด ์์ค์ฝ๋๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ ์ฌ๊ฐ ํผ๊ณคํ ์ผ์ด ์๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋์ปค๋ ์ด๋ฌํ ํผ๊ณคํ(?) ์ผ๋ จ์ ๊ณผ์ ์ ์์ฝ๊ฒ ๊ธฐ๋กํ๊ณ ์ํํ ์ ์๋ build ๋ช ๋ น์ด๊ฐ ์กด์ฌํ๋ค. ์ด build ๋ช ๋ น์ด๋ก ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ปจํ ์ด๋์ ์ค์นํด์ผ ํ๋ ํจํค์ง, ์์ค์ฝ๋ ๋ฑ์ ๊ธฐ๋กํ ํ๋์ ํ์ผ์ ์ฝ์ด๋ค์ฌ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด๋ผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด 'ํ๋์ ํ์ผ'์ด ๋ฐ๋ก Dockerfile์ด๋ค. ์ด๋ ๊ฒ Dockerfile๊ณผ build ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์์ ์ธ๊ธํ ๊ท์ฐฎ์ ๊ณผ์ ์ ๋์ด๋ผ ์ ์์ผ๋ฉฐ Git๊ณผ ๊ฐ์ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ํ์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ๋ฐ ๋ฐฐํฌ๋ฅผ ์๋ํํ ์๋ ์๋ค.
Dockerfile์ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ์ฉ๋ ์ด์ธ์ ์ฌ๋ฌ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ ์ค ํ๋๋ก, ๋์ปค ํ๋ธ์ ๊ฐ์ ๋ ์ง์คํธ๋ฆฌ์ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ ๋ ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ ๋์ ๊ทธ ์ด๋ฏธ์ง์ ๋ํ Dockerfile ํ์ผ์ ๋ฐฐํฌํ ์๋ ์๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ ๋ค๋ฅธ ์ฌ์ฉ์๋ ๋์ปค ํ๋ธ์ ์ฌ๋ ค์ ธ ์๋ Dockerfile ํ์ผ์ ๊ฐ์ง๊ณ ๊ทธ ์ด๋ฏธ์ง๋ฅผ ์์ฝ๊ฒ ๋ง๋ค์ด๋ผ ์ ์๋ค. ๋ณดํต ์ด๋ ๊ฒ Dockerfile์ ์ด์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ฐฐํฌ๋๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋ขฐํ ์ ์์ ์์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ๋ํ Dockerfile ํ์ผ์ ์ด์ฉํ๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ด๋ค ํจํค์ง ๋ฐ ์์ค์ฝ๋๋ฅผ ์ฌ์ฉํ๋์ง ์ผ์ข ์ ์ด๋ฏธ์ง ์์ฑ ๋ด์ญ์ ๊ธฐ๋กํ ์ ์๋ค.
5-1. Dockerfile ๋ช ๋ น์ด ์ตํ๋ณด๊ธฐ
Dockerfile์ ๊ทธ๋ฌ๋ฉด ์ง์ ์์ฑํด๋ณด๋ฉด์ Dockerfile์ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ ํ๋์ฉ ๋ฐฐ์๋ณด์. Dockerfile์๋ ์ปจํ ์ด๋์์ ์ํํ ์์ ์ ํ ์ค์ฉ ๋ช ๋ น์ด๋ก ๋ช ์ํ๋ค. Dockerfile์์ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ ๋จ์ง ์ฐ๋ฆฌ๊ฐ ์ด์ ํฌ์คํ ์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ์ปจํ ์ด๋๋ฅผ CLI์์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ์๊ธฐ ์ฝ๊ฒ ๋ณํํ ๊ฒ์ด๋ค.
์ฐ์ ๋์ปค ์์ง์ด ์ค์น๋ ํธ์คํธ์์ zedd.html ์ด๋ผ๋ ํ์ผ์ ์์๋ก ํ๋ ์์ฑํ๊ณ ์๋ ๋ด์ฉ์ฒ๋ผ ๊ตฌ์ฑ๋ Dockerfile์ ๋ง๋ค์ด๋ณด์.
$ mkdir dockerfile && cd dockerfile
$ echo zedd >> zedd.html
FROM ubuntu:14.04
MAINTAINER zedd
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y
ADD zedd.html /var/www/html
WORKDIR /var/www/html
RUN ["/bin/bash", "-c", "echo zedd2 >> zedd2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
์ฐธ๊ณ ๋ก ์ Dockerfile์ ์์ฑ๋ ๋ช ๋ น์ด๋ ์๋ฌธ์์ฌ๋ ์๊ด์์ง๋ง ๊ด์ต์ ์ผ๋ก ๋๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ปค ์์ง์ Dockerfile ํ์ผ์ ์ฝ์ด๋ค์ผ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ 'Dockerfile' ์ด๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ์ฝ์ด๋ค์ธ๋ค. ๋ค๋ง, -f(--file) ์ต์ ์ ์ฃผ์ด์ ๊ผญ 'Dockerfile'์ด ์๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋์ด ์๋ ํ์ผ๋ ์ฝ์ด๋ค์ผ ์ ์๋๋ก ํ ์ ์๋ค. ์ด์ ๋ํด์๋ ์๋์์ ๋ฐฐ์๋ณด๋๋ก ํ์.
๋ช ๋ น์ด | ์๋ฏธ | ํน์ง |
FROM | ๋ฒ ์ด์ค๊ฐ ๋ ์ด๋ฏธ์ง๋ฅผ ์๋ฏธ | Dockerfile์ ์์ฑํ ๋๋ ๋ฐ๋์ ํ ๋ฒ ์ด์ ์ ๋ ฅํด์ผ ํจ. ์ฌ์ฉํ๋ ค๋ ์ด๋ฏธ์ง๊ฐ ๋ก์ปฌ ํธ์คํธ์ ์๋ค๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋(pull)ํจ |
MAINTAINER | ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ ๊ฐ๋ฐ์ ์ ๋ณด๋ฅผ ์๋ฏธ | ๋ณดํต ์ด๋ฉ์ผ์ ์ ๋ ฅํจ. ๋จ, ๋์ปค 1.13.0 ๋ฒ์ ์ดํ๋ก๋ deprecated ๋์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ช ๋ น์ด์ธ LABEL๋ก MAINTAINER ๊ธฐ๋ฅ์ ๋์ฒดํ ์ ์์ |
LABEL | ๋๋ง์ ์ด๋ฏธ์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ | ๋ฉํ๋ฐ์ดํฐ๋ "key":"value" ํํ๋ก ๋ง์น json์ฒ๋ผ ์ ์ฅ์ด ๋๋ฉฐ ํด๋น ์ด๋ฏธ์ง์ ์ ์ฅ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด๊ธฐ ์ํด์ docker inspect ๋ช
๋ น์ด๋ก ๋ณผ ์ ์์ ex)์๋ฅผ ๋ค์ด, ์์์๋ "purpose"="practice" ๋ผ๊ณ ์ ์ํ๋๋ฐ, ์ด๋ ๊ฒ ์ ์ํ๋ฉด ์ค์ ๋ฉํ๋ฐ์ดํฐ์๋ {"purpose": "practice"} ํํ๋ก ์ ์ฅ์ด ๋จ |
RUN | ๋๋ง์ ์ด๋ฏธ์ง์ ๊ธฐ๋ฐ์ด ๋๋ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์คํํ ๋ช ๋ น์ด๋ฅผ ์๋ฏธ | - ๋จ, ํน์ ํจํค์ง install ํ๋ ๋ช
๋ น์ด๋ฅผ ์ํํ ๋ ๋ณ๋์ ์
๋ ฅ์ ๋ฐ์์ผ ํ ์ ์๊ธฐ ๋๋ฌธ์ -y ์ต์
์ ์ฃผ์ด์ผ ํจ. ๋ง์ฝ ๋ณ๋์ ์
๋ ฅ์ ๋ฐ๊ธฐ ์ํด ๋๊ธฐํด์ผ ํ๋ค๋ฉด build ๋ช
๋ น์ด๊ฐ ์ด๋ฅผ ์ค๋ฅ๋ผ๊ณ ์ธ์ํจ - ๋จ, RUN ๋ช ๋ น์ด ์, JSON ๋ฐฐ์ด์ ํํ๋ก ๋ช ์ํด์ค ์ ์๋๋ฐ, Dockerfile์ ๋ช ๋ น์ด๋ฅผ JSON ๋ฐฐ์ด ํํ๋ก ๋ช ์ํ๋ค๋ฉด ๋ฐ๋์ ์ ธ์ ๋์์ํค๋ ๋ช ๋ น์ด๋ฅผ ๋ฐ๋์ ์์ ์ถ๊ฐํด์ผ ํจ ex) ์๋ฅผ ๋ค์ด, RUN ["echo", "\$MY_ENV"] ๋ผ๊ณ ํ๋ฉด ๋์ ํ์ง ์์ง๋ง ["sh", "-c", "echo \$MY_ENV"] ๋ผ๊ณ ๋ช ์ํ๋ฉด ๋์ํจ. ์ ์์ Dockerfile์์๋ "/bin/bash" ๋ก bash ์ ธ์ ๋์์ํค๋ ๊ฒ์ ๋ณผ ์ ์์ |
ADD | ํน์ ํ์ผ์ ๋๋ง์ ์ด๋ฏธ์ง์ ์ถ๊ฐ | - ์ฌ๊ธฐ์ ์ถ๊ฐํ๋ ํ์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก Dockerfile์ด ์์นํ ๋๋ ํฐ๋ฆฌ์ธ '์ปจํ
์คํธ(Context)'์์ ๊ฐ์ ธ์ด - ๋ง์ฐฌ๊ฐ์ง๋ก JSON ๋ฐฐ์ด ํ์์ผ๋ก ์ง์ ํ ์ ์์ด ADDํ ์ฌ๋ฌ๊ฐ์ ํ์ผ์ ์ง์ ํ ์ ์์. ๋จ, ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๊ฐ ํด๋น ํ์ผ๋ค์ ์ถ๊ฐํ ์ปจํ ์ด๋์ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๊ฐ ๋จ ex) ์๋ฅผ ๋ค์ด, ADD["zedd1.txt", "zedd2.txt", "index.html", "/zedd/test/"] ๋ผ๊ณ ํ๋ค๋ฉด, 2๊ฐ์ txt ํ์ผ๊ณผ 1๊ฐ์ html ํ์ผ์ ์ปจํ ์ด๋ ๋ด๋ถ์ "/zedd/test" ๋ผ๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก์ ์ถ๊ฐํจ |
WORKDIR | ๋ช ๋ น์ด๋ฅผ ์คํํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ช ์ํ๊ณ ๊ทธ๊ณณ์ผ๋ก ์ด๋์ ์๋ฏธ | ์ ธ ํ๋กฌํํธ์์ cd(change directory) ๋ช ๋ น์ด์ ๋์ผํ ํจ๊ณผ๋ฅผ ์ง๋. ๊ทธ๋์ WORKDIR ๋ช ๋ น์ด๋ฅผ 10๋ฒ ์ฐ๋ฉด cd ๋ช ๋ น์ด๋ฅผ 10๋ฒ ์ฐ๋ ์ ์ |
EXPOSE | Dockerfile ๋น๋๋ก ์์ฑํ ๋๋ง์ ์ด๋ฏธ์ง์์ ๋ ธ์ถํ ํฌํธ๋ฅผ ์๋ฏธ | - ํธ์คํธ ํฌํธ๋ฒํธ๊ฐ ์๋ ์ปจํ
์ด๋ ํฌํธ ๋ฒํธ์์ ์ฃผ์. ๊ทธ๋์ ํธ์คํธ์ ์ด๋ค ํฌํธ๋ฒํธ์ ๋ฐ์ธ๋ฉ๋๋์ง๋ ํด๋น ๋ช
๋ น์ด๋ง ๋ณด๊ณ ๋ ์ ์ ์์. - docker run ๋ช ๋ น์ด์์ ๋ชจ๋ ๋ ธ์ถ๋ ์ปจํ ์ด๋์ ํฌํธ ์ฆ, EXPOSE ์ ๋ช ์ํ ๋ชจ๋ ํฌํธ๋ฅผ ํธ์คํธ์ ๊ฐ๊ฐ ๋ฐ์ธ๋ฉํ๋ ์ฆ, ํผ๋ธ๋ฆฌ์ํ๋ -P ํ๋๊ทธ์ ํจ๊ป ์ฌ์ฉ |
CMD | ์ปจํ
์ด๋๊ฐ ์์๋ ๋๋ง๋ค ์คํ๋ ๋ช
๋ น์ด๋ฅผ ์ค์ (docker ps ๋ช ๋ น์ด๋ก ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ์ถ๋ ฅ์์ COMMAND์ ํด๋น๋๋ ๊ฒ์) |
- Dockerfile์์ ํ ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅ - CMD ๋ช ๋ น์ด๋ JSON ๋ฐฐ์ด ํํ๋ฅผ ์ธ์๋ก ๋ฐ์ ์ ์์ - CMD๋ ENTRYPOINT์ ๋ช ๋ น์ค ์ธ์๋ก๋ ์ฐ์ผ ์ ์๋๋ฐ, ์ด๋ ์ถํ์์ ์์๋ณด๋๋ก ํจ |
์ ํ ์ค ๋ง์ง๋ง CMD ๋ช ๋ น์ด์์ ์์๋ณผ ์ฌํญ์ด 2๊ฐ์ง๊ฐ ์๋ค. ์ผ๋จ ์ฒซ ๋ฒ์งธ๋ก, ์ ์์์์ ์ฌ์ฉํ CMD apachectl -DFOREGROUND ๋ผ๋ ๋ช ๋ น์ด์ ์๋ฏธ์ด๋ค. ํด๋น ๋ช ๋ น์ด์์ 'D'๋ Detached๋ก, ๋ฐฑ๊ทธ๋ผ์ด๋ ์ก์ผ๋ก ๋๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๊ณ , FOREGROUND๋ ํฌ๊ทธ๋ผ์ด๋ ์ก์ผ๋ก ๋๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์ 2๊ฐ๊ฐ ๋ค ๊ฐ์ด ์ฐ์ธ ์ด์ ๋ '๋๊ตฌ ์ ์ฅ'์์ ํด๋น ์ก์ ์คํํ๋๋์ ์ฐจ์ด๋ค. ์ฆ, ํด๋น ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ํธ์คํธ ์ ์ฅ์์๋ ์ํ์น ์น์๋ฒ๊ฐ ๋์์ ธ ์๋ ์ปจํ ์ด๋๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ก์ผ๋ก ๋๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ D๋ฅผ ๋ถ์ธ ๋ฐ๋ฉด, ์ปจํ ์ด๋ ์ ์ฅ์์๋ ์ํ์น ์น์๋ฒ๊ฐ ํ๋์ ํฐ๋ฏธ๋์ ์ฐจ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํฌ๊ทธ๋ผ์ด๋ ์ก์ผ๋ก ๋๋ ค์ผ ํด์ FOREGROUND๋ฅผ ๋ช ์ํ ๊ฒ์ด๋ค.
๋๋ฒ์งธ๋ก๋ docker run ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ ์ด๋ฏธ์ง ์ด๋ฆ ๋ค์ ์ปค๋งจ๋์ ๊ฐ์ ์ญํ ์ ํ๋ ๊ฒ์ ์ธ์๋ก ์ค ์ ์๋ค๋ ๊ฒ์ด๋ค.(์ด์ ํฌ์คํ ์์ ์์๋ด) ๊ทธ๋ฐ๋ฐ CMD ๋ช ๋ น์ด๊ฐ ์ ๋ ฅ๋ Dockerfile๋ก ๋ง๋ค์ด์ง ์ด๋ฏธ์ง๋ผ๊ณ ํ๋๋ผ๋ ๋ง์ฝ docker run ๋ช ๋ น์ด๋ฅผ ํตํด ์ปค๋งจ๋๋ฅผ ์๋กญ๊ฒ ์ ๋ ฅํ๋ฉด ์๋กญ๊ฒ ์ ๋ ฅํ ์ปค๋งจ๋๋ก ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ค. ๋ํ ์ ์ด์ ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์๋ฅผ ๋ค์ด, ์ฐ๋ถํฌ, CentOS์ ๊ฐ์ ๊ณต์ ์ด๋ฏธ์ง์ ๋ด์ฅ๋์ด ์๋ COMMAND๋ Dockerfile์ CMD๋ฅผ ๋ช ์ํจ์ผ๋ก์จ ์ด๋ฏธ์ง์ ๋ด์ฅ๋ COMMAND๋ฅผ Dockerfile์ CMD๋ก ๋ฎ์ด์ธ ์๊ฐ ์๋ค.
5-2. Dockerfile ๋น๋ํ๊ธฐ
๊ทธ๋ฌ๋ฉด ์ด์ ์์์ ์์ฑํ Dockerfile ์์ํ์ผ์ ๊ฐ์ง๊ณ ๋น๋ํด๋ณด์. ์ฌ๊ธฐ์ ๋น๋ํด๋ณธ๋ค๋ผ๋ ๊ฒ์ ๋์ปค์ build ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด Dockerfile์ ๋ช ์๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค. ํํ build ๋ช ๋ น์ด ์ฌ์ฉ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
$ docker build -t [repository:tag] [Dockerfile ์์น ๊ฒฝ๋ก]
-t ์ต์ ์ ๋ฃ์ด์ฃผ์ง ์์ผ๋ฉด build ํด์ ๋ง๋ค ๋๋ง์ ์ด๋ฏธ์ง ์ด๋ฆ์ 16์ง์์ ํด์๊ฐ์ผ๋ก ์๋ ์์ฑํ๋ค. ์ค์ ๋ก build ๋ช ๋ น์ด๋ฅผ ์ํํ ์ด๋ฏธ์ง ๋ชฉ๋ก์ ์ถ๋ ฅํ๋ฉด ์๋์ฒ๋ผ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ์์์ ๋ง๋ ๋๋ง์ ์ด๋ฏธ์ง ์ฆ, zedd_image:v1 ์ด๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํด๋ณด์.
$ docker run -d -P --name zedd_container zedd_image:v1
์ ์ฌ์ง์ ๋ณด๋ฉด zedd_container๋ผ๋ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ํ, ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก์ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, ํ๋์ ์ปจํ ์ด๋๊ฐ ์คํ์ค์์ ์ ์ ์๋ค. ๋ ์์ธํ ๋ค์ฌ๋ค๋ณด๋ฉด COMMAND ํญ๋ชฉ์๋ ์ฐ๋ฆฌ๊ฐ Dockerfile์์ CMD ๋ช ๋ น์ด์ ๋ช ์ํด์ฃผ์๋ ๋ช ๋ น์ด๊ฐ ๊ทธ๋๋ก ๋ค์ด์๊ณ , PORTS ํญ๋ชฉ์ ๋ณด๋ฉด ํธ์คํธ์ 32768ํฌํธ ๋ฒํธ๊ฐ ์ปจํ ์ด๋์ 80๋ฒ ํฌํธ๋ก ์ฐ๊ฒฐ๋์ด ์์์ ์ ์ ์๋ค. ์ด ์ปจํ ์ด๋์ 80๋ฒ ํฌํธ๋ ๋ฐ๋ก Dockerfile์์ EXPOSE์ ๋ช ์ํด์ฃผ์๋ ํฌํธ๋ฒํธ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์๊น ์์์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ LABEL๋ก ๋ช ์ํด์ฃผ์๋ ๊ฒ์ ์ฐพ๊ธฐ ์ํด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํด์ ์ฐพ์๋ณด์. ๋ณดํต ๋ ์ด๋ธ์ ํ์ฉํด์ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์ผ๋ ค๋ฉด --filter ์ต์ ์ ๋ฃ๊ณ label ์ธ์์ ํจ๊ป key=value ๊ฐ ํํ๋ก ๋ฃ์ด์ฃผ์ด ์ฐพ์ ์ ์๋ค. ์ฝ๋ ์์๋ ์๋์ ๊ฐ๋ค.
$ docker images --filter "label=purpose=practice"
5-3. ๋น๋ ๊ณผ์ ์ดํด๋ณด๊ธฐ
์ ๋ชฉ์ฐจ์์๋ ๋น๋๋ฅผ ์ง์ ์คํํด๋ณด์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ ๋น๋๋ฅผ ์คํํ๋ฉด ๋ด๋ถ์ ์ผ๋ก ๋์ฒด ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ดํด๋ณด์. ๊ทธ ์ค์์ ๊ฐ์ฅ ๋จผ์ ์ ํ ๊ฐ๋ ์ ๋ฐ๋ก ๋น๋ ์ปจํ ์คํธ์ด๋ค.
5-3-1. ๋น๋ ์ปจํ ์คํธ
build ๋ช ๋ น์ด๋ก ์ด๋ฏธ์ง ๋น๋๋ฅผ ์์ํ๋ฉด ๋์ปค๋ ๊ฐ์ฅ ๋จผ์ ๋น๋ ์ปจํ ์คํธ๋ผ๋ ๊ฒ์ ์ฝ์ด ๋ค์ธ๋ค. ์ฌ๊ธฐ์ ๋น๋ ์ปจํ ์คํธ๋, ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ๊ฐ์ข ํ์ผ, ์์ค์ฝ๋, ๋ฉํ๋ฐ์ดํฐ ๋ฑ์ ๋ด๊ณ ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋ณดํต์ Dockerfile์ด ์์นํ ๊ฒฝ๋ก๊ฐ ๋น๋ ์ปจํ ์คํธ๊ฐ ๋๋ค. ๋น๋ ์ปจํ ์คํธ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ์ํ ์ฌ๋ฌ๊ฐ์ง ํ์ผ๋ค์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น๋๋ ์ด๋ฏธ์ง์ ํ์ผ์ ์ถ๊ฐํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค. Dockerfile ๋ช ๋ น์ด๋ก๋ ADD ๋๋ COPY ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํ ๋ ๋น๋ ์ปจํ ์คํธ๋ฅผ ํ์ฉํ๋ค. ์ด ๋น๋ ์ปจํ ์คํธ์ ๋ํ ์ ๋ณด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ํฐ๋ฏธ๋์ ์ถ๋ ฅ๋๋ ํ์ค์ถ๋ ฅ์์ ๋งจ ๋จผ์ ๋ฑ์ฅํ๋ค.
๋น๋ ์ปจํ ์คํธ๋ build ๋ช ๋ น์ด์ ๋งจ ๋ง์ง๋ง ์ธ์๋ก ์ง์ ๋ ์์น์์๋ ํ์ผ์ ์ ๋ถ ํฌํจํ๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ๋ช ๋ น์ด๊ฐ ์๋ค๊ณ ํ๋ค๋ฉด ๋น๋ ์ปจํ ์คํธ์ ๊ฒฝ๋ก๋ ํธ์คํธ ํ์ผ์์คํ ์ /Users/zedd/Destkop ์ด๋ผ๋ ๊ฒฝ๋ก๊ฐ ๋๋ค
$ docker build -t zedd_image:v1 /Users/zedd/Desktop/
ํด๋น ์ธ์์๋ ํ์ผ์์คํ ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํด๋ ๋์ง๋ง ๊น๊ณผ ๊ฐ์ ์ธ๋ถ URL์ ์ฝ์ด๋ค์ผ ์ ๋ ์๋๋ฐ, ๋ง์ฝ ๊น ๋ ํฌ์งํ ๋ฆฌ URL์ ์ฝ์ด๋ค์ด๋ฉด ํด๋น ๋ ํฌ์งํ ๋ฆฌ์ ์๋ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ๋น๋ ์ปจํ ์คํธ์ ํฌํจ์ํจ๋ค. ๊ทธ๋์ ๋ณดํต ๋น๋ ์ปจํ ์คํธ์ ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ํ์ผ์ ๋ถ๋ชจ ๋๋ ํ ๋ฆฌ์ธ root ๋๋ ํ ๋ฆฌ ๊ฐ์ ๊ณณ์์ ์ด๋ฏธ์ง๊ฐ ๋น๋๋์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค. ์๋ํ๋ฉด ๋น๋์ ๋ถํ์ํ ํ์ผ์ด ๋๋ ํฌํจ๋๋ค๋ฉด ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ์๋๊ฐ ๋๋ ค์ง ๋ฟ๋ง ์๋๋ผ ํธ์คํธ์ ๋ฉ๋ชจ๋ฆฌ๋ ์ง๋์น๊ฒ ๋ง์ด ์ฐจ์งํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๋ก ๋ ๋ฐ์ด๋ ๊ฐ๋ฐ์๋ค์ด ์์ ๊ฐ์ ๋๊ฐํ ์ํฉ์ ๋๋นํด ํน์ ํ์ผ์ ๋น๋ ์ปจํ ์คํธ์ ํฌํจ๋์ง ์๋๋ก ๋ช ์ํ๋ ํ์ผ์ ๊ฐ๋ฐํ์๋๋ฐ, ๋ฐ๋ก ๊น์์ ์ฌ์ฉํ๋ .gitignore ํ์ผ๊ณผ ๋น์ทํ ์ญํ ์ ํ๋ .dockerignore ํ์ผ์ด๋ค. .dockerignore ํ์ผ์ ๋ช ์๋ ํ์ผ๋ค์ ๋น๋ ์ปจํ ์คํธ์ ์ต์์ ๊ฒฝ๋ก, ๋ค์ ๋งํด build ๋ช ๋ น์ด์์ ๋งจ ๋ง์ง๋ง์ ์ค๋ ๊ฒฝ๋ก์ด์ Dockerfile์ด ์์นํ ๊ฒฝ๋ก์ ๊ฐ์ ๊ณณ์ ์์นํด์ผ ํ๋ค.
.dockerignore์ ๋ช ์ํ๋ ํ์ผ ํฌ๋งท์ผ๋ก๋ ๋ชจ๋ ๋๋ ํ ๋ฆฌ ๋๋ ํ์ผ์ ์๋ฏธํ๋ *(asterisk) ๋ฌธ์๋ฅผ ์ด์ฉํ ์ ์๋ค. ๋ํ ? ๋ฌธ์๋ฅผ ์ฌ์ฉํด์ ์์์ 1์๋ฆฌ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ๋ ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ๋ฅผ ํํฐ๋งํ ์๋ ์๋ค. ๋ง์ง๋ง์ผ๋ก, ํน์ํ ํ์ผ๋ง ํฌํจ๋์ง ์๋๋ก ์ค์ ํ๊ณ ์ถ๋ค๊ณ ํ๋ฉด ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ ๋ช ๋งจ ์์ ! ๋ฌธ์๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. ์๋๋ .dockerignore ํ์ผ ์์์ด๋ค.
*.html
/*/*.csv
!index.html
5-3-2. Dockerfile ๋ด๋ถ ๋ช ๋ น์ด๊ฐ ์คํํ๋ ์ปจํ ์ด๋ ์์ฑ๊ณผ ์ปค๋ฐ
Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง๋ ์ด๋ฏธ์ง๋ ๋จ ํ๋์ ์ปจํ ์ด๋์์ ์์ฑ๋๋ ๊ฒ์ ์๋๋ค. ๋ค์ ๋งํด, Dockerfile์ ๋ช ์๋ ๋ช ๋ น์ด ํ์ค ๋น ํ๋์ ์ปจํ ์ด๋๊ฐ ์์ฑ๋๋ค. ๋ง์ฝ ์๋์ ๊ฐ์ Dockerfile์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install apache2 -y
์์ ๊ฐ์ Dockerfile ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ๋น๋ํ๋ฉด ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ปจํ ์ด๋๊ฐ ์์ฑ๋๊ณ ์ญ์ ๋๋ฉด์ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๋ค.
์ ๊ทธ๋ฆผ ์์๋ฅผ ๋ณด์. Step1๋ฒ์ผ๋ก, FROM ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด์ Ubuntu:14.04 ๋ผ๋ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํด์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ณ , ๋ด๋ถ์ ์ผ๋ก ์ปค๋ฐ์ ํ์ฌ ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด 1์ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ Step1๋ฒ์ผ๋ก ์์ฑ๋ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฒซ๋ฒ์งธ RUN ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด์ ๋ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ฒ ๊ณ์์ ์ผ๋ก ์ต์ข ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ๋๊น์ง ์ค๊ฐ์ ๋ช ๋ น์ด ํ ์ค ๋ง๋ค ํ๋์ ์๋ก์ด ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค, ์ต์ข ์ด๋ฏธ์ง๊ฐ ์์ฑ๋ ํ์๋ ์ค๊ฐ์ ์์ฑ๋์๋ ์ปจํ ์ด๋๋ค์ ๋ชจ๋ ์ญ์ ํ๋ค. ๊ฒฐ๊ตญ, Dockerfile์ ๋ช ์๋ ๋ช ๋ น์ด ์ค ๊ฐ์๋งํผ ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๊ฐ ์๊ธฐ๊ณ ๊ทธ ์ซ์๋งํผ์ ์์ ์ปจํ ์ด๋๋ค์ด ์ค๊ฐ์ ์์ฑ๋์๋ค๊ฐ ์ญ์ ๋๋ค.
5-3-3. ์บ์๋ฅผ ์ด์ฉํ ๋น๋
๋์ปค๋ฅผ ์ด์ฉํ๋ค๋ณด๋ฉด ๊ทธ ์ ์ ์ฌ์ฉํ๋ ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ๋ ์์ฑํ ๋, ์ฒ์์ ์์ฑํ์ ๋๋ณด๋ค ์์ฒญ ๋น ๋ฅด๊ฒ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๋ ๊ฒฝํ์ ํด๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์บ์๋ฅผ ์ด์ฉํ ์ด๋ฏธ์ง ๋น๋์ด๋ค. ์บ์ ์ด๋ฏธ์ง ๋น๋๋, ํ ๋ฒ ์ด๋ฏธ์ง ๋น๋๋ฅผ ํ๊ณ ๋ ๋ค ๋ค์ ๊ฐ์ ๋น๋๋ฅผ ์งํํ๋ฉด ์ด์ ์ ์ด๋ฏธ์ง ๋น๋์์ ์ฌ์ฉํ๋ ์บ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ณดํต ์บ์๋ฅผ ์ด์ฉํ๊ฒ ๋๋ฉด ์ด๋ฏธ์ง ์์ฑ ์ ํ์ค์ถ๋ ฅ์ "Using cache.." ๋ผ๋ ๋ด์ฉ์ด ๋์จ๋ค. ์บ์๋ฅผ ํ๋ ๊ธฐ์ค์ ์ด์ ์ ๋น๋ํ ๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ํํ ๊ฒ๊น์ง ํฌํจํ์ฌ ์บ์๋ฅผ ํ๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก ๋์ปค ๋น๋ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด build ๋ช ๋ น์ด๊ฐ ์ค์ง๋๋ฉด์ ์ ๊ทธ๋ฆผ์ฒ๋ผ ์ค๊ฐ ์ค๊ฐ ์ปจํ ์ด๋๋ฅผ ์์ฑ ๋ฐ ์ญ์ ํ๋ค๊ฐ ๋ง์ง๋ง์ผ๋ก ์์ฑ๋ ์ค๊ฐ ์ปจํ ์ด๋๊ฐ ์ญ์ ๋์ง ์์ ์ฑ๋ก ๋จ๊ฒจ์ง๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ํ ๋น๋ ํํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ docker build -t ์ต์ ๋ค์์ ๋ฃ์ด์ค ์ด๋ฏธ์ง ์ด๋ฆ์ด ์๋ ์ด๋ฆ์ด <none>:<none>์ธ ์ฆ, ๋๊ธ๋ง ์ด๋ฏธ์ง๋ก ๋จ๊ฒ ๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ์บ์ ๊ธฐ๋ฅ์ด ๋ถํธํ๊ฒ ๋๊ปด์ง ๋๊ฐ ์๋ค. ์ผ๋ก๋ก, Dockerfile์ ํน์ ๊น ๋ ํฌ์งํ ๋ฆฌ๋ฅผ clone ํ๋ ๊ฒ์ด ์๋ค. ์๋ Dockerfile ์์๋ฅผ ๋ณด์.
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install git -y
RUN git clone https://github.com/young-hun-jo/DeepLearningOnlyNumpy.git
๊ทธ๋ฐ๋ฐ ์ต์ด์ ๋น๋ํ ๋๋ ๋๋ฒ์งธ ๋น๋ํ ๋๋ ํด๋น ๋ ํฌ์งํ ๋ฆฌ์ ์์ค์ฝ๋์ ์์ (๋ฆฌ๋น์ ผ)์ด ์๊ฒผ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ง์ฝ ์ด๋ฐ ์ํฉ์ผ ๋ ์บ์ฑ์ ์ฌ์ฉํด์ ๋น๋๋ฅผ ํ๋ค๊ณ ํ๋ฉด ์์ ์ฌํญ์ด ๋ฐ์๋ ๋ ํฌ์งํ ๋ฆฌ์ ์์ค์ฝ๋๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๊ณ ๊ณ์ ์ด์ ๋ฒ์ ์ ๋ ํฌ์งํ ๋ฆฌ๋ง ํด๋ก ํ๊ฒ ๋๋ค. ๊ทธ๋์ ์ด์ ๋์ํ๊ธฐ ์ํด ์ Dockerfile์ docker build ๋ก ์คํํ๋ --no-cache ์ต์ ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
$ docker build --no-cache -t zedd_git_image:v1 .
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก, ํน์ ์ด๋ฏธ์ง๋ง์ ์บ์๋ฅผ ์ฌ์ฉํด ๋น๋ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ๋ช ๋ น์ด ํฌ๋งท์ผ๋ก ํ๋ฉด ๋๋ค.
$ docker build --cache-from [IMAGE] -t zedd_cache_image:v1 .
5-3-4. ๋ฉํฐ ์คํ ์ด์ง๋ฅผ ์ด์ฉํ Dockerfile ๋น๋
๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ค์ฌ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ค.(๋จ, ๋์ปค ์์ง 17.05 ๋ฒ์ ์ด์์์๋ง ๊ฐ๋ฅ) ์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ฐ์ ์๋์ ๊ฐ์ ๊ฐ๋จํ Dockerfile๊ณผ main.py์ ์์ฑํด๋ณด์.
# main.py
def f():
return "Hello zedd"
FROM python:3.10.1
ADD main.py /root
WORKDIR /root
RUN python main.py
์ 2๊ฐ์ ํ์ผ์ ์์ฑํ ๋ค ์๋ build ๋ช ๋ น์ด๋ฅผ ์คํ์์ผ๋ณด์.
$ docker build -t zedd_python:v1 .
๊ทธ๋ฆฌ๊ณ ๋น๋ํ ์ด๋ฏธ์ง ์ฆ, zedd_python:v1 ์ด๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง์ ์ฉ๋์ ์ดํด๋ณด์.
์ด๋ฏธ์ง ์ฌ์ด์ฆ๊ฐ 917MB ์ฉ๋์ด๋ ์ฐจ์งํ๋ค. ์ด๋ ๊ฒ ์ฉ๋์ด ์ปค์ง ์ด์ ๋ ๋ค์ด๋ก๋ ๋ฐ์ ์ด๋ฏธ์ง๊ฐ ๊ฐ์ํ๋ ๋ฒ์ ์ด ์๋ python:3.10.1 ์ด๋ฏธ์ง์ธ ์ด์ ๋ ์์ผ๋ฉฐ, ๊ทธ๋ฌํ ์ด๋ฏธ์ง๋ ์ฐ๋ฆฌ๊ฐ ์คํํ๊ธธ ์ํ๋ ์ฆ, main.py ํ์ผ์ ์คํํ๋ ๋ฐ ํ์ํ ๊ฒ ๋ง๊ณ ๋ ๋ถํ์ํ ๊ฐ์ข ํจํค์ง ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ด์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋์ปค๋ ์ด๋ ๊ฒ ํฐ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋๋ผ๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์๋๋ฐ, ๊ทธ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ฉด์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ๋ฉํฐ ์คํ ์ด์ง ๋น๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฐธ๊ณ ๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๊ฐ์ํ๋ python ์ด๋ฏธ์ง๋ฅผ ์ํด์ python:slim, python:alpine ๋ฑ๊ณผ ๊ฐ์ ์ต์ํ์ ๊ธฐ๋ฅ๋ง ํฌํจ๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ธฐ๋ ํ๋ค.(์ฐธ๊ณ ๋ก slim์ ํ์ด์ฌ๋ง ์คํํ ์ ์๋ ์์ ์ด๋ฏธ์ง์ด๊ณ , alpine, busybox, bullseye๋ ์ผ๋ฐ์ ์ธ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ธ Ubuntu, CentOS ๋ณด๋ค ๊ฐ๋ณ๊ณ ๊ธฐ๋ฅ์ด ์ต์ํ์ผ๋ก๋ง ๋ค์ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ ๋ปํ๋ค)
๊ทธ๋ฌ๋ฉด ์ด์ ๋ฉํฐ ์คํ ์ด์ง ๋น๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๋ฉํฐ ์คํ ์ด์ง๋ ํ๋์ Dockerfile ์์ ์ฌ๋ฌ ๊ฐ์ FROM ์ด๋ฏธ์ง๋ฅผ ์ ์ํจ์ผ๋ก์จ ๋น๋ ์๋ฃ ์ ์ต์ข ์ ์ผ๋ก ์์ฑ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์ญํ ์ ํ๋ค. Dockerfile ์์ ์ฌ๋ฌ ๊ฐ์ FROM ์ด๋ฏธ์ง๋ฅผ ์ ์ํ๋ค๋? ๋์ฒด ๋ฌด์จ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ผ๋จ ์์ Dockerfile ๋ถํฐ ์ดํด๋ณด์.
FROM python:3.10.1
ADD main.py /root
WORKDIR /root
RUN python main.py
FROM alpine:latest
WORKDIR /root/alpine
COPY --from=0 /root /root/alpine
CMD ["/bin/sh", "-c", "python /root/alpine/main.py"]
์ ํ์ผ ๋ด์ฉ์ ๋ณด๋ฉด 2๊ฐ์ FROM์ด ๋ช ์๋์๋ค. ์ฒซ ๋ฒ์งธ ๋ฌธ๋จ์ ์๋ ๊ฒ์ ์์์ ์ค์ตํด ๋ณธ ๊ฒ์ด๋ ๋์ผํ๋ค. ์ค์ํ ๊ฒ์ ๋ ๋ฒ์งธ ๋ฌธ๋จ์ ๋ด์ฉ๋ค์ด๋ค. ์ผ๋จ, ๋๋ฒ์งธ ๋ฌธ๋จ์์๋ alpine:latest ๋ผ๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ด๋ฏธ์ง์ /root/alpine ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑ ๋ฐ ์ด๋์ ํ๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ "--from=0" ์ด๋ค. ์ฌ๊ธฐ์ 0์ ์ฒซ ๋ฒ์งธ FROM์์(์ฒซ ๋ฒ์งธ ๋ฌธ๋จ์์) ๋น๋๋ ์ด๋ฏธ์ง์ ์ต์ข ์ํ๋ฅผ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ต์ข ์ํ์ ์ด๋ฏธ์ง์ /root ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ์ ๋ ๋ฒ์งธ FROM ์ด๋ฏธ์ง์ธ alpine:latest ์ด๋ฏธ์ง์ /root/alpine ๋๋ ํฐ๋ฆฌ์ ๋ณต์ฌ(COPY) ํ๋ค๋ ์๋ฏธ์ด๋ค. Dockerfile ๋ด์ฉ์ ๋ค์ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
์ Dockerfile์ ์๋ ๋ช ๋ น์ด๋ก ๋น๋ํ ๋ค, zedd_multi_stg:v1 ์ด๋ผ๋ ์ด๋ฏธ์ง์ zedd_python:v1 ์ด๋ผ๋ ์ด๋ฏธ์ง์ ํฌ๊ธฐ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด์. ๋๊ฐ์ ์ํํ๋ ๋ ๊ฐ์ ์ด๋ฏธ์ง์ด์ง๋ง, ํฌ๊ธฐ ์ฐจ์ด๊ฐ ์์ฒญ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋ฉํฐ ์คํ ์ด์ง ๋น๋์ ์ฅ์ ์ธ ๊ฒ์ด๋ค!
(***์ฉ๋ ์ฐจ์ด ์ฌ์ง ์ฒจ๋ถํ๊ธฐ****)
์ฒซ ๋ฒ์งธ FROM ์ด๋ฏธ์ง๋ฅผ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ์ด๋ฏธ์ง๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ๊ทธ๋ฐ๋ฐ ์์์ 0์ด๋ผ๋ ์ซ์๊ฐ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ฅ์์๋ ํท๊ฐ๋ฆด ์๋ ์๋ค. ์ด๋ฅผ ์ํด์ ํน์ ๋จ๊ณ์ ์ด๋ฏธ์ง ์ด๋ฆ์ ๋ณ์นญ(alias)์ ๋ถ์ผ ์๋ ์๋ค. ์ Dockerfile ์์๋ฅผ ์๋์ฒ๋ผ ๋ฐ๊ฟ ์๋ ์๋ค.
FROM python:3.10.1 as python_3
ADD main.py /root
WORKDIR /root
RUN python main.py
FROM alpine:latest
WORKDIR /root/alpine
COPY --from=python_3 /root /root/alpine
CMD ["/bin/sh", "-c", "python /root/alpine/main.py"]
5-4. Dockerfile์ ๋ค๋ฅธ ๋ช ๋ น์ด
์ด๋ฒ ๋ชฉ์ฐจ์์๋ Dockerfile ํ์ผ์์ ์ฌ์ฉํ๋ ์ข ๋ ๋ค์ํ ๋ช ๋ น์ด์ ๋ํด์ ์์๋ณด๋๋ก ํ์. ์ฌ๊ธฐ์๋ ๋ช ๋ น์ด ์ข ๋ฅ๋ฅผ ํ ํํ๋ก ์์๋ณด๊ณ , ๋ณ๋๋ก ์ค์ต์ ํด๋ณด๋ฉด์ ์ดํดํ ๋ช ๋ น์ด๋ ํ ์๋์์ ๋ฐฐ์๋ณด๋๋ก ํ์.
๋ช ๋ น์ด | ์๋ฏธ | ํน์ง |
ENV [NAME] [VALUE] | Dockerfile์์ ์ฌ์ฉ๋ ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ . ๋ณดํต ์ ธ ์คํฌ๋ฆฝํธ์์ ํธ์ถํ๋ ํ๊ฒฝ๋ณ์์ฒ๋ผ Dockerfile์์๋ #${NAME} ๋๋ #$NAME ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ | - Dockerfile์์ ์ ์ธํ ํ๊ฒฝ๋ณ์๋ ํด๋น Dockerfile๋ก ๋ง๋ค์ด์ง ์ด๋ฏธ์ง์ ๋ ์ ์ฅ๋๋ฏ๋ก ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์์ฑํ์ ๋๋ ๊ทธ ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ - Dockerfile์์ ENV๋ก ์ ์ธํ ํ๊ฒฝ๋ณ์ ๊ฐ์ด ์๋๋ฐ, ๋ง์ฝ docker run ์ -e ์ต์ ์ผ๋ก ๋์ผํ ํ๊ฒฝ๋ณ์ ์ด๋ฆ์ ์ ์ธํ๋ค๋ฉด -e ์ต์ ์์ ์ ์ธํ ๊ฐ์ผ๋ก ๋ฎ์ด์ฐ๊ธฐ ๋จ - ํน์ ํ๊ฒฝ๋ณ์๊ฐ ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ, ์์ง ์์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ด๋ค ๊ฐ์ ์ฌ์ฉํ ์ง๋ ์ค์ ํ ์ ์์. ex1) ${env_name: -value} โ env_name ์ด๋ผ๋ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์ ์ค์ ๋์ด ์์ง ์๋ค๋ฉด value ๋ผ๋ ๊ฐ์ผ๋ก ์ฌ์ฉ โ env_name ์ด๋ผ๋ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์ ์ค์ ์ด ๋์ด ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์ฌ์ฉ ex2) ${env_name: +value} โ env_name ์ด๋ผ๋ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์ ์ค์ ์ด ๋์ด ์์ง ์๋ค๋ฉด ๋น ๋ฌธ์์ด์ ์ฌ์ฉ โ env_name ์ด๋ผ๋ ์ด๋ฆ์ ํ๊ฒฝ๋ณ์ ์ค์ ์ด ๋์ด ์๋ค๋ฉด value ๋ผ๋ ๊ฐ์ ์ฌ์ฉ |
VOLUME [CONTAINER ๊ฒฝ๋ก] | Dockerfile๋ก ๋น๋๋ ์ด๋ฏธ์ง๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๋, ํธ์คํธ์ ํ์ผ์์คํ ๊ณผ ๊ณต์ ํ ์ปจํ ์ด๋ ๋ด๋ถ์ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ค์ . ์ฆ, ํธ์คํธ ๋ณผ๋ฅจ์ ๊ณต์ ํ ์ปจํ ์ด๋์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด | JSON ๋ฐฐ์ด ํ์ ๋๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํ ์ ์์ |
ARG [key]=[value] | build ๋ช
๋ น์ด๋ก Dockerfile์ ๋น๋ํ ๋ ์ถ๊ฐ๋ก ์ธ์๋ฅผ ๋ฐ์ Dockerfile ๋ด์์ ์ฌ์ฉ๋ ๋ณ์์ ๊ฐ์ ์ค์ <key>=<value> ํํ๋ก ๋ช ์ํจ Dockerfile ๋ด์์๋ ํด๋น ์ธ์๋ฅผ ${build_arg} ํํ๋ก ENV ๋ช ๋ น์ด ์ฒ๋ผ ๋์ผํ ํ์์ผ๋ก ์ฌ์ฉํจ |
- <value>๋ฅผ ๋ช
์ํ๋ฉด ํด๋น ์ธ์์ ๋ํดํธ ๊ฐ์ด ๋ช
์๋๋ ์
- build ๋ช ๋ น์ด ์ฌ์ฉ ์, ๋ฐ๋์ --build-arg ์ต์ ์ ์ฃผ์ด ์ธ์๋ฅผ ์ฃผ์ด์ผ ํจ - ๋ง์ฝ ARG ์ธ์๋ก ์ฃผ๋ ์ธ์์ ์ด๋ฆ์ ENV๋ก ๋ช ์ํ๋ ๋ณ์์ ์ด๋ฆ๊ณผ ๊ฐ๊ฒ ํ๋ค๋ฉด ENV๊ฐ --build-arg ์์ ๋ช ์ํ๋ ARG์ ์ธ์๊ฐ์ ๋ฎ์ด์ฐ๊ธฐ ํจ์ ์ฃผ์ |
USER [username] | Dockerfile์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ฌ์ฉ๋ ์ฌ์ฉ์ ๊ณ์ | - ๋ณดํต ์ปจํ
์ด๋๋ root ๊ถํ์ผ๋ก ์คํ๋๋๋ฐ, ๋ง์ฝ ์ด ๋, ํธ์คํธ์ ๋ณผ๋ฅจ์ ๊ณต์ ํ๊ฒ ๋๋ฉด ํธ์คํธ์ root ๊ถํ์ ๊ฐ์ง ์ ์์์ ์๋ฏธํจ. ์ด๋ ๊ฒ ๋๋ฉด ์ปจํ
์ด๋์์ ํธ์คํธ์ root ๊ถํ์ ์ด์ฉํ์ฌ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋๋ก ์กฐ์ํ ์ฌ์ง๊ฐ ์์ - ๊ทธ๋์ ๋ณดํต ์ปจํ ์ด๋๋ฅผ ์ต์ข ์ ์ผ๋ก ๋ฐฐํฌํ ๋๋ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํด ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํจ |
ONBUILD [๋ช ๋ น์ด] | ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ชจ๋ก ํ๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ Dockerfile๋ก ์์ฑ๋ ๋ ์คํํ ๋ช ๋ น์ด | - ๋์ค์ ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์ ์ฅํด๋์ ์ ์๋ ๋ช
๋ น์ด๋ฅผ ๋ช
์ํจ - ONBUILD์ ๋ช ์๋ ๋ช ๋ น์ด๋ ๋ถ๋ชจ ์ด๋ฏธ์ง์์๋ ์คํ๋์ง ์๊ณ , ๋ฐ๋์ ์์ ์ด๋ฏธ์ง์์๋ง ์คํ๋จ. ๋ํ ์์ ์ด๋ฏธ์ง์ ์์ ์ด๋ฏธ์ง(์ฆ, ๋ถ๋ชจ์ ์ฅ์์ ์์ ์ด๋ฏธ์ง)์๋ ONBUILD ๋ช ๋ น์ด๊ฐ ์คํ๋จ |
STOPSIGNAL [SIGNAL] | ์ปจํ ์ด๋๊ฐ ์ ์ง๋ ๋ ์ฌ์ฉ๋ ์์คํ ์ฝ(ํ๋ก์ธ์ค์๊ฒ ์ ์กํ๋ ์ ํธ)์ ์ข ๋ฅ๋ฅผ ์ง์ | - ์ฌ๊ธฐ์ SIGNAL์ ์ข
๋ฅ๋ ๋ฆฌ๋
์ค ํฌ์คํ
์์ ๋ฐฐ์ด ๊ฒ์ ์๋ฏธ - ๋ํดํธ ์ ํธ๋ SIGTERM์ - docker run ์๋ --stop-signal ์ต์ ์ผ๋ก, docker stop, kill ์์๋ --signal ์ต์ ์ผ๋ก ๊ฐ๋ณ์ ๋ช ์ ๊ฐ๋ฅ |
HEALTHCHECK [OPTIONS] [ex. curl ๋ช ๋ น์ด] | Dockerfile์ ๋น๋ํ ์ด๋ฏธ์ง๋ก๋ถํฐ ์์ฑ๋ ์ปจํ ์ด๋ ์์์ ๋์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋์ํ๋์ง ์ํ๋ฅผ ์ฒดํฌํ๋ ๋ช ๋ น์ด | - ex) HEALTHCHECK --interval=1m --timeout=3s --retries=3 [CMD curl -f https://localhost] - ์ ๋ช ๋ น์ด ์๋ฏธ๋ 1๋ถ ๋ง๋ค 3์ด ์ด์์ด ์์๋๋ฉฐ 3๋ฒ ์ด์ ํ์์์์ด ๋ฐ์ํ๋ฉด ์ปจํ ์ด๋ ์์ฑ๊ฐ unhealthy ์ํ๊ฐ ๋จ - ์ฃผ๊ธฐ์ ์ธ ์ํ ์ฒดํฌ์ ๋ํ ๋ก๊ทธ ๊ฒฐ๊ณผ๋ docker inspect ๋ช ๋ น์ด์ ๊ฒฐ๊ณผ ๋ถ๋ถ ์ค "State -> Helath -> Log" ํญ๋ชฉ์์ ๋ณผ ์ ์์ |
SHELL | Dockerfile์ ๋น๋ํ ์ด๋ฏธ์ง๋ก๋ถํฐ ์์ฑ๋ ์ปจํ ์ด๋ ์์์ ์ฌ์ฉํ ์ ธ ์ข ๋ฅ๋ฅผ ๋ช ์ | - Dockerfile์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์
ธ์ sh ์
ธ์ - ๋ง์ฝ, bash๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด SHELL ["/bin/bash"] ํํ๋ก bash ๋ช ๋ น์ด ํ์ผ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ๋ช ์ํด์ฃผ๋ฉด ๋จ |
5-5. ADD vs COPY ๋ช ๋ น์ด ์ฐจ์ด
Dockerfile ๋ช ๋ น์ด ์ค์ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ์์ ์ฝ์ด๋ค์ธ ๋น๋ ์ปจํ ์คํธ์ ํ์ผ๋ค์ ์ด๋ฏธ์ง์ ์ถ๊ฐํ๋ ๋ช ๋ น์ด๋ค์ด ์๋ค. ๋ฐ๋ก ADD, COPY์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ ๊ฐ์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น? COPY๋ ๋น๋ ์ปจํ ์คํธ์ ์๋ ํ์ผ(๋๋ ๋๋ ํฐ๋ฆฌ)๋ง ์ด๋ฏธ์ง์ ์ถ๊ฐํ ์ ์์ง๋ง ADD๋ ๊น๊ณผ ๊ฐ์ ์ธ๋ถ URL ๋ฐ ์์นด์ด๋ธ/์์ถ ํ์ผ์ธ tar ํ์ผ๋ ์ด๋ฏธ์ง์ ์ถ๊ฐํ ์๊ฐ ์๋ค. ์ฆ, COPY์ ๊ธฐ๋ฅ์ ADD์ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ผ๊ณ ํ ์ ์๋ค. ํนํ ์ ๊ธฐํ ๊ฒ์ ADD๋ฅผ ํตํด tar ํ์ผ์ ๋ช ์ํ๋ฉด ์์์ ์์นด์ด๋ธ ๋ฐ ์์ถํด์ ๋ฅผ ํด์ฃผ๊ฒ ๋๋ค.
ํ์ง๋ง ADD ๋ณด๋ค๋ COPY๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์ฑ ์์๋ ๊ถ์ฅํ๋ค. ์๋ํ๋ฉด ADD๋ฅผ ์ฌ์ฉํด์ ์ธ๋ถ URL ๋ฐ tar ํ์ผ์ ์ด๋ฏธ์ง์ ์ถ๊ฐํ๋ค๊ณ ํ์ ๋ ํด๋น URL ๋๋ tar ํ์ผ์ ์ ํํ ์ด๋ค ํ์ผ์ด ์๋์ง ๋ชจ๋ฅด๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง๋ง๋ก ์ธ๋ถ ํ์ผ์ ์ ์ฑ์ฝ๋ ๊ฐ์ ๊ฒ๋ค์ด๋ผ๋ ์ฌ์ด๋๋ ๊ฒฝ์ฐ์ ํฐ ์ฌ๊ณ ๊ฐ ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
5-6. ENTRYPOINT vs CMD ๋ช ๋ น์ด ์ฐจ์ด
๋ค์์ผ๋ก ์์๋ณผ ๋ ๋ช ๋ น์ด๋ ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ๋ ENTRYPOINT ์ CMD ์ด๋ค. ์ฐ์ ์ด ๋ ๋ช ๋ น์ด๋ ๊ณตํต์ ์ผ๋ก ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช ๋ น์ด๋ฅผ ์ง์ ํ๋ค๋ ์ ์ด ๊ฐ์ง๋ง, ENTRYPOINT๋ CMD(์ปค๋งจ๋)๋ฅผ ์ธ์๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์๋ ์คํฌ๋ฆฝํธ์ ์ญํ ๋ ํ ์ ์๋ค๋ ๊ฒ์ด ์ฐจ์ด์ ์ด๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด docker run ๋ช ๋ น์ด์ ๋งจ๋ค์ธ CMD(์ปค๋งจ๋)๋ฅผ ๋ช ์ํ๋ ์๋ฆฌ์ /bin/bash ๋ฅผ ์ ๋ ฅํจ์ผ๋ก์จ ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ค์ด๊ฐ์ bash ์ ธ์ ํ์ฑํ ํ๋๋ก ํด๋ณด์.
$ docker run -it --name cmd_container ubuntu:14.04 /bin/bash
๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ์ปจํ ์ด๋ ๋ด๋ถ์์ ํ์ฌ ์ฌ์ฉ์ค์ธ ์ ธ์ ํ์ธํ ์ ์๋ ๋ช ๋ น์ด์ธ echo $SHELL์ ์ณ๋ณด๋ฉด ์๋์ ๊ฐ์ ํ์ค์ถ๋ ฅ ํ๋ฉด์ด ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด์ docker run ๋ช ๋ น์ด์์ ENTRYPOINT๋ฅผ ์ฌ์ฉํด๋ณด์. docker run ๋ช ๋ น์ด์์๋ --entrypoint ๋ผ๋ ์ต์ ์ ์ค ์ ์๋ค. ์ฌ๊ธฐ์๋ ์ปจํ ์ด๋ ๋ด๋ถ์ ๋ค์ด๊ฐ /bin/bash ์ ธ์ ํ์ฑํ์ํค๋ ๊ฒ์ด ์๋ /bin/bash ๋ผ๋ ์ถ๋ ฅ์ ๋ณด์ฌ์ฃผ๋๋ก ํ๊ธฐ ์ํด echo /bin/bash ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋๋ก ํด๋ณด์. ๋ช ๋ น์ด๋ ์๋์ ๊ฐ๋ค.
$ docker run -it --name entrypoint_container --entrypoint="echo" ubuntu:14.04 /bin/bash
์ ๋ช ๋ น์ด๋ฅผ ์น๋ฉด ์์ฑํ ์ปจํ ์ด๋ ์์์ echo /bin/bash ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํ์ค์ถ๋ ฅ์ผ๋ก ๋ด๋ฑ์ด์ค ํ, ํด๋น ์ปจํ ์ด๋๋ฅผ ๋ฉ์ถ๋ฉด์ ํธ์คํธ๋ก ๋ค์ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฆ, docker run ๋ช ๋ น์ด์์ ENTRYPOINT๋ CMD๋ฅผ ์ธ์๋ก ๋ฐ์์, ์ ์์์์๋ CMD๊ฐ /bin/bash ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๋ช ๋ น์ด๋ฅผ ENTRYPOINT์ echo ์ธ์๋ก ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ENTRYPOINT๊ฐ ์ค์ ๋์ง ์์๋ค๋ฉด CMD์ ์ค์ ๋ ๋ช ๋ น์ด๋ฅผ ๊ทธ๋๋ก ์คํํ์ง๋ง, ENTRYPOINT๊ฐ ์ค์ ๋์ด ์์ ๋๋ CMD๋ ๋จ์ง ENTRYPOINT์ ๋ช ์๋ ๋ช ๋ น์ด์ ์ธ์(argument) ์ญํ ๋ง ํ๋ ์ ์ด๋ค.
๋ฌผ๋ก ์์์ ์ฒ๋ผ ๊ฐ๋จํ echo ๋ช ๋ น์ด๋ฅผ ENTRYPOINT๋ก ํ์ฉํ ์๋ ์๊ฒ ์ง๋ง ๋ณดํต์ ํน์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ ์ํด์ ENTRYPOINT์ CMD๋ฅผ ์กฐํฉํด์ ๋ง์ด ์ฌ์ฉํ๋ค. ์ด๋ฒ์๋ Dockerfile์์ ENTRYPOINT์ CMD๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์์๋ฅผ ๋ค์ด ํ ๋ฒ ์ดํด๋ณด๋๋ก ํ์. ๋จผ์ ์๋์ ๊ฐ์ Dockerfile๊ณผ example.sh ์ด๋ผ๋ ์ ธ ์คํฌ๋ฆฝํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install apache2 -y
ADD example.sh /example.sh
RUN chmod a+x /example.sh
ENTRYPOINT ["/bin/bash", "/example.sh"]
#!/bin/bash
#example.sh
echo $1 $2
apachectl -DFOREGROUND
์ example.sh ์คํฌ๋ฆฝํธ์์ $1, $2๋ก ํด๋น ์ ธ ์คํฌ๋ฆฝํธ์ ์ธ์๋ฅผ ๋ฐ์ ๊ฒ์ echo๋ก ์ถ๋ ฅํ๋๋ก ํ๋ค. ํน์ ์ ธ ์คํฌ๋ฆฝํธ์์์ ์ธ์๋ฅผ ์ $1, $2๋ก ๋ฐ๋์ง ์ ๋ชจ๋ฅธ๋ค๋ฉด ์ด์ ๋ฆฌ๋ ์ค ํฌ์คํ ์ ์ฐธ์กฐํด๋ณด๋๋ก ํ์.
์ 2๊ฐ์ ํ์ผ์ ์์ฑํ ๋ค ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ํด๋น ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ด๋๋ฅผ detached(๋ฐฑ๊ทธ๋ผ์ด๋)๋ชจ๋๋ก ์์ฑํด๋ณด์.
$ docker build -t entrypoint:v1 .
$ docker run -d --name entrypoint_c1 entrypoint:v1 argument_1 argument_2
$ docker logs entrypoint_c1
๋ง์ง๋ง docker logs ๋ช ๋ น์ด๋ฅผ ํตํด ์ปจํ ์ด๋ ์์์ ๋ฐ์ํ ๋ก๊ทธ๋ฅผ ํ์ค์ถ๋ ฅ์ผ๋ก ์ดํด๋ณด๋ฉด ์ ธ ์คํฌ๋ฆฝํธ์ ์ธ์๋ก ์ค argument_1, argument_2๊ฐ echo ๋ช ๋ น์ด๋ฅผ ํตํด ์๋ ํ๋ฉด์ฒ๋ผ ์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ๊ฐ๋ก ์์๋ณผ ์ ์ ENTRYPOINT์ CMD ๋ช ๋ น์ด์์ JSON ๋ฐฐ์ด ํํ๋ก ์ฃผ๋ ๊ฒ๊ณผ ์ผ๋ฐ ํํ๋ก ์ฃผ๋ ๊ฒ์ ์ฐจ์ด์ ์ด๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ์ผ๋ฐ ํํ๋ก ์ฃผ๊ฒ ๋๋ฉด ๋ด๋ถ์ ์ผ๋ก ๋ฌด์กฐ๊ฑด sh ๋ผ๋ ์ ธ์ ์ฌ์ฉํ๋ค. ๋ค์ ๋งํด, ๋ง์ฝ ์๋์ ๊ฐ์ CMD๋ฅผ ์ค์ ํ๋ค๊ณ ํด๋ณด์.
FROM ubuntu:14.04
CMD echo "Hello world"
์ด๋ ๊ฒ ํ๋ฉด ์ ธ ํ๋กฌํํธ์์ ๋ช ๋ น์ด๋ก ์น์๋ฉด /bin/sh -c echo "Hello world" ๊ฐ ์ํ๋๋ ๊ฒ์ด๋ค. ๋ฐ๋ฉด์ ์๋์ ๊ฐ์ด JSON ๋ฐฐ์ด ํํ๋ก ๋ช ์ํ๋ฉด ์ค์ ๋ก JSON ๋ฐฐ์ด์ ๋ช ์ํ ๊ทธ๋๋ก ๋ช ๋ น์ด๋ฅผ ์ํํ๋ค.
FROM ubuntu:14.04
CMD ["/bin/bash", "echo Hello world"]
5-7. Dockerfile ๋น๋ ์ ์ฃผ์์
์ด์ ๋ง์ง๋ง์ผ๋ก Dockerfile์ ๋น๋ํ ๋ ์ฃผ์ํ ์ ์ ๋ํด์ ์์๋ณด๊ณ ๊ฐ์. Dockerfile ๊ณผ ์ด๋ฏธ์ง์ ๊ตฌ์กฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ดํด๋ด์ผ๋ก์จ ์ฃผ์ํด์ผ ํ ์ ์ ๋ฐฐ์ธ ์ ์๋ค. ์ฐ์ ํ๋ ๋ช ์ฌํ๊ณ ์๋ ๋ด์ฉ์ ์ฝ์ด๋๊ฐ๋ณด์. Dockerfile์์์ ๋ช ๋ น์ด ํ ์ค์ ํ๋์ ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๋ฅผ ์์ฑํ๋ค!(์ด ๋ด์ฉ์ ์ [๋ชฉ์ฐจ 5-3-2]์์ ๋ฐฐ์ ๋ค)
์ฐ์ ์๋์ ๊ฐ์ด ์์ Dockerfile์ด ์๋ค๊ณ ๊ฐ์ ํ์. ์ด Dockerfile์ ubuntu ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๊ณ ๊ทธ ์ด๋ฏธ์ง์ ํน์ ๋๋ ํ ๋ฆฌ ๋ด์ 100MB์ ๋๋ฏธํ์ผ์ ์์ฑํ ๋ค ์ญ์ ํ๋ ๋์์ ์ํํ๋ค.(์ฐธ๊ณ ๋ก fallocate ๋ช ๋ น์ด์ ๋ํด์๋ ์ด์ ๋ฆฌ๋ ์ค ํฌ์คํ ๋ ๋ฐฐ์ด์ ์ด ์๋ค)
FROM ubuntu:14.04
RUN mkdir /dummy
RUN fallocate -l 100M /dummy/dummy_file
RUN rm /dummy/dummy_file
$ docker run -t dummy_img:v1 .
ubuntu:14.04 ์ ์ด๋ฏธ์ง ์ฉ๋์ ๋๋ต 200MB๊ฐ ์๋๋ค. ๊ทธ๋ฐ ์ํ์์ ์์ ๊ฐ์ Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ฉด ์ด๋ฏธ์ง ์ฉ๋์ด ์ผ๋ง๋ ๋ ๊น? 100MB์ ๋๋ฏธ ํ์ผ์ ์์ฑํ์ง๋ง ๋ง์ง๋ง์ ์ญ์ ํ์ผ๋ฏ๋ก ์ ์ด๋ฏธ์ง๋ ubuntu:14.04 ์ด๋ฏธ์ง๋ ์ฉ๋์ด ๊ฑฐ์ ๋น์ทํ์ง ์์๊น? ์ง์ ํ์ธํด๋ณด์.
์ด์ํ๊ฒ ์ฌ์ด์ฆ๊ฐ 301MB๋ ๋๋ค. ๋์ฒด ์๊ทธ๋ฐ ๊ฒ์ผ๊น? ๋ฐ๋ก ์ปจํ ์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ์์ฑํ ๋ ์ปจํ ์ด๋์์ ๋ณ๊ฒฝ๋ ์๋ก์ด ์ฌํญ๋ง ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ Dockerfile์์ fallocate ๋ช ๋ น์ด๊ฐ ์๋ RUN ๋ช ๋ น์ด๋ก 100MB์ ๋๋ฏธํ์ผ์ ์์ฑํ๋ค. ๊ทธ ํ์ ๋ฐ๋ก rm ๋ช ๋ น์ด๊ฐ ์๋ RUN ๋ช ๋ น์ด๋ก ์ด ๋๋ฏธํ์ผ์ ์ญ์ ํ๋ค๊ณ ํ๋ค ์ค์ ๋ก ๊ทธ ํ์ผ์ด ์ญ์ ๋๋ ๊ฒ์ด ์๋๋ผ "100MB ๋๋ฏธ ํ์ผ์ ์ญ์ ํจ" ์ด๋ผ๋ ๋ณ๊ฒฝ์ฌํญ๋ง ์ถ๊ฐ๋ก ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๋ก ์ถ๊ฐ๋๋ ๊ฒ ๋ฟ์ด๋ค. ๋ฐ๋ผ์ 100MB์ ๋๋ฏธํ์ผ์ ์ด๋ฏธ์ง ๋ ์ด์ด์ ๋จ์์๊ฒ ๋๊ณ ์ด๋ ๋ถํ์ํ ์ ์ฅ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ๋ ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ ๊ทธ๋ ๋ค๊ณ ํด์ ๋๋ฏธํ์ผ์ด ์ค๋ฌผ๋ก ๋จ์์์ง๋ ์๋ค. ๋ค์ ๋งํด, ํด๋น ์ด๋ฏธ์ง(dummy_img:v1 ์ด๋ฆ์ ์ด๋ฏธ์ง)๋ก ์ปจํ ์ด๋๋ฅผ ์์ฑํด์ ๋ด๋ถ๋ก ๋ค์ด๊ฐ /dummy ๋ผ๋ ๊ฒฝ๋ก์ ๋ค์ด๊ฐ ๋ณด๋ฉด 100MB์ ๋๋ฏธ ํ์ผ์ ์กด์ฌํ์ง ์๋ ๊ฒ์ ์ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒ์ ๋ฌด์์ผ๊น? ๋ฐ๋ก Dockerfile์ ์ฐ๋ ๋ช ๋ น์ด๋ฅผ ๋ฌถ์ ์ ์๋ ๊ฒ๋ค์ ํ๋๋ก ๋ฌถ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ด ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด๊ฐ && ๋ช ๋ น์ด์ด๋ค. ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ RUN ๋ช ๋ น์ด๋ฅผ ํ๋๋ง ์ฐ๊ณ ๊ฑฐ๊ธฐ์ ๋ค ๋ชฐ์์ ๋ช ์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ ํ๋์ RUN ๋ช ๋ น์ด ๋น ํ๋์ ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๊ฐ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์ Dockerfile์ ๊ฐ์ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ๊ฐ์ ํ ์ ์๋ค.
FROM ubuntu:14.04
RUN mkdir /dummy && \
fallocate -l 100M /dummy/dummy_file && \
rm /dummy/dummy_file
$ docker build -t dummy_img:v1 .
๊ทธ๋ฆฌ๊ณ ์ 2๊ฐ์ ์ด๋ฏธ์ง ์ฉ๋์ ํ๋ฒ ๋น๊ตํด๋ณด์.
๊ฐ์ ํ Dockerfile ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ dummy_img:v2 ๋ผ๋ ์ด๋ฏธ์ง๊ฐ 197MB๋ก ์ฝ 100MB ๋ ์ฉ๋์ด ์ ์ ๊ฒ์ ์ ์ ์๋ค.
์ปจํ ์ด๋๋ฅผ ์ด๋ฏธ์ง๋ก ์์ฑํ ๋ ์ปจํ ์ด๋์์ ๋ณ๊ฒฝ๋ ์ฌํญ๋ง ์๋ก์ด ์ด๋ฏธ์ง ๋ ์ด์ด๋ก ์์ฑํ๋ ์ด ๋ฐฉ์์ด ๋ฐฉ๊ธ ๋จ์ ์ด๋ผ๊ณ ํ์ง๋ง ์ฅ์ ์ผ๋ก ํ์ฉ๋ ์๋ ์๋ค.
์๋ฅผ ๋ค์ด, A, B๋ผ๋ ๋ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ค๊ณ ํ ๋, ๋ ๊ฐ ๋ชจ๋ C๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฉ๋์ด ๊ฝค ์ปค์ ์ฝ 700MB ์ ๋๋ก ํฐ ์ฌ์ด์ฆ๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ์ด ๋, ์ฐ๋ฆฌ๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ A, B ์ปจํ ์ด๋ ๊ฐ๊ฐ์ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ณ๋ก ์ค์นํ๋ค๊ณ ํ๋ฉด ๋๋ต์ ์ผ๋ก ์ต์ํ 1.4GB๊ฐ ๋๋ ์ ์ฅ๊ณต๊ฐ์ ์ฐจ์งํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ํ์ง ์๊ณ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ค์น๋ ์ด๋ฏธ์ง๋ฅผ ๋จผ์ ํ๋ ๋ง๋ ๋ค์, ์ด ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก A, B ์ปจํ ์ด๋๋ฅผ ๊ฐ๋ฐํ๋ฉด ์ฐ๋ฆฌ๋ ๋๋ต์ ์ผ๋ก ์ต์ํ 700MB๊ฐ ๋๋ ์ ์ฅ๊ณต๊ฐ์ ์ฐจ์งํ๊ฒ ๋๋ฏ๋ก ์ ์์ ๊ฒฝ์ฐ๋ณด๋ค ์ ๋ฐ์ ์ ์ฅ๊ณต๊ฐ ํจ์จ์ ์ป์ด๋ผ ์ ์๋ค.
์ด๋ ๊ฒ ํด์ ๋์ปค ์ด๋ฏธ์ง์ ๋ํ ๊ฐ๋ ๊ณผ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ง๋ค๊ณ ๋ค์ํ ๋์์ ์ํํ ์ ์๋ Dockerfile์ ๋ํด์๋ ์ฌ๋ฌ๊ฐ์ง ์์๋ณด์๋ค. ๋ค์ ํฌ์คํ ์์๋ ๋์ปค ๋ฐ๋ชฌ์ด๋ผ๋ ๊ฒ์ ๋ํด์ ์์๋ณด๋๋ก ํ์.
'Container > Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ํ๋๋ก ๋ฌถ์ด ๊ด๋ฆฌํ์, Docker Compose (0) | 2023.05.28 |
---|---|
[Docker] ์ฌ๋ฌ ํธ์คํธ์ ๋์ปค๋ฅผ ๊ด๋ฆฌํ์, Docker Swarm (2) | 2023.05.11 |
[Docker] ์๋ฒ๋ก์์ ์ญํ , Docker Daemon (0) | 2023.04.19 |
[Docker] ๋์ปค ์ปจํ ์ด๋ ๋ค๋ฃจ์ด๋ณด๊ธฐ (1) | 2023.03.07 |
[Docker] ๋์ปค๋, ๊ทธ๋ฆฌ๊ณ ๋์ปค ์์ง์ ์ด๋ฏธ์ง์ ์ปจํ ์ด๋ (4) | 2023.02.15 |