๐Ÿณ Docker study 4th

Running RStudio on Docker: Leveraging GPU for Data Analysis

by Arielle


Docker Study

์•ž์„  <Docker study 3rd>ํฌ์ŠคํŒ…์—์„œ๋Š” Kaggle Image๋ฅผ ์ด์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ ์ฆ‰, ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ Python์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ–ˆ๋‹ค. ์ด๋ฒˆ 4์ฃผ์ฐจ์—๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ™˜๊ฒฝ์ธ R์„ Kaggle Image๋ฅผ ์ด์šฉํ•ด ๋นŒ๋“œํ•ด๋ณด๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ–ˆ๋‹ค. โ€˜Dockerfileโ€™์— ๋Œ€ํ•ด์„œ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๋‹ค๋ค˜๋Š”๋ฐ ๋ถ„๋ช… ์ง€๋‚œ 3์ฃผ์ฐจ์— ๋‹ค๋ฃฌ ๋‚ด์šฉ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‘์šฉ ์ชฝ์œผ๋กœ ๋“ค์–ด์˜ค๋‹ˆ ๋ญ”๊ฐ€ ๋‹ค์‹œ ๋จธ๋ฆฌ๊ฐ€ ์ƒˆํ•˜์–˜์ง€๋Š” ๊ธฐ๋ถ„์ด์—ˆ๋‹ค. (์ „์ƒ์— ๊ธˆ๋ถ•์–ด์˜€๋‚˜๋ณด๋‹ค.๐Ÿคฆโ€โ™€๏ธ) ์•„๋งˆ ์ƒˆ๋กœ์šด ๊ฐœ๋…์˜ ์—ฐ์†์ด๋‹ค ๋ณด๋‹ˆ ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ๋Š๋ฆฐ ๊ฒƒ ๊ฐ™์€ ๋ฐ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜์ง€๋Š” ๋“ค์–ด ๋‹คํ–‰์ธ ๋“ฏ ์‹ถ๋‹ค.

ํ˜น์‹œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์— ๋“ค์–ด๊ฐ€๊ธฐ ์•ž์„œ โ€˜Dockerfileโ€™์ด ๋ฌด์—‡์ธ์ง€ ๋”ฑ ํ•œ๋ฒˆ์— ํ•œ์ค„๋กœ ์ •๋ฆฌ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ด์ „ ํฌ์ŠคํŒ… ์ค‘ ๐Ÿ“‚ย Dockerfile? ์ด ๋ถ€๋ถ„์„ ํ›„๋”ฑ ์ฝ๊ณ  ์˜ค๋Š” ๊ฑธ ์ถ”์ฒœํ•œ๋‹ค! ๐Ÿ


1. Setting up a R analysis environment

1.1 Installing a Kaggle GPU image for R

โ€™Kaggle gpu R imageโ€™ ๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ์—์„œ R์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ์œ„ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋งํฌ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์•ž์„œ Kaggle์˜ Python ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฏธ์ง€ ๋นŒ๋“œ์™€ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์€ ์‰ฝ๊ฒŒ ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ์„ค์น˜ ์‹œ์ (2024.10.14) ๊ธฐ์ค€ R์˜ ์ตœ์‹  ๋ฒ„์ „์€ v59์ด๋‹ค.

๋‚˜๋Š” docker pull gcr.io/kaggle-gpu-images/rstats:v59 ๋กœ ๊ฐ€์ƒ๋จธ์‹ ์— ์„ค์น˜ํ–ˆ๋‹ค.

Descriptive Alt Text

1.2 Running an R container in the RStudio Server IDE environment

์ง€๊ธˆ๊นŒ์ง€ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด ๋จผ์ € ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ์ด๋ฅผ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ, ์ฆ‰ ๊ฐ€์ƒํ™˜๊ฒฝ์˜ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” IDE ํ™˜๊ฒฝ(Web)์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋Š” ๋ฐฉ๋ฒ•์„ RStudio Server๋ฅผ ์ด์šฉํ•ด ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค.

์•„๋ž˜ ์‚ฌ์ง„์€ ์‹ค์ œ๋กœ R ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด IDE์— ์ ‘๊ทผํ•œ ๊ฒฐ๊ณผ์ธ๋ฐ, ๋ณด๋ฉด ์›น์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Descriptive Alt Text

์ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์ด ๋ช…๋ น์–ด ํ•œ ์ค„ ์ด๋ฉด ๊ฐ€๋Šฅํ•˜๋‹ค. ์กฐ๊ธˆ ๊ธธ๊ธด ํ•˜์ง€๋งŒ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฝ์–ด๋ณด๋ฉด ๋˜ ์™„์ „ํžˆ ๋ชป ํ•  ๊ฒƒ๋„ ์•„๋‹Œ ๋“ฏ ์‹ถ๋‹ค.

โœ… Rstudio Web Browser connect code ย docker run -d -p 8787:8787 --gpus all -v "/home/Arielle/rproject:/home/rstudio/rproject" --name rstudio-container gcr.io/kaggle-gpu-images/rstats:v59 /bin/bash -c "rstudio-server start && tail -f /dev/null"

docker run -d๋Š” ์ƒˆ๋กœ์šด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง€์ •๋œ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•ด ์‹คํ–‰์‹œํ‚ค๋Š” ๋ช…๋ น์–ด์ด๋‹ค. -d ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด โ€œDetached modeโ€๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š”๋ฐ, ๋•๋ถ„์— ํ„ฐ๋ฏธ๋„์ด ์ปจํ…Œ์ด๋„ˆ์— ๋ฌถ์ด์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ๋‹ค! ๋งŒ์•ฝ ํ•ด๋‹น ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ„ฐ๋ฏธ๋„์ด ๊ทธ ์ž‘์—…์—๋งŒ! ๋ถ™์žกํ˜€ ์žˆ์–ด ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค!

-p 8787:8787 ์˜ ๊ฒฝ์šฐ ํฌํŠธ ํฌ์›Œ๋”ฉ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์˜ 8787 ํฌํŠธ(์ฆ‰, RStudio Server๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ธฐ๋ณธ ํฌํŠธ)๋ฅผ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋™์ผํ•œ 8787 ํฌํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด ์„ค์ • ๋•๋ถ„์— ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ โ€˜http://localhost:8787โ€™์„ ์ž…๋ ฅํ•˜๋ฉด RStudio Server์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ, ์‚ฌ์‹ค ๋‚˜๋Š” ํฌํŠธ์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ๋”ฑ ์ •๋ฆฌ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์€ ์ƒํƒœ์—์„œ ๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ ๊ฒŒ ๋งž๋Š”์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์› ๋‹ค.(์•„๋งˆ ๋‚ด๊ฐ€ ์•„๋Š” ํฌํŠธ๋Š” 1004, 22๋ฒˆ ํฌํŠธ ์ •๋„??๐Ÿคจ)๊ทธ๋ž˜์„œ ๋‹ค์‹œ๋Š” ํฌํŠธ์— ๋Œ€ํ•ด์„œ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋‹ค์ง์œผ๋กœ ์ด์— ๋Œ€ํ•ด์„œ ์ž ๊น ์ •๋ฆฌํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ณ ์ž ํ•œ๋‹ค!


๐Ÿšชย Port?

์ผ๋‹จ ๋‚˜๋Š” Port๊ฐ€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด์ง€๋งŒ ์•Œ๊ฒŒ๋ชจ๋ฅด๊ฒŒ ์—ฌ๊ธฐ์ €๊ธฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธด ํ–ˆ๋‹ค. ์•ž์„œ RDP ๋ฐฉ์‹์œผ๋กœ MAC ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ๋•Œ๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์€ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ Port์˜ ๊ฐœ๋…์„ ์ •๋ฆฌํ•œ ๊ทธ๋ฆผ์ด๋‹ค.

Descriptive Alt Text

ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์ธก๋ฉด์—์„œ ์ดํ•ดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ขŒ์ธก์ฒ˜๋Ÿผ ์„œ๋ฒ„์—๊ฒŒ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ์„œ๋น„์Šค ๊ฐ๊ฐ์—๊ฒŒ ๋ถ€์—ฌ๋œ ํŠน์ • ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ RDP ๋ฐฉ์‹์€ 3389 ํฌํŠธ๋ฅผ, SSH๋Š” 22๋ฒˆ ํฌํŠธ๋ฅผ, ๊ทธ๋ฆฌ๊ณ  VNC๋Š” 5900๋ฒˆ ํฌํŠธ๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ๊ด€์ ์—์„œ ์ดํ•ดํ•ด๋ณด๋ฉด ์–ด๋–จ๊นŒ? ์ด ๊ด€์ ์—์„œ๋Š” ๊ธฐ์กด์˜ ํด๋ผ์ด์–ดํŠธ๊ฐ€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ(Local Host)๋กœ ์„œ๋ฒ„๋Š” ์ปจํ…Œ์ด๋„ˆ(Container) ๊ฐœ๋…์œผ๋กœ ๋ฐ”๊พธ์–ด ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค(ํ•˜๋‚˜์˜ ํŠน์ • ํ”„๋กœ๊ทธ๋žจ)์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋…๋ฆฝ๋œ ์ปดํ“จํ„ฐ๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆผ์—๋„ ๋‚˜์™€ ์žˆ๋“ฏ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” โ€˜User Spaceโ€™๋ผ๋Š” ํ•˜๋‚˜์˜ Operating system ์œ„์— ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋น„์Šค(Image)๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ๋„ ๊ผญ ๊ธฐ์–ตํ•˜๋„๋ก ํ•˜์ž!

ํฌํŠธ ์ด์•ผ๊ธฐ ํ•˜๋‹ค๊ฐ€ ์™œ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ ํ•˜๋Š”์ง€ ์˜๋ฌธ์ด ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์•ž์„œ ํฌํŠธ๋ฒˆํ˜ธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๋•Œ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค ๋ณ„๋กœ ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์—ฌ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ๋ถ„๋ช… ์ง€๊ธˆ ๋‚ด๊ฐ€ ๋‹ค์šด ๋ฐ›์€ RStudio ์„œ๋น„์Šค ์—ญ์‹œ ๋ถ„๋ช… ๊ณ ์œ ํ•œ ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ -p 8787:8787 ์ด ๋ช…๋ น์–ด์— ๋ณด์ด๋Š” 8787๋ฒˆ ํฌํŠธ์ธ ๊ฒƒ์ด๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ๋ณด๋ฉด 8787์ด โ€˜:โ€™๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ž๋’ค ๋‘๋ฒˆ ์“ฐ์—ฌ ์žˆ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐ ์•ž์˜ 8787์€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ๋ถ€์—ฌ๋œ ํฌํŠธ ๋ฒˆํ˜ธ์ด๊ณ , ๋’ค์— ์žˆ๋Š” 8787์€ ์ปจํ…Œ์ด๋„ˆ์— ๋ถ€์—ฌ๋œ ํฌํŠธ ๋ฒˆํ˜ธ์ด๋‹ค. ๊ธฐ์กด ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์˜ ๊ด€์ ์—์„œ ์„œ๋ฒ„ ํ•œ์ชฝ์—๋งŒ ๋ถ€์—ฌ ๋˜์—ˆ๋˜ ํฌํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ ์–‘์ชฝ ๋‹ค ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์žˆ๋‹ค.(์ฐจ์ด์ ์ด๋‹ค!!) ํ•œ๊ฐ€์ง€ ๋” ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ ์€ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ๋ถ€์—ฌ๋˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋Š” 8787์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ž„์˜ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋Ÿผ ๋˜ ๊ถ๊ธˆํ•œ ๊ฒŒ ์ƒ๊ธด๋‹ค. ์–ธ์ œ ์ด ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ž„์˜๋กœ ์ง€์ •ํ• ๊นŒ? ๊ทธ๊ฑด ๋ฐ”๋กœ ๋™์ผํ•œ ๋จธ์‹ ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ RStudio Server ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์ด๋‹ค. ์ด๋•Œ๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋กœ์ปฌ ํฌํŠธ๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ์œ ์—ฐ์„ฑ(Piability)์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š” ํŽธ๋ฆฌ์„ฑ๊ณผ ๋”๋ถˆ์–ด ๊ฒฉ๋ฆฌ์„ฑ(Isolation) ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๊ฒฝ์šฐ ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ํฌํŠธ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‰ฌ์›Œ์ง€๊ฒŒ ๋œ๋‹ค. ์ด ๊ฐœ๋…์˜ ์—ฐ์žฅ์„ ์œผ๋กœ Isolation์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€์™€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์ƒํƒœ์—์„œ ๋™์ž‘ํ•œ๋‹ค. ์ด๋•Œ ํฌํŠธ ํŽ˜์–ด๋ฅผ ์ง€์ •ํ•ด ๋กœ์ปฌ๊ณผ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฉ๋ฆฌ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋˜๋Š” Docker์˜ ์ง„์งœ ํž˜์„ ๋ฐœํœ˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค!


๋‹ค์‹œ ์›น์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ๋Œ์•„์™€ ์ด์•ผ๊ธฐ ํ•ด๋ณด๋„๋ก ํ•˜์ž! ํฌํŠธ ์ง€์ •๊นŒ์ง€ ์™„๋ฃŒ๋œ ์ƒํƒœ์—์„œ ๋’ค๋ฅผ ๋ณด๋ฉด -gpus all ์ด ์žˆ๋‹ค. ์ด๊ฑด ๋”ฑ ์ ํ˜€์žˆ๋“ฏ์ด ์‹คํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋กœ์ปฌ์˜ GPU ์ž์›์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ์•ฝ ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— GPU๊ฐ€ ํƒ‘์žฌ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ƒ๋žตํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค.

v "/home/Arielle/rproject:/home/rstudio/rproject" ์ด ๋ถ€๋ถ„์€ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ(Volume Mount)๋ผ๋Š” ๊ฐœ๋…์œผ๋กœ Docker์—์„œ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค. ์ง€๊ธˆ ์—ฌ๊ธฐ์„œ๋Š” ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ /home/Arielle/rproject ๋””๋ ‰ํ† ๋ฆฌ์™€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ /home/rstudio/rproject ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํŽ˜์–ด๋งํ•จ์œผ๋กœ์จ ๋กœ์ปฌ์—์„œ ์ž‘์„ฑํ•œ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ƒ์„ฑํ•œ ํŒŒ์ผ๋„ ๋กœ์ปฌ์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์‹ค์ œ๋กœ ๋กœ์ปฌ์—์„œ mkdir testforlder ๋ช…๋ น์–ด ์‹คํ–‰์„ ํ†ตํ•ด ์ขŒ์ธก(Container with WEB)์˜ โ€˜testfolderโ€™ ์ƒ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Descriptive Alt Text

-name rstudio-container ์ด ์˜ต์…˜์€ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์œผ๋กœ ์—ฌ๊ธฐ์„œ๋Š” rstudio-container ๋ผ๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ๋งˆ์ง€๋ง‰ gcr.io/kaggle-gpu-images/rstats:v59 ๋ถ€๋ถ„์€ Docker ์ด๋ฏธ์ง€(RStudio)์˜ ๊ฒฝ๋กœ์™€ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋‚ด๊ณ  ์žˆ๋‹ค.


2. How to work Python package in R?

์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์— ์ž˜ ์ ‘์† ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Rํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, ์‚ฌ์‹ค ๋‚˜๋Š” R ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ค„ ๋ณธ ์ ์ด ์—†์–ด์„œ ์ €๊ฒŒ ๋ฌด์Šจ ๋ฌธ๋ฒ•์ธ๊ฐ€ ํ–ˆ๋‹ค. ์ผ๋‹จ reticulate::py_config()๋Š” R์—์„œ Python ํ™˜๊ฒฝ์„ ์„ค์ •ํ•˜๊ณ  ๊ทธ ํ™˜๊ฒฝ์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํŠน์ดํ•˜๊ฒŒ R์—์„œ๋Š”reticulate ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด Python์„ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์‹คํ–‰์‹œ์ผœ ๋ณด๋‹ˆ โ€œWould you like to create a default Python environment for the reticulate package? (Yes/no/cancel)โ€ ๋ฌธ๊ตฌ๊ฐ€ ์ฝ˜์†”์— ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๋ฌธ๊ตฌ๋Š” R๊ณผ ์—ฐ๋™ํ•  Python ํ™˜๊ฒฝ์ด ์•„์ง ์—†๋Š” ์ƒํƒœ๋กœ reticulate ํŒจํ‚ค์ง€๊ฐ€ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด Python ํ™˜๊ฒฝ ์„ค์น˜๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ๊ตฌ์˜€๋‹ค. ๊ทธ๋ž˜์„œ ์ผ๋‹จ YES! ๋กœ Python์„ ์„ค์น˜ํ•ด ์ฃผ์—ˆ๋‹ค.

Descriptive Alt Text

์ฐธ๊ณ ๋กœ ์œ„์—์„œ๋Š” RStudio IDE๋ฅผ ์ด์šฉํ•ด ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํ„ฐ๋ฏธ๋„ ๋ฐฉ์‹์œผ๋กœ RStudio๋ฅผ ํ™•์ธํ•ด ๋ณด์•˜๋‹ค.(์–ด์จ‹๋“  GUI, ํ„ฐ๋ฏธ๋„ ๋‘˜ ๋‹ค ๋ฐฐ์›Œ๋‘๋ฉด ์ข‹์œผ๋‹ˆ๊นŒ์š”!) docker ps๋กœ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„(rstudio-container)์„ ๋จผ์ € ํ™•์ธํ•ด ์ฃผ์—ˆ๊ณ , ์ด์–ด์„œ docker exec -it rstudio-container R๋กœ RStudio ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•ด์ฃผ์–ด ์ ‘์†ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ •์ƒ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ„ฐ๋ฏธ๋„์—์„œ๋„ R์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

โœ…ย  docker exec -it rstudio-container R ์—ฌ๊ธฐ์„œ -it ๋Š” -i (interactive), -t (tty)๊ฐ€ ํ•ฉ์ณ์ง„ ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉด์„œ ๋™์‹œ์— ํ„ฐ๋ฏธ๋„์—์„œ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด์™€ ์ถœ๋ ฅ์„ ๋ณด๊ธฐ ์œ„ํ•ด ํ™”๋ฉด์„ ํ„ฐ๋ฏธ๋„์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค! (์ฐธ๊ณ ๋กœ ํ•ด๋‹น ํ„ฐ๋ฏธ๋„์—์„œ exitํ•˜๊ณ  ์‹ถ์œผ๋ฉด q() ๋กœ ๋‚˜์˜ค๋ฉด ๋œ๋‹ค!)

Descriptive Alt Text

์•„๊นŒ RStudio(WEB)์—์„œ Python์„ ์„ค์น˜ํ•ด ์ฃผ์—ˆ๋‹ค. ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ๋ฌผ์–ด๋ณด๊ธธ๋ž˜ ์–ผ๋ž˜๋ฒŒ๋ž˜ ์„ค์น˜๋ฅผ ํ•˜๊ธฐ๋Š” ํ–ˆ๋Š”๋ฐ ์–ด๋””์— ์„ค์น˜ ๋˜์—ˆ๋Š”์ง€ ํ•œ๋ฒˆ ์ฏค์€ ํ™•์ธํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. reticulate::py_config() ๋กœ ํ„ฐ๋ฏธ๋„์—์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ /root/.local/share/r-minicconda/env/r-reticulate/bin/python ๊ฒฝ๋กœ์— ์œ„์น˜ํ•ด ์žˆ์Œ์„ ํ™•์ธํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ง€๊ธˆ ๋ณด๋ฉด r-miniconda ๋ผ๋Š” ํด๋”์˜ ํ•˜์œ„ ๊ฒฝ๋กœ์— python์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๊ฑธ๋กœ ๋ณด์ด๋Š”๋ฐ, ๋‚˜๋Š” ํ•ด๋‹น ํด๋”๋ฅผ ์ƒ์„ฑํ•œ ์ ์ด ๋ถ„๋ช… ์—†๋‹ค.

์ด๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ RStudio์™€ Python ํ™˜๊ฒฝ์„ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Descriptive Alt Text

Descriptive Alt Text

๋ฐ”๋กœ ์œ„ ๊ทธ๋ฆผ์œผ๋กœ ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž! ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด Keras, Tensorflow๊ฐ€ R์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ํ”Œ๋กœ์šฐ๋ฅผ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ์œผ๋กœ ์ด 5๋‹จ๊ณ„๋กœ ์ง„ํ–‰ ๋œ๋‹ค.

1๏ธโƒฃ R์—์„œ ๋”ฅ๋Ÿฌ๋‹์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด R Keras ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ, R ์ž์ฒด์—๋Š” Keras๋‚˜ TensorFlow๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Python ํŒจํ‚ค์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

2๏ธโƒฃย ์ž ์ด์ œ Python ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•จ์„ ์•Œ์•˜์œผ๋‹ˆ R๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ ํŠน์ดํ•˜๊ฒŒ R์—์„œ๋Š” reticulate ๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ /root/.local/share/r-minicconda/env/r-reticulate/bin/python ์ด ๊ฒฝ๋กœ์ฒ˜๋Ÿผ r-reticulate ๊ฐ€ python์˜ ์ƒ์œ„ ๊ฒฝ๋กœ์— ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค!

3๏ธโƒฃย ํ˜„์žฌ Python ํŒจํ‚ค์ง€์˜ ๊ฒฝ์šฐ reticulate๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Python ํ™˜๊ฒฝ์œผ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ผ๋ฉด ๋งŒ์•ฝ reticulate๊ฐ€ miniconda๋ผ๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, Python ํŒจํ‚ค์ง€๋Š” miniconda ํ™˜๊ฒฝ ์•ˆ์— ์„ค์น˜๋˜์–ด miniconda๊ฐ€ Python ํŒจํ‚ค์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์— ๋งŒ์•ฝ reticulate๊ฐ€ ๋‹ค๋ฅธ Python ํ™˜๊ฒฝ์„ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด,๊ทธ ํ™˜๊ฒฝ์— Python ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋œ๋‹ค๋Š” ๋œป์ด๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ์— ๋ฏธ๋ฆฌ ์„ค์น˜๋œ Python์ด ์žˆ๋‹ค๋ฉด ๊ทธ ํ™˜๊ฒฝ์œผ๋กœ Python ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์•„๋ฌดํŠผ ํฌ์ธํŠธ๋Š” reticulate๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Python ํ™˜๊ฒฝ์— ๋”ฐ๋ผ Python ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!

4๏ธโƒฃย ์œ„์˜ ๋‹จ๊ณ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋ฉด Python์„ ์œ„ํ•ด keras, tensorflow๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. keras๋Š” RStudio์—์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.(UI)

5๏ธโƒฃย ์ดํ›„ Tensorflow๋Š” Keras์˜ ๋ฐฑ์—”๋“œ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ์‹ค์งˆ์ ์ธ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.


3. Custom Dockerfile

์•ž์„œ Docker study 3rd์—์„œ Dockerfile์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค์—ˆ๋‹ค. ๊ทธ๋•Œ๋Š” ๋ถ•์–ด๋นต์„ ์˜ˆ๋กœ ๋“ค๋ฉด์„œ Dockerfile์„ ๋ถ•์–ด๋นต ํ‹€์„ ๋งŒ๋“œ๋Š” ๋ ˆ์‹œํ”ผ ์ •๋„๋กœ ์„ค๋ช… ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ์กฐ๊ธˆ ๋” ์†Œํ”„ํŠธ์›จ์–ด ๊ด€์ ์—์„œ ์ƒ๊ฐํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.


๐Ÿ“‚ย Dockerfile? (โ€™๐Ÿ‘‰๐ŸปDocker study 3rdโ€™)

#๋ถ•์–ด๋นต ํ‹€์„ ๋งŒ๋“œ๋Š” ๋ ˆ์‹œํ”ผ

Dockerfile์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•  ํ™˜๊ฒฝ์„ ๋งŒ๋“œ๋Š” ๋ ˆ์‹œํ”ผ๋กœ ์ƒ๊ฐํ•ด ๋ดค๋‹ค(๋ถ•์–ด๋นต๐ŸŸ๐Ÿž ๋‹ค์‹œ ๋“ฑ์žฅ). ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๊ทธ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ์•„๊ฐ€๊ฒŒ ํ•  ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ๊ทธ๋žจ์ด Python์œผ๋กœ ์งœ์—ฌ ์žˆ์œผ๋ฉด Python์„ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Dockerfile์€ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ํŒŒ์ผ์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

A. ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ์„ค์ •: ๋ถ•์–ด๋นต์„ ๋งŒ๋“ค ๋•Œ ์–ด๋–ค ๋ง›์˜ ๋ฐ˜์ฃฝ์„ ์“ธ์ง€ ์ •ํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ Python์ด๋‚˜ Ubuntu ๊ฐ™์€ ๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•œ๋‹ค!

B. ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜: ๋ถ•์–ด๋นต ๋ฐ˜์ฃฝ์— ํ•„์š”ํ•œ ์žฌ๋ฃŒ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค! ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œย ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถ•์–ด๋นต ๋ฐ˜์ฃฝ์— ์ดˆ์ฝœ๋ฆฟ ์นฉ์„ ๋„ฃ๋“ฏ, ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค!

C. ์‹คํ–‰ ๋ช…๋ น์–ด: ๋ถ•์–ด๋นต์ด ์™„์„ฑ๋œ ํ›„์— ์–ด๋–ป๊ฒŒ ๊ตฌ์šธ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ผœ์กŒ์„ ๋•Œ ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ• ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ•์–ด๋นต์„ ๊ตฝ๋Š” ์˜จ๋„์™€ ์‹œ๊ฐ„์„ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ”„๋กœ๊ทธ๋žจ ์—ญ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋  ๋ช…๋ น์–ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค!


Dockrfile์€ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ์•„๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํŒŒ์ผ๋กœ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋„ ์„ค์ •ํ•˜๊ณ , ์‹คํ–‰ ๋ช…๋ น์–ด๋„ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์€ ์œ„์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ Kaggle R ์ด๋ฏธ์ง€์˜ Dockerfile์ด๋‹ค. RUN, ADD, ENV, ARG, LABEL, CMD ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค๋กœ ํŒŒ์ผ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋“ค์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜์”ฉ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ•˜์ž!

Descriptive Alt Text


๐Ÿ’ป Related Commands

โœ…ย ADD : ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ๋‚ด ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ Docker ์ด๋ฏธ์ง€๋กœ ๋ณต์‚ฌ

  • ๋กœ์ปฌ ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ URL์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๊ณ  ๋งŒ์•ฝ ํ•ด๋‹น ํŒŒ์ผ์ด ์••์ถ•ํŒŒ์ผ์ผ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํ’€๋ฆฌ๊ธฐ๋„ ํ•จ
  • ADD kaggle/ /kaggle/
    • ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ์˜ kaggle/ ํด๋”๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ /kaggle/ ํด๋”๋กœ ๋ณต์‚ฌ

โœ…ย RUN : ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ง€์ •

  • ์ฃผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๊ณ , ์ด ๋ช…๋ น์–ด๋ฅผ ์“ธ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๊ฐ€ ๋งŒ๋“ค์–ด์ง!
  • ๐Ÿค”ย โ€™์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹คโ€™๋Š” ๋œป์€ ๋„์ปค์˜ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š”๋ฐ, Docker ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฝ๊ธฐ ์ „์šฉ ๋ ˆ์ด์–ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ๊ฐ ๋ ˆ์ด์–ด๋Š” ์ด์ „ ๋ ˆ์ด์–ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ์–ตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์šฐ๋ถ„ํˆฌ ์šด์˜์ฒด์ œ โ†’ ํŒจํ‚ค์ง€ ์„ค์น˜ โ†’ ํŒŒ์ผ ๋ณต์‚ฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ํ•œ ์Šคํ…์„ ์ด ๋ ˆ์ด์–ด(layer)๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค! ํšจ์œจ์„ฑ, ์บ์‹ฑ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฉ๋ฒ•์ž„์ด ๋ถ„๋ช…ํ•œ๋ฐ ์ƒˆ๋กœ์šด RUN ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถˆํ•„์š”ํ•œ RUN ๋ช…๋ น์–ด๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ํ•œ RUN ๋ช…๋ น์–ด์— ๋ฌถ์–ด์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•จ!๐Ÿ‘
  • RUN R -e "keras::install_keras(tensorflow = \"${TENSORFLOW_VERSION}\", extra_packages = c(\"pandas\"))"
    • R์„ ์‹คํ–‰ํ•ด์„œ keras, tensorflow, pandas ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•จ

โœ…ย ENV : ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •(docker run)

  • ์ด ๋ช…๋ น์œผ๋กœ ์„ค์ •๋œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ํ›„ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ์—๋„ ์œ ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•จ
  • ENV R_HOME=/usr/local/lib/R
    • R_HOME์ด๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ /usr/local/lib/R๋กœ ์„ค์ •

โœ…ย ARG : ์ด๋ฏธ์ง€ ๋นŒ๋“œ(docker build) ์‹œ์— ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜ ์ •์˜

  • ARG๋กœ ์ •์˜๋œ ๋ณ€์ˆ˜๋Š” ๋นŒ๋“œ ํƒ€์ž„(์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ๋•Œ)๊นŒ์ง€๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์‹คํ–‰๋  ๋•Œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • ARG GIT_COMMIT=unknown ARG BUILD_DATE_RSTATS=unknown
    • GIT_COMMIT๊ณผ BUILD_DATE_RSTATS๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ธฐ๋ณธ๊ฐ’์€ โ€˜unknownโ€™

โœ…ย LABEL : ์ด๋ฏธ์ง€์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ •๋ณด)๋ฅผ ์ถ”๊ฐ€ํ•จ

  • ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“  ๋‚ ์งœ๋‚˜ ์ปค๋ฐ‹ ์ •๋ณด ๋“ฑ์„ ๋„ฃ์–ด์„œ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋„์›€์ด ๋ผ์š”. key-value ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ
  • LABEL git-commit=$GIT_COMMIT LABEL build-date=$BUILD_DATE_RSTATS
    • git-commit๊ณผ build-date๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ GIT_COMMIT๊ณผ BUILD_DATE_RSTATS ๊ฐ’์„ ๋ผ๋ฒจ๋กœ ์ง€์ •ํ•จ

โœ…ย CMD : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น์„ ์ง€์ •

  • docker run ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์ถ”๊ฐ€ ๋ช…๋ น์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด CMD์—์„œ ์ •ํ•œ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋จ
  • CMD ["R"]
    • ์ด ๋ช…๋ น์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ R ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰

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

์•„๋ž˜ ์ฝ”๋“œ๋Š” RStudio ์„œ๋ฒ„ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑ๋œ Dockerfile์ด๋‹ค. ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋ฉด FROM gcr.io/kaggle-gpu-images/rstats:${rstats_version} ์„ ํ†ตํ•ด ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€(gcr.io/kaggle-gpu-images/rstats)๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Š” Kaggle GPU ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ R๊ณผ RStudio ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ๋ฐ”๋กœ ๋ฐ‘์˜ RUN ๋ถ€๋ถ„๋„ ์ค‘์š”ํ•œ๋ฐ, ๋’ค์˜ ๋ช…๋ น์–ด๋“ค์„ ํ†ตํ•ด ์‹ค์งˆ์ ์œผ๋กœ RStudio ์„œ๋ฒ„๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ค์น˜ํ•˜๊ณ  ์žˆ๋‹ค. ๊ด€๋ จ ๋ช…๋ น์–ด๋“ค์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š์„๊ฑฐ์ง€๋งŒ(๊ฒ€์ƒ‰์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค!) ์•„๊นŒ ์œ„์—์„œ ๋ ˆ์ด์–ด ๊ฐœ๋…์„ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ ์—ฐ์žฅ์„ ์œผ๋กœ && ๋ฅผ ์‚ฌ์šฉํ•ด ๋ ˆ์ด์–ด๋ฅผ ์ค„์ด๊ณ  ์žˆ๋‹ค๋Š” ์ ๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค!

WORKDIR /home/rstudio ์œ„์—์„œ ๋‹ค๋ฃฌ ๋ช…๋ น์–ด๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋‹จ์–ด์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

USER rstudio ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ ์‚ฌ์šฉ์ž๋ฅผ โ€˜rstudioโ€™๋กœ ์ง€์ •ํ•ด ์ฃผ์—ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Docker๋Š” root ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋œ๋‹ค. ๋‹ค๋งŒ ๋ณด์•ˆ์ด๋‚˜ ํŒŒ์ผ ๊ถŒํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด ํŠน์ • ์ž‘์—…์„ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ์ด ๋•Œ USER ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ๊ถŒํ•œ์„ ๋ฐ”๊ฟ”์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์™ธ์—๋Š” ์œ„์—์„œ ๋‹ค๋ค˜๋˜ ํฌํŠธ๊ฐ€ ๋ˆˆ์— ๋„๋Š”๋ฐ EXPOSE 8787 ์ง€์ •ํ•ด์ฃผ๋ฉด์„œ RStudio Server ์ชฝ์— 8787๋ฒˆ ํฌํŠธ๋ฅผ ์—ด์–ด์ฃผ์—ˆ๋‹ค.

๐Ÿ‘‡ย RStudio server .Dockerfile

  RG rstats_version=v56 

#base image(๋„์ปคํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๋ฒ ์ด์Šค)๋Š” from์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
FROM gcr.io/kaggle-gpu-images/rstats:${rstats_version} 
ARG rstudio_version=2021.09.0-351
RUN apt-get update && \
    apt-get install -y gdebi-core && \
    wget https://download2.rstudio.org/server/focal/amd64/rstudio-server-${rstudio_version}-amd64.deb && \ 
    gdebi -n rstudio-server-${rstudio_version}-amd64.deb && \ 
    apt-get clean && \
    rm rstudio-server-${rstudio_version}-amd64.deb

WORKDIR /home/rstudio
COPY setup.R ./setup.R
RUN chown rstudio:rstudio ./setup.R
RUN chmod +x ./setup.R
USER rstudio
RUN Rscript ./setup.R && \
    rm ./setup.R
USER root


EXPOSE 8787
# LABEL revised_by="Daniel Youk" \
#       revised_date="2023-12-24"
ENTRYPOINT [ "/bin/bash"]
CMD ["-c", "rstudio-server start && tail -f /dev/null"]

๊ทธ๋ฆฌ๊ณ  ํ•œ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ ์€ CMD ["-c", "rstudio-server start && tail -f /dev/null"] ์ด ๋ช…๋ น์–ด๋‹ค. ์œ„์—์„œ CMD ๋ฅผ โ€˜์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•  ๋ช…๋ น์„ ์ง€์ •โ€™ํ•œ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋‚ด ๊ฒฝํ—˜ ์ƒ ์˜ˆ์‹œ ํ•˜๋‚˜์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

์•„๋ž˜ ์‚ฌ์ง„์€ ์œ„์—์„œ ๋‹ค๋ฃฌ Kaggle R ์ด๋ฏธ์ง€์˜ Dockerfile์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์ค„์˜ ์บก์ณ ๋ถ€๋ถ„์ด๋‹ค. ๋ณด๋ฉด CMD [โ€Rโ€] ์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š”๋ฐ, CMD ๋กœ ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ช…๋ น์–ด(docker exec)๋ฅผ ์‘์šฉํ•ด docker exec -it rstudio-container R ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋กœ ๋ฐ”๋กœ rstudio-container์˜ R ํ”„๋กœ๊ทธ๋žจ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

Descriptive Alt Text

Descriptive Alt Text

๊ทธ๋Ÿฐ๋ฐ RStudio Server๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋„์ปคํŒŒ์ผ์—๋„ CMD ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ถ„๋ช… ์ƒ๊น€์ƒˆ๊ฐ€ ๋‹ค๋ฅธ ๊ฑธ๋กœ ๋ณด์•„ ์ฐจ์ด์ ์ด ์žˆ๋Š” ๊ฒƒ์ด ํ™•์‹คํ•˜๋‹ค.(๋ญ์ง€..) ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด CMD ["-c", "rstudio-server start && tail -f /dev/null"] ๋ช…๋ น์–ด๋Š” RStudio ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. /dev/null์€ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ ํŠน๋ณ„ํ•œ ํŒŒ์ผ๋กœ ์ž…๋ ฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๋Š” ์—ญํ• ์„ ํ•˜๋Š”๋ฐ tail -f ๋ช…๋ น์–ด๋กœ /dev/null ํŒŒ์ผ์„ ๊ณ„์† ์ฐพ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ํŒŒ์ผ์€ ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ๋ฌด์–ธ๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๋Š” ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์ง€๊ฒŒ ๋˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!

3.1 Difference Between Docker CMD and ENTRYPOINT: When and How to Use Them?

Dockerfile์„ ์ž‘์„ฑํ•  ๋•Œ CMD์™€ ENTRYPOINT ๋‘ ๋ช…๋ น์–ด๊ฐ€ ๊ณ„์† ๋‚˜์™”๋‹ค. ๋‘˜๋‹ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๋ช…๋ น์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ ๊ทธ ์—ญํ• ๊ณผ ๋™์ž‘ ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ถ€๋ถ„๋„ ๋‹ค์‹œ๋Š” ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹ซ์œผ๋‹ˆ ์—ฌ๊ธฐ์„œ ์ •๋ฆฌํ•ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค!

๐Ÿšชย CMD

๊ณ„์† ์–ธ๊ธ‰๋˜์—ˆ๋˜ CMD๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜ํ–‰๋˜์ง€๋งŒ ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ docker run ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด CMD์—์„œ ์ง€์ •ํ•œ ๋ช…๋ น์€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ ์ž…๋ ฅํ•œ ๋ช…๋ น์ด ๋Œ€์‹  ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž!

์šฐ๋ฆฌ๋Š” CMD ["R"] ์ด ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด R ์ฝ˜์†”์ด ๊ธฐ๋ณธ์œผ๋กœ ์‹คํ–‰๋จ์„ ์œ„์—์„œ ํ™•์ธํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค๋ฉด CMD์—์„œ ์ง€์ •ํ•œ R์€ ๋ฌด์‹œ๋˜๊ณ  ์ƒˆ๋กœ์šด ๋ช…๋ น์ด ์‹คํ–‰๋œ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ธ๊ฐ€ ํ•˜๋ฉด docker run <image> /bin/bash ๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด R ๋Œ€์‹  /bin/bash๊ฐ€ ์‹คํ–‰ ๋œ๋‹ค๋Š” ๋ง์ด๋‹ค.

๐Ÿšชย Entry Point

ENTRYPOINT๋Š” ํ•ญ์ƒ ์‹คํ–‰๋  ๋ช…๋ น์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. CMD์™€ ๋‹ฌ๋ฆฌ docker run์—์„œ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์ž…๋ ฅํ•ด๋„ ENTRYPOINT์—์„œ ์ง€์ •ํ•œ ๋ช…๋ น์€ ๋ฎ์–ด์“ฐ์ด์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒŒ ๋‘˜์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋‹ค. ์ด๊ฒƒ๋„ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ดํ•ดํ•ด๋ณด๋ก ํ•˜์ž!

ENTRYPOINT ["/bin/bash", "-c"] ์ด ์ฝ”๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ•ญ์ƒ /bin/bash -c๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ docker run์„ ์ด์šฉํ•ด docker run <image> "echo Hello"๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ทธ ๋ช…๋ น์€ /bin/bash -c ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด /bin/bash -c "echo Hello"๋กœ ์‹คํ–‰๋œ๋‹ค!

๐Ÿ‘‡ย summary

CMD vs ENTRYPOINT
ํ•ญ๋ชฉ CMD ENTRYPOINT
๋ชฉ์  ๊ธฐ๋ณธ ๋ช…๋ น์„ ์„ค์ • (๋ฎ์–ด์“ฐ๊ธฐ ๊ฐ€๋Šฅ) ํ•„์ˆ˜ ๋ช…๋ น์„ ์„ค์ • (ํ•ญ์ƒ ์‹คํ–‰๋จ)
๋ฎ์–ด์“ฐ๊ธฐ `docker run` ๋ช…๋ น์–ด๋กœ ๋ฎ์–ด์”Œ์›€ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , ์ธ์ž๋ฅผ ์ „๋‹ฌ ๊ฐ€๋Šฅ
์œ ์—ฐ์„ฑ ๋‹ค๋ฅธ ๋ช…๋ น์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ ์ธ์ž๋ฅผ ํ†ตํ•ด ๋ช…๋ น ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
์˜ˆ์‹œ `CMD ["R"]` `ENTRYPOINT ["/bin/bash", "-c"]`

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‘ ๋ช…๋ น์–ด ๋ชจ๋‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋  ๋ช…๋ น์„ ์ง€์ •ํ•˜์ง€๋งŒ CMD๋Š” ๊ธฐ๋ณธ ์‹คํ–‰ ๋ช…๋ น์„, ENTRYPOINT๋Š” ํ•ญ์ƒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•„์ˆ˜ ๋ช…๋ น์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ์ ์„ ๊ผญ๊ธฐ์–ตํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค! ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์กฐํ•ฉ์ด๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋“ฏ ํ•˜๋‹ค!

ENTRYPOINT ["/bin/bash", "-c"]
CMD ["rstudio-server start && tail -f /dev/null"]

4. Docker Pipeline

์ด๋ฒˆ ํฌ์ŠคํŒ…์„ ๋งˆ๋ฌด๋ฆฌ ํ•˜๊ธฐ ์ „์— ์ง€๊ธˆ๊นŒ์ง€์˜ ํ•™์Šต ๊ณผ์ •์„ ์‹œ๊ฐ์ ์œผ๋กœ ์ •๋ฆฌํ•ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€์˜ ํฌ์ŠคํŒ…์€ Dockerfile์„ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ์ง„ํ–‰๋˜์—ˆ๋‹ค. (Dockerfile โ†’ ์ด๋ฏธ์ง€ ์ƒ์„ฑ โ†’ Registry ์ €์žฅ โ†’ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ โ†’ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰)

์ง€๊ธˆ์ด์•ผ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€๋“ค์ด ๋งŽ์•„์ง„๋‹ค๋ฉด ๋กœ์ปฌ์ด๋ผ๋Š” ํ•œ์ •๋œ ๊ณต๊ฐ„์—์„œ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต์€ Docker Registry๋ผ๋Š” ๊ณณ์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅ(push)ํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋‹น๊ฒจ์™€(pull) ๋กœ์ปฌ ํ˜น์€ ๊ฐ€์ƒ๋จธ์‹ ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ… ๋ถ€ํ„ฐ๋Š” ์ด ์ด์•ผ๊ธฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ง„ํ–‰๋˜๋‹ˆ ๊ธฐ๋Œ€ํ•ด ์ฃผ๊ธธ ๋ฐ”๋ž€๋‹ค! ๐Ÿ˜Ž

Descriptive Alt Text


์ด๋ฒˆ ์ฃผ์ฐจ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ๋„์ปค๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋น„์œ ์ ์œผ๋กœ ์ดํ•ดํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์— ๋Œ€ํ•ด ์กฐ๊ธˆ ๋” ์†Œํ”„ํŠธ์›จ์–ด ์ธก๋ฉด์—์„œ ์ด๋ก ์„ ๋‹ค๋ฃจ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋ญ๋ž„๊นŒ.. ๋ถ„๋ช… ๋‚ด๊ฐ€ ์•Œ๊ณ  ์žˆ๋˜ ๋‚ด์šฉ์ด์˜€๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ๋˜๋‹ค์‹œ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์ด ๋˜์–ด๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ํŠนํžˆ Dockerfile์˜ ENV, ARG ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ, ๊ตฌ์ฒด์ ์œผ๋กœ ๋„์ปคํŒŒ์ผ์„ ์ง์ ‘ ์ƒ์„ฑํ•ด๋ณด๋ฉด์„œ ๊ฐœ๋…์„ ๋‹ค์งˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.

์•„๋ฌดํŠผ ์ด๋ฒˆ์ฃผ์ฐจ๋ฅผ ๊ธฐ์ ์œผ๋กœ ๋„์ปค ํฌ์ŠคํŒ… ์‹œ๋ฆฌ์ฆˆ๋„ ๋ฐ˜ํ™˜์ ์„ ๋Œ์•˜๋‹ค. ์—ฌ์ „ํžˆ ๋งŽ์ด ๋ถ€์กฑํ•œ ๊ธ€์ด์ง€๋งŒ ๋ถ„๋ช… ๊ธ€๋กœ ๋‚จ๊ธฐ๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ฑด ์ดํ•ด์˜ ๋†๋„๊ฐ€ ๋‹ค๋ฅผ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๋ฒˆ์ฃผ๋Š” ์œ ๋‚œํžˆ ๋ญ˜ ํ•ด๋„ ์ง‘์ค‘์ด ์•ˆ๋˜๋Š” ๋‚ ์ด์—ˆ๋Š”๋ฐ ์ผ๋‹จ ๋ฒ„ํ…จ๋ณด๋Š” ๊ฑธ๋กœ ํ•˜์ž!๐Ÿ‘Š

Descriptive Alt Text


Reference

Kaggle_R_Dockerfile

Please allow me to introduce myself: Torch for R

Tags: DockerAutonomous_DrivingNVIDIAAzureCloud

Subscribe via RSS