[Docker] ๐Ÿ›  Docker์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!!

ํ™ฉ๊ทœ๋นˆยท2022๋…„ 4์›” 20์ผ
0

CI/CD

๋ชฉ๋ก ๋ณด๊ธฐ
2/3

๐Ÿ’Ž ๊ฐœ์š”

์ €๋ฒˆ git์— ๋Œ€ํ•œ velog ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ์ด์–ด์„œ Docker์— ๊ด€๋ จ๋œ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค. ์ด๋ฒˆ์—๋„ S/W Engineering ์ „๊ณต ์ˆ˜์—…์„ ๋“ค์œผ๋ฉด์„œ ์ดํ•ดํ•œ ๋‚ด์šฉ ๋ฐ Docker์— ๋Œ€ํ•œ ๋ช…๋ น์–ด๋“ค๊ณผ dockerfile์— ๋Œ€ํ•ด์„œ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค!! ์ดํ›„ ์ •๋ฆฌํ•˜์ง€ ๋ชปํ•œ ๋‚ด์šฉ๋“ค์€ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •๋ฆฌํ•ด์„œ ์—…๋กœ๋“œ ํ•  ์˜ˆ์ •์ด๋‹ค!!

S/W ์ˆ˜์—…์—์„œ ๋‹ค์–‘ํ•œ devops๋“ค์„ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์žˆ๋Š”๋ฐ ์ €๋ฒˆ git๋„ ๊ทธ๋ ‡๊ณ  deployํ•˜๋Š” ๊ณผ์ •์—์„œ ์“ฐ์ด๋Š” ์ด๋ฒˆ docker๋ฅผ ์ด์šฉํ•ด๋ณด๋ฉด์„œ CI/CD๋ฅผ ์กฐ๊ธˆ์”ฉ ํ—ค์ณ๋‚˜๊ฐ€ ๋ณด๋„๋ก ํ•ด๋ณธ๋‹ค!!

๐Ÿ’Ž container

๐Ÿซ container

docker์— ๋Œ€ํ•œ ์ดํ•ด์— ์•ž์„œ์„œ container๋Š” ๋ฌด์—‡์ผ๊นŒ?? ์ด๋ฅผ ์œ„ํ•ด์„  Virtual Machine์„ ํ™•์ธํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

virtual machine์€ ๋‹ค์Œ์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ต‰์žฅํžˆ ํฐ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค. ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์˜ ๋‹จ์œ„๋ฅผ ์ฐจ์ง€ํ•˜๋Š” VM์˜ images๋“ค๋กœ ์ธํ•ด์„œ ๋ฌด๊ฒ๊ณ  ๋งŽ์€ ์ ์œ ์œจ์„ ์ฐจ์ง€ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ๋‹จ์ ๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋Š” VM ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด์‹์„ฑ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

ํ•˜์ง€๋งŒ container๋Š” ์ด์— ๋ฐ˜ํ•ด ๊ต‰์žฅํžˆ ๊ฐ€๋ณ๋‹ค. ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ์œ ํ•  ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๋น ๋ฅด๊ณ  ์ž‘์€ ์šฉ๋Ÿ‰์œผ๋กœ ํ›จ์”ฌ ๋งŽ์€ ์ˆ˜์˜ container๋“ค์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ vm์ด hypervisor์„ ๊ฑฐ์ณ ๋…๋ฆฝ๋œ ๊ณต๊ฐ„์— os์˜ ์ปค๋„์ด๋‚˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ณ  ํ• ๋‹นํ•˜๋Š”๋ฐ ๋ฐ˜๋Œ€๋กœ container์˜ ์ด์‹์„ฑ์€ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์ด๋‹ค. ์—ฌ๋Ÿฌ container๋“ค์ด ์„œ๋กœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ os์˜ ์ปค๋„ ์œ„์—์„œ ๋นŒ๋“œ๋˜์–ด ๊ฐ€๋ณ๊ณ  ์—ฌ๋Ÿฌ os๋“ค์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ container๋Š” ๋”ฐ๋ผ์„œ app๊ณผ app์‹คํ–‰์— ํ•„์š”ํ•œ ๋ชจ๋“  dependency๋ฅผ ๋ฌถ์€ package๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿซ image

๊ทธ๋ ‡๋‹ค๋ฉด image๋Š” ๋ฌด์—‡์ผ๊นŒ?? image๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์ด๋‹ค.(static file, unchangable) ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์— ํ•„์š”ํ•œ ํŒŒ์ผ๊ณผ ์ฝ”๋“œ๋“ค, ์„ค์ •๊ฐ’๋“ค์„ ํฌํ•จํ•œ ๊ฒƒ์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ๋‹ค!! ๋”ฐ๋ผ์„œ image๋ฅผ ์‹คํ–‰์‹œ์ผœ์„œ container๋ฅผ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค!!

์ •๋ฆฌํ•˜๋ฉด ์ด๋Ÿฌํ•œ image๋Š” ์•ž์„œ ๋งํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์ด๋ฏธ ์™„์ „ํžˆ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ  ๋งŒ๋“œ๋Š” ๋ฌถ์–ด์ง„ ํŒŒ์ผ์ด๋‹ค. ์—ฌ๋Ÿฌ container๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋“ค์ด ์‚ญ์ œ๋˜๋”๋ผ๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋”ฐ๊ฐ€ ๋‹ค๋ฃฐ dockerhub์™€ dockerfile์—์„œ๋„ ๋ฐฐํฌ์™€ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!

๐Ÿ’Ž Docker

๐Ÿซ Docker

์•ž์„œ container์™€ image๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด์„œ ์ด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” docker๋ฅผ ์„ค๋ช…ํ•˜๊ณ ์ž ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ๋˜์—ˆ๋‹ค!! docker๋Š” container engine์„ ๋งŒ๋“  ๋Œ€ํ‘œ์ ์ธ ํšŒ์‚ฌ๋กœ container๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” platform์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด container image๋Š” ์•ž์„œ vm๊ณผ ๋น„๊ตํ•˜์˜€์„ ๋•Œ ๊ต‰์žฅํžˆ ์ž‘์€ ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— vm์„ ์„ค์น˜ํ•˜์—ฌ app์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๊ฐ€ ์ž‘์•„์„œ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

์ˆ˜์—…์‹œ๊ฐ„์— ์ฐธ๊ณ ์ž๋ฃŒ๋กœ ๊ทธ๋ ค์ง„ ์„ค๋ช…์ธ๋ฐ,,, ์ดํ•ดํ•˜๊ธฐ ์ข‹์•„์„œ ๋„ฃ์–ด๋ณด์•˜๋‹น. ์ด๋”ฐ ์„ค๋ช…ํ•  dockerfile์„ ํ†ตํ•ด์„œ build ์‹œํ‚ค๋ฉด ์ด๋Š” image๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๊ฒƒ์„ run ์‹œ์ผฐ์„ ๋•Œ container๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ docker hub๋ผ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ(push, pull)์„ ํ†ตํ•ด image๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ docker๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค!!

๐Ÿซ Docker commands

docker์„ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ image๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  container๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ ํ™•์ธํ•ด๋ณด์ž!!

// docker ์„ค์น˜
sudo apt-get update
sudo apt-get install docker.io
docker --version

// docker ๋ช…๋ น์–ด sudo์—†์ด ์ˆ˜ํ–‰ํ•˜๊ธฐ
sudo usermod -aG docker $USER

//docker container ์‹คํ–‰ ์˜ˆ์ œ
// docker ubuntu image ๋ฐ›์•„์˜ค๊ธฐ 
docker pull ubuntu
//docker image ํ™•์ธ ๋ฐ container ํ™•์ธ
docker images
docker ps

// container ์‹คํ–‰
docker exec -it <container id> <prorm in the container>
exit

// ์ •์ง€ ๋ช…๋ น์–ด๋“ค
docker stop <container id>
docker kill <container id>
docker ps -a

// ์‚ญ์ œ ๋ช…๋ น์–ด๋“ค
docker rm -f <container id>
docker rmi -f <image id>

// port forwarding
// ec2์—์„œ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™ ํŽธ์ง‘ ํ•„์š”!!
docker run -it -p <port ์ฃผ์†Œ> -d <image ์ด๋ฆ„>

๐Ÿซ DockerHub

dockerhub๋Š” docker images๋“ค์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์—ฌ๊ธฐ์„œ push, pull์„ ํ†ตํ•ด docker์˜ image๋“ค์„ ๋ฐ›์•„์˜ค๊ณ , ์ €์žฅํ•ด๋‘˜ ์ˆ˜ ์žˆ๋‹ค. pull์„ ํ†ตํ•ด docker image๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‹คํ–‰์‹œ์ผœ container๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

// docker login์„ ํ†ตํ•ด push, pull ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ
docker login

// dockerhub์— image push ํ•ด์˜ค๊ธฐ
// tag๋Š” docker images ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ 
docker push dockerhub๊ณ„์ •/image ์ด๋ฆ„:tag

// dockerhub์—์„œ image pull ํ•ด์˜ค๊ธฐ
docker pull <image ์ด๋ฆ„>

๐Ÿ’Ž Dockerfile

๐Ÿซ Dockerfile

dockerfile์€ docker image๋ฅผ ๋งŒ๋“œ๋Š” ํŒŒ์ผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค!! docker image๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด command๋“ค์„ ๋ชจ์•„๋‘” ๊ฒƒ์œผ๋กœ build ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ docker file๋กœ container๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ์ž…๋ ฅํ•˜๋˜ ๋ช…๋ น์–ด๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค!!

์ง€๊ธˆ๊นŒ์ง€ docker container ์ž‘์—…๊ณผ์ •์„ ํ™•์ธํ•ด๋ณด๋ฉด
image - run - container - exec - container ์•ˆ์—์„œ ์ž‘์—… ์ˆ˜ํ–‰ - exit - commit - ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ์ €์žฅ

์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ FROM, ADD, RUN, CMD, ENTRYPOINT, ENV ๊ตฌ๋ฌธ์„ ํ†ตํ•ด textํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค!!

๐Ÿซ Dockerfile ์ž‘์„ฑ์˜ˆ์‹œ

FROM - base image ์ง€์ •
ADD <source> destination in container> - ํŒŒ์ผ๋“ค ๋ณต์‚ฌ
RUN - base image ์œ„์— ์ถ”๊ฐ€ sw ๊ณ„์ธต ์„ค์น˜
CMD - container ์•ˆ์—์„œ ์‹คํ–‰ํ•˜๋ ค๋Š” command
ENTRYPOINT - CMD๊ฐ€ ์œ ์‚ฌํ•œ๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‹คํ–‰ํ•  ๋•Œ ๋‹ค๋ฅธ command๋ฅผ ์ž…๋ ฅํ•˜์—ฌ dockerfile์˜ CMD์— ์ง€์ •๋œ ๋ช…๋ น์„ ์ƒ๋žตํ•  ์ˆ˜ ์—†๊ฒŒ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
ENV - container์—์„œ ์‚ฌ์šฉํ•  environment ๋ณ€์ˆ˜ ์ง€์ •

์œ„ ๋‚ด์šฉ์ด ๊ธฐ๋ณธ ๊ตฌ๋ฌธ์„ ์ด์šฉํ•œ ์ž‘์„ฑ ์˜ˆ์‹œ์ด๋‹ค!! ubuntu ์ด๋ฏธ์ง€๋ฅผ ํ™œ์šฉํ•œ apache2๋ฅผ container ๋‚ด๋ถ€์— ์„ค์น˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” dockerfile์˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•ด๋ณด์ž.

FROM ubuntu
## ENV ๋‚ด์šฉ์€ apt๋กœ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด ๋ฌด์‹œํ•˜๊ธฐ
ENV DEVIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true
RUN apt-get update
RUN apt-get install -y apache2
ADD ./var/www/html
ENTRYPOINT apache2ctl -D FOREGROUND
ENV env_var_name <๋ณ€์ˆ˜ ์ด๋ฆ„>
// dockerfile ์‹คํ–‰ ํ›„ ์ด๋ฏธ์ง€ ๋งŒ๋“ค๊ธฐ
docker build . -t <image ์ด๋ฆ„>

// ์‹คํ–‰ํ•˜๊ธฐ
docker run -it -p <hostport #: container port#> -d <image ์ด๋ฆ„>
docker run - it -p <port #:port #> -v <local dir:mounting point directory in container> -d <image ์ด๋ฆ„>

๐Ÿ’Ž ์ •๋ฆฌํ•˜๊ธฐ

์ €๋ฒˆ DevOps์ธ git์— ์ด์–ด์„œ docker์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. container์™€ image๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด์„œ Docker์— ๋Œ€ํ•œ ์ดํ•ด์™€ ํ•จ๊ป˜ vm๋ณด๋‹ค ๋” ํšจ์œจ์ ์œผ๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋“ค์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!! ์ˆ˜์—…์—์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋‹ค๋ค„๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ง‘์ค‘ํ•˜๋ฉฐ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค!!

๋‹ค์Œ์—๋Š” docker์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ๊ธฐํšŒ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ธฐ๋กœ ํ•˜๊ณ , S/W Engineering ์ˆ˜์—…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‹ค๋ฅธ devOps๋“ค์ด ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ๋˜ ๊ธ€์—์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•  ์˜ˆ์ •์ด๋‹ค!!

์ค‘๊ฐ„๊ณ ์‚ฌ ํ™”์ดํŒ…~!

profile
์•ˆ๋…•ํ•˜์„ธ์šค

0๊ฐœ์˜ ๋Œ“๊ธ€