What am I containerizing?


  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ์„œ๋น„์Šค๋ฅผ Docker Hub ์—์„œ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜น์€ ๊ฐœ๋ฐœ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Dockerize ํ•ด์„œ ๋ฐฐํฌ๊ฐ€ ์‰ฝ๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Docker Image ๋ฅผ ์‚ฌ์šฉํ•จ

How to create my own image?


  • Flask ๋ฅผ ์ด์šฉํ•œ ๋‹จ์ˆœํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์“ธ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ
    • Ubuntu ๊ฐ™์€ ์šด์˜์ฒด์ œ
    • apt ๋ช…๋ น์–ด๋กœ ์†Œ์Šค ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ
    • ์˜์กด์„ฑ์„ ์„ค์น˜
    • pip ๋ช…๋ น์–ด๋กœ Python ์˜์กด์„ฑ์„ ์„ค์น˜
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด ๋„ฃ์€ ๋’ค flask ๋ช…๋ น์–ด๋กœ ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ€๋™
  • Dockerfile ์ด๋ผ๋Š” ํŒŒ์ผ ์•ˆ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ ์Œ
FROM Ubuntu

RUN apt-get update && apt-get -y install python

RUN pip install flask flask-mysql

COPY . /opt/source-code

ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
  • ์ด์–ด์„œ docker build ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์ด๋ฏธ์ง€์˜ ํƒœ๊ทธ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ Dockerfile ์„ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ง€์ •, ์ด๋Ÿฌ๋ฉด ๋กœ์ปฌ์— ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋จ
    • docker build . -f Dockerfile -t mmumshad/my-custom-app
  • ํผ๋ธ”๋ฆญ Docker Hub Registry ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด docker push ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰, ์ด๋Ÿฌ๋ฉด ๊ณ„์ • ์ด๋ฆ„์ด ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด ๋จ
    • docker push mmumshad/my-custom-app

Dockerfile


FROM Ubuntu

RUN apt-get update && apt-get -y install python

RUN pip install flask flask-mysql

COPY . /opt/source-code

ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
  • Dockerfile ์€ Docker ๊ฐ€ ์ธ์‹ํ•˜๋„๋ก ํŠน์ • ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ
  • INSTRUCTION ๊ณผ ARGUMENT ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง
    • FROM Ubuntu
      • ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ์šด์˜์ฒด์ œ๋ฅผ ์ •์˜
      • ๋ชจ๋“  Docker Image ๋Š” ์šด์˜์ฒด์ œ ํ˜น์€ ์‚ฌ์ „์— ์šด์˜์ฒด์ œ์— ๊ธฐ๋ฐ˜ํ•ด ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๊ณผ ๊ฐ™์€ ๋˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€์— ๊ธฐ๋ฐ˜์„ ๋‘ 
    • RUN apt-get update && apt-get -y install python
      • RUN ๋ช…๋ น์–ด๋Š” Docker ๊ฐ€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์— ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•จ
    • COPY . /opt/source-code
      • COPY ๋Š” ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด Docker Image ์— ๋„ฃ์Œ
      • . /opt/source-codeํ˜„์žฌ ํด๋”์— ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ /opt/source-code ์— ๋ถ™์—ฌ๋„ฃ๋Š”๋‹ค๋Š” ์˜๋ฏธ
    • ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run
      • ENTRYPOINT ๋ช…๋ น์–ด๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰๋  ๋•Œ ์ž‘๋™ํ•  ๋ช…๋ น์–ด๋ฅผ ์ง€์ •

Layered Architecture

  • Docker ๋Š” ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•
  • ๋ช…๋ น์–ด ๊ฐ ์ค„์ด ์ด์ „ ๊ณ„์ธต์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ Docker Image ์— ์ƒˆ๋กœ์šด ๊ณ„์ธต์„ ์ƒ์„ฑํ•จ
    • ๊ณ„์ธต๋งˆ๋‹ค ์ด์ „ ๊ณ„์ธต์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ์—์„œ๋„ ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
    • docker history mmumshad/simple-webapp ์„ ์‹คํ–‰ํ•˜๋ฉด ํ™•์ธ ๊ฐ€๋Šฅ

Docker build output

  • docker build . ์‹คํ–‰ ์‹œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์™€ ์ž‘์—…๋ณ„ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ๋ชจ๋“  ๊ณ„์ธต์€ ์บ์‹œ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํŒจํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ docker build ๋ฅผ ์žฌ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๋˜ํ•œ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ์ƒˆ๋กœ์šด ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ ์—…๋ฐ์ดํŠธ๋Š” ๋นˆ๋ฒˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์žฌ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅ

Demo


docker run -it ubuntu bash
apt-get update
apt-get install -y python
apt-get install python-pip
pip install flask
# Copy code to /opt/app.py
FLASK_APP=/opt/app.py flask run --host=0.0.0.0
  • Dockerfile ์—†์ด ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ ํ•  ๊ฒฝ์šฐ
FROM ubuntu

RUN apt-get update
RUN apt-get install -y python
RUN apt-get install python-pip

COPY app.py /opt/app.py

ENTRYPOINT FLASK_APP=/opt/app.py flask run --host=0.0.0.0
  • ์œ„์™€ ๊ฐ™์€ Dockerfile ์„ ๋งŒ๋“ค๊ณ  docker build . -t my-simple-webapp ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
  • ์ด๋ฏธ์ง€ ์ƒ์„ฑ ํ›„ docker images ๋ช…๋ น์–ด ์‚ฌ์šฉ ์‹œ my-simple-webapp ์ด๋ฏธ์ง€๊ฐ€ ์ƒ์„ฑ๋˜์–ด์žˆ์Œ
  • docker run my-simple-webapp ์‹คํ–‰ ์‹œ ์ฒ˜์Œ ์ˆ˜๋™ ์‹คํ–‰๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ

Environment Variables


  • docker run -e APP_COLOR=blue simple-webapp-color
    • -e ์˜ต์…˜์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๊ฐ€๋Šฅ
  • docker inspect blissful_hopper
    • docker inspect ๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ
    • "Config" ์„น์…˜์—์„œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€์ง„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ ๊ฐ€๋Šฅ

CMD vs ENTRYPOINT


  • CMD ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•  ๋ช…๋ น์–ด
    • ubuntu ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ CMD ["bash"]
FROM Ubuntu

CMD sleep 5
  • ์œ„ Dockerfile ๋กœ docker build . -t ubuntu-sleeper
    • docker run ubuntu-sleeper sleep 10 ์‹คํ–‰ ์‹œ CMD ๊ฐ€ sleep 10 ์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง
FROM Ubuntu

ENTRYPOINT ["sleep"]
  • ENTRYPOINT ์‚ฌ์šฉ ์‹œ docker run ubuntu-sleeper 10 ๋กœ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ

์ฆ‰, CMD ์˜ ๊ฒฝ์šฐ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์™„์ „ํžˆ ๋Œ€์ฒด๋˜๋Š” ๋ฐ˜๋ฉด, ENTRYPOINT ์˜ ๊ฒฝ์šฐ ๋ช…๋ น์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋จ

FROM Ubuntu

ENTRYPOINT ["sleep"]

CMD ["5"]
  • Dockerfile ์„ ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•  ๊ฒฝ์šฐ (JSON ํฌ๋งท์œผ๋กœ ์„ค์ •ํ•ด์•ผ ๋จ)
    • docker run ubuntu-sleeper ์‹คํ–‰ ์‹œ sleep 5 ๊ฐ€ ์‹คํ–‰๋จ
    • docker run ubuntu-sleeper 10 ์‹คํ–‰ ์‹œ sleep 10 ๊ฐ€ ์‹คํ–‰๋จ
    • docker run --entrypoint sleep2.0 ubuntu-sleeper 10 ์‹คํ–‰ ์‹œ sleep2.0 10 ๊ฐ€ ์‹คํ–‰๋จ

References