์ ๋ฒ git์ ๋ํ velog ๊ฒ์๊ธ์ ์์ฑํ์๋๋ฐ, ์ด๋ฒ์๋ ์ด์ด์ Docker์ ๊ด๋ จ๋ ๊ฒ์๊ธ์ ์์ฑํด๋ณด๊ณ ์ ํ๋ค. ์ด๋ฒ์๋ S/W Engineering ์ ๊ณต ์์ ์ ๋ค์ผ๋ฉด์ ์ดํดํ ๋ด์ฉ ๋ฐ Docker์ ๋ํ ๋ช ๋ น์ด๋ค๊ณผ dockerfile์ ๋ํด์ ๊ธ์ ์์ฑํด๋ณด์๋ค!! ์ดํ ์ ๋ฆฌํ์ง ๋ชปํ ๋ด์ฉ๋ค์ ์ถ๊ฐ์ ์ผ๋ก ์ ๋ฆฌํด์ ์ ๋ก๋ ํ ์์ ์ด๋ค!!
S/W ์์ ์์ ๋ค์ํ devops๋ค์ ๊ฒฝํํด๋ณด๊ณ ์๋๋ฐ ์ ๋ฒ git๋ ๊ทธ๋ ๊ณ deployํ๋ ๊ณผ์ ์์ ์ฐ์ด๋ ์ด๋ฒ docker๋ฅผ ์ด์ฉํด๋ณด๋ฉด์ CI/CD๋ฅผ ์กฐ๊ธ์ฉ ํค์ณ๋๊ฐ ๋ณด๋๋ก ํด๋ณธ๋ค!!
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๋ ๋ณํ์ง ์๋ ๊ฐ์ด๋ค.(static file, unchangable) ์ปจํ ์ด๋ ์คํ์ ํ์ํ ํ์ผ๊ณผ ์ฝ๋๋ค, ์ค์ ๊ฐ๋ค์ ํฌํจํ ๊ฒ์ผ๋ก ๋งํ ์ ์๋ค!! ๋ฐ๋ผ์ image๋ฅผ ์คํ์์ผ์ container๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ ๊ฒ์ผ๋ก ํด์ํ ์ ์๋ค!!
์ ๋ฆฌํ๋ฉด ์ด๋ฌํ image๋ ์์ ๋งํ ๊ฒ ์ฒ๋ผ ์ด๋ฏธ ์์ ํ ๋ง๋ค์ด์ง ํ์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์คํ์ํฌ ์ ์๊ณ ๋ง๋๋ ๋ฌถ์ด์ง ํ์ผ์ด๋ค. ์ฌ๋ฌ container๋ค์ ๋ง๋ค ์ ์์ผ๋ฉฐ ์ด๋ค์ด ์ญ์ ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฐ๊ฐ ๋ค๋ฃฐ dockerhub์ dockerfile์์๋ ๋ฐฐํฌ์ ์์ฑ ๋ฐฉ๋ฒ์ ํ์ธํ ์ ์๋ค!
์์ 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์ ์ค์นํ๋ ๋ช ๋ น์ด์ ํจ๊ป 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๋ 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์ 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ํ์ผ์ ์์ฑํ๋ฉด ๋๋ค!!
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๋ค์ด ์๋ค๋ฉด ์ด๋ฅผ ๋ ๊ธ์์ ๋ค๋ค๋ณด๋๋ก ํ ์์ ์ด๋ค!!
์ค๊ฐ๊ณ ์ฌ ํ์ดํ ~!