๐ณ Docker study 4th
Running RStudio on Docker: Leveraging GPU for Data Analysis
by Arielle
์์ <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
๋ก ๊ฐ์๋จธ์ ์ ์ค์นํ๋ค.
1.2 Running an R container in the RStudio Server IDE environment
์ง๊ธ๊น์ง ๋์ปค๋ฅผ ์ฌ์ฉํจ์ ์์ด ๋จผ์ ํ์ํ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ฐ๊ณ ์ด๋ฅผ ํด๋น ์ปจํ ์ด๋, ์ฆ ๊ฐ์ํ๊ฒฝ์ ํฐ๋ฏธ๋์์ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ค. ์ด๋ฒ์๋ IDE ํ๊ฒฝ(Web)์์ ์ปจํ ์ด๋๋ฅผ ์คํ์์ผ๋ณด๋ ๋ฐฉ๋ฒ์ RStudio Server๋ฅผ ์ด์ฉํด ์๋ํด๋ณด์๋ค.
์๋ ์ฌ์ง์ ์ค์ ๋ก R ์ปจํ ์ด๋๋ฅผ ํตํด IDE์ ์ ๊ทผํ ๊ฒฐ๊ณผ์ธ๋ฐ, ๋ณด๋ฉด ์น์์ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๊ณ ์์์ ํ์ธํ ์ ์๋ค.
์ด๋ฅผ ์ํ ๋ฐฉ๋ฒ์ ์ด ๋ช ๋ น์ด ํ ์ค ์ด๋ฉด ๊ฐ๋ฅํ๋ค. ์กฐ๊ธ ๊ธธ๊ธด ํ์ง๋ง ํ๋ํ๋ ์ฝ์ด๋ณด๋ฉด ๋ ์์ ํ ๋ชป ํ ๊ฒ๋ ์๋ ๋ฏ ์ถ๋ค.
โ
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์ ๊ฐ๋ ์ ์ ๋ฆฌํ ๊ทธ๋ฆผ์ด๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ธก๋ฉด์์ ์ดํดํ๊ณ ์ ํ๋ค๋ฉด ์ข์ธก์ฒ๋ผ ์๋ฒ์๊ฒ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ์๋น์ค ๊ฐ๊ฐ์๊ฒ ๋ถ์ฌ๋ ํน์ ํฌํธ๋ฒํธ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐํ ์ ์๋ค. ๋ํ์ ์ผ๋ก ์์์ ์ธ๊ธํ 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โ ์์ฑ์ ํ์ธํ ์ ์๋ค.
-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์ ์ค์นํด ์ฃผ์๋ค.
์ฐธ๊ณ ๋ก ์์์๋ 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()
๋ก ๋์ค๋ฉด ๋๋ค!)
์๊น RStudio(WEB)์์ Python์ ์ค์นํด ์ฃผ์๋ค. ์ค์น ์ฌ๋ถ๋ฅผ ๋ฌผ์ด๋ณด๊ธธ๋ ์ผ๋๋ฒ๋ ์ค์น๋ฅผ ํ๊ธฐ๋ ํ๋๋ฐ ์ด๋์ ์ค์น ๋์๋์ง ํ๋ฒ ์ฏค์ ํ์ธํ ํ์๊ฐ ์์ ๊ฒ ๊ฐ๋ค. reticulate::py_config()
๋ก ํฐ๋ฏธ๋์์ ํ์ธํด๋ณด๋ /root/.local/share/r-minicconda/env/r-reticulate/bin/python
๊ฒฝ๋ก์ ์์นํด ์์์ ํ์ธํ๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ ๋ณด๋ฉด r-miniconda
๋ผ๋ ํด๋์ ํ์ ๊ฒฝ๋ก์ python์ด ์ค์น๋์ด ์๋ ๊ฑธ๋ก ๋ณด์ด๋๋ฐ, ๋๋ ํด๋น ํด๋๋ฅผ ์์ฑํ ์ ์ด ๋ถ๋ช
์๋ค.
์ด๋ฅผ ์ ๋๋ก ์ดํดํ๊ธฐ ์ํด์๋ Docker ์ปจํ ์ด๋ ๋ด๋ถ์์ RStudio์ Python ํ๊ฒฝ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํ๊ณ ์ํธ์์ฉํ๋์ง ์ดํดํ ํ์๊ฐ ์๋ค.
๋ฐ๋ก ์ ๊ทธ๋ฆผ์ผ๋ก ์ดํดํด๋ณด๋๋ก ํ์! ํ์ด์ฌ ํจํค์ง๋ฅผ ์ด์ฉํด 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
๊ฐ์ ๋ช
๋ น์ด๋ค๋ก ํ์ผ์ด ๊ตฌ์ฑ๋์ด ์๋ ๊ฑธ ํ์ธํ ์ ์๋๋ฐ ์ด๋ค์ ๊ธฐ๋ฅ์ ํ๋์ฉ ์ ๋ฆฌํด๋ณด๋๋ก ํ์!
๐ป 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
๊ฐ์ ํจํค์ง๋ฅผ ์ค์นํจ
- R์ ์คํํด์
โ
ย 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 ํ๋ก๊ทธ๋จ์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ 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 | 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) ๋ก์ปฌ ํน์ ๊ฐ์๋จธ์ ์์ ์ฌ์ฉํ๋ ๊ฒ ์ผ๋ฐ์ ์ด๋ค. ๋ค์ ํฌ์คํ ๋ถํฐ๋ ์ด ์ด์ผ๊ธฐ๋ฅผ ์ค์ฌ์ผ๋ก ์งํ๋๋ ๊ธฐ๋ํด ์ฃผ๊ธธ ๋ฐ๋๋ค! ๐
์ด๋ฒ ์ฃผ์ฐจ๋ ์ง๊ธ๊น์ง ๋์ปค๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋น์ ์ ์ผ๋ก ์ดํดํ๋ ๋ถ๋ถ๋ค์ ๋ํด ์กฐ๊ธ ๋ ์ํํธ์จ์ด ์ธก๋ฉด์์ ์ด๋ก ์ ๋ค๋ฃจ์๋ค. ๊ทธ๋ฌ๋ค๋ณด๋ ๋ญ๋๊น.. ๋ถ๋ช ๋ด๊ฐ ์๊ณ ์๋ ๋ด์ฉ์ด์๋ ๊ฒ ๊ฐ์๋ฐ ๋๋ค์ ์๋ก์ด ๋ด์ฉ์ด ๋์ด๋ฒ๋ฆฐ ๊ฒ ๊ฐ์๋ค. ํนํ Dockerfile์ ENV, ARG ๋ช ๋ น์ด์ ๋ํด์๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ๋, ์ปจํ ์ด๋๋ฅผ ์คํํ ๋๋ก ๊ตฌ๋ถ๋๋๋ฐ, ๊ตฌ์ฒด์ ์ผ๋ก ๋์ปคํ์ผ์ ์ง์ ์์ฑํด๋ณด๋ฉด์ ๊ฐ๋ ์ ๋ค์ง ํ์๊ฐ ์๋ค๊ณ ๋๊ผ๋ค.
์๋ฌดํผ ์ด๋ฒ์ฃผ์ฐจ๋ฅผ ๊ธฐ์ ์ผ๋ก ๋์ปค ํฌ์คํ ์๋ฆฌ์ฆ๋ ๋ฐํ์ ์ ๋์๋ค. ์ฌ์ ํ ๋ง์ด ๋ถ์กฑํ ๊ธ์ด์ง๋ง ๋ถ๋ช ๊ธ๋ก ๋จ๊ธฐ๊ณ ์ ๋ฆฌํ๋ ๊ฑด ์ดํด์ ๋๋๊ฐ ๋ค๋ฅผ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ค. ์ด๋ฒ์ฃผ๋ ์ ๋ํ ๋ญ ํด๋ ์ง์ค์ด ์๋๋ ๋ ์ด์๋๋ฐ ์ผ๋จ ๋ฒํ จ๋ณด๋ ๊ฑธ๋ก ํ์!๐
Reference
Subscribe via RSS