1๋ถ : ์์
์ปจํ ์ด๋?
์ปจํ ์ด๋๋ ์ฑ์ ๋น๋ํ๊ณ ์คํํ๊ธฐ ์ํ ํ๋ซํผ์ ์ ๊ณตํ์ง๋ง ์ ์ฒด ์ด์ ์ฒด์ ์ ์ ์ฒด ํฌ๊ธฐ์ ์ค๋ฒํค๋๊ฐ ์๋ VM(๊ฐ์ ๋จธ์ )๊ณผ ๊ฐ์ ์๊ท๋ชจ ๊ฐ์ํ ํ๊ฒฝ์ ๋๋ค.
๊ฐ๋จํ ๋งํ๋ฉด ์ปจํ ์ด๋๋ ํธ์คํธ ๋จธ์ ์ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก์ธ์ค๋ก๋ถํฐ ๊ฒฉ๋ฆฌ๋, ์ฌ์ฉ์ ๋จธ์ ์ ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋๋ค.
์ปจํ ์ด๋ ์ด๋ฏธ์ง?
์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๊ฒฝ์ฐ ์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋ ํ์ผ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์ฌ์ฉ์ ์ง์ ํ์ผ์์คํ ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ ์ ๊ณต๋ฉ๋๋ค. ์ด๋ฏธ์ง์๋ ์ปจํ ์ด๋ ํ์ผ ์์คํ ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ(๋ชจ๋ ์ข ์์ฑ, ๊ตฌ์ฑ, ์คํฌ๋ฆฝํธ, ์ด์ง ํ์ผ ๋ฑ)์ด ์์ด์ผ ํฉ๋๋ค. ๋ํ ์ด๋ฏธ์ง์๋ ํ๊ฒฝ ๋ณ์, ์คํํ ๊ธฐ๋ณธ ๋ช ๋ น, ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ์ ๊ฐ์ ์ปจํ ์ด๋์ ๋ค๋ฅธ ๊ตฌ์ฑ๋ ํฌํจ๋์ด ์์ต๋๋ค.
docker ์คํ๋ช ๋ น
docker run -d -p 80:80 docker/getting-started
-d : ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ถ๋ฆฌ ๋ชจ๋๋ก ์ปจํ ์ด๋๋ฅผ ์คํ.
-p : ํธ์คํธ์ ํฌํธ 80์ ์ปจํ ์ด๋ ํฌํธ 80์ ์ฐ๊ฒฐ
2๋ถ : ์ ํ๋ฆฌ์ผ์ด์
์ฑ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋น๋, ๋น๋๋ฅผ ์ํด์ Dockerfile ์ด๋๊ฒ ํ์ํ๋ค.
Dockerfile?
Dockerfile์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ํ ์คํธ ๊ธฐ๋ฐ ๋ช ๋ น ์คํฌ๋ฆฝํธ
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]
* Apple M1 ํ๊ฒฝ์์๋ python ๋ฌธ์ ๊ฐ ์์ด ์๋ ๋ด์ฉ์ผ๋ก ๋น๋ํ์๋ค.
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN apk --no-cache --virtual build-dependencies add \
python2 \
make \
g++
RUN yarn install --production
CMD ["node", "src/index.js"]
Docker Image ๋น๋ ๋ช ๋ น
docker build -t getting-started .
-t : ํ๊ทธ ๋ค์ ์ง์ , ์ฌ๋์ด ์ฝ์ ์ ์๋๋ก ํ๋ ์ต์ข ์ด๋ฏธ์ง ์ด๋ฆ์ ์ง์ ํ๋ค.
Docker Image Run ๋ช ๋ น
docker run -dp 3000:3000 getting-started
3๋ถ : ์ฑ ์ ๋ฐ์ดํธ
CLI๋ฅผ ์ฌ์ฉํ ์ปจํ ์ด๋ ์ ๊ฑฐ
Docker ์กฐํ
docker ps
Docker Stop
# Swap out <the-container-id> with the ID from docker ps
docker stop <the-container-id>
Docker ์ ๊ฑฐ
docker rm <the-container-id>
docker rm ๋ช ๋ น์ “force” ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด ๋จ์ผ ๋ช ๋ น์ผ๋ก ์ปจํ ์ด๋๋ฅผ ์ค์งํ๊ณ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
์: docker rm -f <the-container-id>
4๋ถ : ์ฑ ๊ณต์
์ด๋ฏธ์ง ํธ์ - Docker Hub
Docker Hub ์ Docker ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธํ์ฌ ๋ ํ์งํ ๋ฆฌ ์์ฑ.
๋น ์ํ์ ๋ ํ์งํ ๋ฆฌ๊ฐ ๋ง๋ค์ด์ง๋ฉฐ, ์ด ๊ณณ์ ์ด๋ฏธ์ง๋ฅผ ํธ์ ํ ์ ์์.
$ docker push docker/getting-started
The push refers to repository [docker.io/docker/getting-started]
An image does not exist locally with the tag: docker/getting-started
์ฒซ ์ด๋ฏธ์ง๋ฅผ ํธ์ํ๊ฒ ๋๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๊ตฌ๊ฐ ๋จ๋๋ฐ ์ด๋ ์ด๋ฏธ์ง์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๋ฐ์ํ๋ ๋ฌธ์ . ๋ฐ๋ผ์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ๋ ํ์งํ ๋ฆฌ์ ์ฌ๋ฆฌ๊ธฐ ์ํด์๋ ๋ ํ์งํ ๋ฆฌ์ ๋์ผํ๊ฒ ๋ค์ด๋ฐ์ ํด์ฃผ์ด์ผ ํ๋ค.
CLI - Docker Login
docker login -u <username>
Image Name ์ง์ ํ๊ธฐ
docker tag getting-started <username>/getting-started:<tagname>
Image Push
docker push <username>/getting-started:<tagname>
tagname์ ์ง์ ํ์ง ์์ผ๋ฉด latest ๋ก ์ฌ๋ผ๊ฐ๋ค.
์ ์ธ์คํด์ค์์ ์ด๋ฏธ์ง ์คํํ๊ธฐ
์๋ก์ด ํ๊ฒฝ์์ ์ด๋ฏธ์ง๋ฅผ pull ๋ฐ์ ์คํํด๋ณธ๋ค.
Play With Docker ๋ผ๋ ์ฌ์ดํธ์์ ์๋ก์ด ํ๊ฒฝ์ ๊ตฌ์ฑํ์ฌ ํ ์คํธ.
** Apple M1 ์นฉ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ์ ๊ฒฝ์ฐ Docker ์ด๋ฏธ์ง ๋น๋ ์, ํด๋น ํธ์คํธ์ ํ๊ฒฝ์ธ linux/arm64/v8 ๋ก ๋น๋๋๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ ์ฌ์ดํธ์์ ์ด๋ฏธ์ง๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํด์๋ Docker build ๋ช ๋ น ์ "--platform linux/amd64" ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ ๋น๋ํ๋ฉด ํด๋น ํ๊ฒฝ์ผ๋ก ๋น๋๋๋ค.
5๋ถ : ๋ฐ์ดํฐ ์ ์ง
์ปจํ ์ด๋ ํ์ผ ์์คํ
์ปจํ ์ด๋๋ ์คํ ์ ์ด๋ฏธ์ง์ ๋ค์ํ ๊ณ์ธต์ ํ์ผ ์์คํ ์ ์ฌ์ฉํฉ๋๋ค. ๋ํ ๊ฐ ์ปจํ ์ด๋์๋ ํ์ผ์ ๋ง๋ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์๋ ์์ฒด “์คํฌ๋์น ๊ณต๊ฐ”์ด ํ ๋น๋ฉ๋๋ค. ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ‘๊ฒฝ์ฐ์๋’ ๋ค๋ฅธ ์ปจํ ์ด๋์๋ ๋ณ๊ฒฝ ๋ด์ฉ์ด ํ์๋์ง ์์ต๋๋ค.
์ปจํ ์ด๋ ๋ณผ๋ฅจ
์ปจํ
์ด๋์ ํน์ ํ์ผ ์์คํ
๊ฒฝ๋ก๋ฅผ ํธ์คํธ ๋จธ์ ์ ๋ค์ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ฅ.
๋ค๋ฅธ ์ปจํ
์ด๋ ํน์ ์ฌ์์ ํ์๋ ๋์ผํ ๊ฒฝ๋ก๋ก ํ์ฌํ๋ฉด ๋๊ฐ์ด ํ์๋๋ค.
Named Volume(๋ช ๋ช ๋ ๋ณผ๋ฅจ)
๋ช
๋ช
๋ ๋ณผ๋ฅจ์ ๋จ์ํ ๋ฐ์ดํฐ ๋ฒํท์ผ๋ก ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
Docker์์ ๋์คํฌ ์์ ์ค์ ์์น๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ฏ๋ก ๋ณผ๋ฅจ ์ด๋ฆ๋ง ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค.
๋ณผ๋ฅจ ์์ฑ
docker volume create <volume-name>
์ปจํ ์ด๋ ์์ ์, ๋ณผ๋ฅจ ํ์ฌ
docker run -dp 3000:3000 -v <volume-name>:<ํ์ฌํ ๋ฐ์ดํฐ ๊ฒฝ๋ก> <image-name>
์ด๋ฐ ์์ผ๋ก, ๋ณผ๋ฅจ์ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๊ฒ๋ ์ค์ ํ ์ ์์ต๋๋ค.
* ๊ธฐ๋ณธ Docker ์์ง ์ค์น์์ ์ง์๋๋ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ๋ณผ๋ฅจ ์ ํ์ด์ง๋ง NFS, SFTP, NetApp ๋ฑ์ ์ง์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ง์ ๋ณผ๋ฅจ ๋๋ผ์ด๋ฒ ํ๋ฌ๊ทธ ์ธ์ด ์์ต๋๋ค.
๋ณผ๋ฅจ ํ์ธํ๊ธฐ
docker volume inspect <volume-name>
Mountpoint๊ฐ ๋์คํฌ์์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์ค์ ์์น์ ๋๋ค.
** Docker Desktop์์ ์คํ๋๋ ๋์ Docker Desktop์ ๋ณผ๋ฅจ ๋ฐ์ดํฐ์ ์ง์ ์ก์ธ์ค ํ๋ Docker ๋ช ๋ น์ ์ค์ ๋ก ๋จธ์ ์ ์์ VM ๋ด์์ ์คํ๋ฉ๋๋ค. Mountpoint ๋๋ ํฐ๋ฆฌ์ ์ค์ ๋ด์ฉ์ ํ์ธํ๋ ค๋ฉด ๋จผ์ VM ๋ด๋ถ์ ์ก์ธ์คํด์ผ ํฉ๋๋ค. WSL 2์์๋ WSL 2 ๋ฐฐํฌํ ๋ด์ ์์ผ๋ฉฐ, ํ์ผ ํ์๊ธฐ๋ฅผ ํตํด ์ก์ธ์คํ ์ ์์ต๋๋ค.
6๋ถ : ๋ฐ์ธ๋ ํ์ฌ ์ฌ์ฉ
๋ฐ์ธ๋ ํ์ฌ ๋ฅผ ์ฌ์ฉํ๋ฉด ํธ์คํธ์ ํ์ฌ ์ง์ ์ ์ ํํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. ์ด ์ ํ์ ๋ฐ์ดํฐ ์ ์ง๋ฟ ์๋๋ผ ์ปจํ ์ด๋์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ฐ์ธ๋ ํ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ์ฝ๋๋ฅผ ์ปจํ ์ด๋์ ํ์ฌํ๋ฉด ๋ณ๊ฒฝ ๋ด์ฉ์ ์ฆ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ปจํ ์ด๋๊ฐ ์ฝ๋ ๋ณ๊ฒฝ์ ํ์ธํ๊ณ ์๋ตํ๊ฒ ํ ์ ์์ต๋๋ค.
์์๋ก ํ์ธ.
docker run -dp 3000:3000 -w /app -v ${PWD}:/app node:12-alpine sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
- -w /app - ์ปจํ ์ด๋ ๋ด์ ์์ ๋๋ ํฐ๋ฆฌ
- -v ${PWD}:/app" - ์ปจํ ์ด๋์ ์๋ ํธ์คํธ์ ํ์ฌ ๋๋ ํฐ๋ฆฌ๋ฅผ /app ๋๋ ํฐ๋ฆฌ๋ก ๋ฐ์ธ๋ ํ์ฌํฉ๋๋ค.
๋ฐ์ธ๋ ํ์ฌ ์ฌ์ฉ์ ๋ก์ปฌ ๊ฐ๋ฐ ์ค์ ์์ ‘๋งค์ฐ’ ์ผ๋ฐ์ ์ ๋๋ค. ๊ฐ๋ฐ ๋จธ์ ์ ๋ชจ๋ ๋น๋ ๋๊ตฌ์ ํ๊ฒฝ์ ์ค์นํ ํ์๊ฐ ์๋ค๋ ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋จ์ผ docker run ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ ํ๊ฒฝ์ด ํ๋์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ์ธ๋ ๋ง์ดํธ vs ๋ณผ๋ฅจ
- ๋ฐ์ธ๋ ๋ง์ดํธ์ ๊ฒฝ์ฐ, ํธ์คํธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฌ๋ ์, ๋ง์ดํธํ์ฌ ๋ฐ๋ก ์ฌ์ฉํ๊ฒ๋ ํจ. ๋ฐ๋ผ์, ์์ ์ด ์ผ์ด๋๋ ๋ฐ๋ก๋ฐ๋ก ๋ฐ์๋จ
( ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ๋ก ํ์ธ์ด ๊ฐ๋ฅ )
- ๋ณผ๋ฅจ์ ๊ฒฝ์ฐ, ํธ์คํธ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋์ปค์ ๋ณผ๋ฅจ ์์ญ์ผ๋ก ๊ฐ์ง๊ณ ์ ๋ณผ๋ฅจ์ ์์ฑํ์ฌ ํด๋น ๋ณผ๋ฅจ์ ์ปจํ
์ด๋์ ๋ง์ดํธํ๋ค.
( ๋์ปค์ ๋ณผ๋ฅจ ์์ญ์์ ์ ์ด๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ธ๋ถ์์ ๋ฐ๋ก ์ถ๊ฐํ ์ ์๋ค )
--> ๊ทธ๋ฌ๋ฉด ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ?
๋ณผ๋ฅจ์ด ๋ฐ์ธ๋ ๋ง์ดํธ๋ณด๋ค ์ข์ ์ฅ์ From Docker Docs
1. ๋ฐฑ์ ํ๊ฑฐ๋ ์ด๋์ํค๊ธฐ ์ฝ๋ค.
2. docker CLI ๋ช ๋ น์ด๋ก ๋ณผ๋ฅจ์ ๊ด๋ฆฌํ ์ ์๋ค.
3. ๋ณผ๋ฅจ์ ๋ฆฌ๋ ์ค, ์๋์ฐ ์ปจํ ์ด๋์์ ๋ชจ๋ ๋์ํ๋ค.
4. ์ปจํ ์ด๋๊ฐ์ ๋ณผ๋ฅจ์ ์์ ํ๊ฒ ๊ณต์ ํ ์ ์๋ค.
5. ๋ณผ๋ฅจ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณผ๋ฅจ์ ๋ด์ฉ์ ์ํธํํ๊ฑฐ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ถ๊ฐ ํ ์ ์๋ค.
6. ์๋ก์ด ๋ณผ๋ฅจ์ ์ปจํ ์ด๋๋ก ๋ด์ฉ์ ๋ฏธ๋ฆฌ ์ฑ์ธ ์ ์๋ค.
7๋ถ : ๋ค์ค ์ปจํ ์ด๋ ์ฑ
์ปจํ ์ด๋ ๋คํธ์ํน
๊ฐ์ ๋คํธ์ํฌ ๋์ญ์ ์๋ ์ปจํ ์ด๋ ์ฑ ๋ผ๋ฆฌ๋ ์ํธ๊ฐ ํต์ ๊ท์ฝ์ ๋ฐ๋ผ ํต์ ์ด ๊ฐ๋ฅํ๋ค.
MySQL ์ฐ๊ฒฐํ๊ธฐ
Docker Network ์์ฑ
docker network create <network-name>
MySQL ์ปจํ ์ด๋ ์คํ ๋ฐ Network ์ฐ๊ฒฐ
docker run --platform linux/x86_64 -d \
--network <network-name> --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
* ์ฌ๊ธฐ์๋ todo-mysql-data๋ผ๋ ๋ณผ๋ฅจ ์ด๋ฆ์ ์ฌ์ฉํ๊ณ , MySQL์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์น์ธ /var/lib/mysql์ ๋ณผ๋ฅจ์ ํ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ docker volume create ๋ช ๋ น์ ์คํํ ์ ์ ์์ต๋๋ค. Docker์์ ๋ช ๋ช ๋ ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ ค๋ ์๋๋ฅผ ์ธ์ํ๊ณ ์๋์ผ๋ก ๋ณผ๋ฅจ์ ๋ง๋ญ๋๋ค.
MySQL ์ปจํ ์ด๋ ์ํ ํ์ธ
docker exec -it <mysql-container-id> mysql -p
์คํ ์ค์ธ ์ปจํ ์ด๋์ MySQL์ ์ฐ๊ฒฐํ๊ธฐ
๋คํธ์ํน ๋ฌธ์ ํด๊ฒฐ ๋๋ ๋๋ฒ๊ทธ์ ์ ์ฉํ ‘๋ง์’ ๋๊ตฌ๊ฐ ํฌํจ๋ nicolaka/netshoot ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉ
netshoot ์ปจํ ์ด๋ ์คํ
docker run -it --network todo-app nicolaka/netshoot
MySQL ์ปจํ ์ด๋ ์ฃผ์ ํ์ธ
dig mysql
“ANSWER SECTION”์์ mysql์ ๋ํด A ๋ ์ฝ๋๊ฐ ํ์๋๋ฉฐ, 172.23.0.2๋ก ํ์ธ๋ฉ๋๋ค(์ฌ์ฉ์ IP ์ฃผ์๋ ๋ค๋ฅธ ๊ฐ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์). mysql๋ ์ผ๋ฐ์ ์ผ๋ก ์ ํจํ ํธ์คํธ ์ด๋ฆ์ด ์๋์ง๋ง, Docker์์ ํด๋น ๋คํธ์ํฌ ๋ณ์นญ์ ๊ฐ์ง ์ปจํ ์ด๋์ IP ์ฃผ์๋ก ํ์ธํ ์ ์์์ต๋๋ค(์์์ ์ฌ์ฉํ --network-alias ํ๋๊ทธ ์ฐธ์กฐ).
๋ฐ๋ผ์ ์ฑ์ด mysql์ด๋ผ๋ ํธ์คํธ์ ์ฐ๊ฒฐํ๊ธฐ๋ง ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ ์ ์์ต๋๋ค.
MySQL ๊ณผ ์ฑ ์ปจํ ์ด๋ ์ฐ๊ฒฐ
ํด๋น ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํ๊ฒฝ๋ณ์์ MySQL ์ ๋ณด๋ฅผ ์ง์ ํ์ฌ ์ฐ๊ฒฐ ์คํ
docker run -dp 3000:3000 \
-w /app -v ${PWD}:/app \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
์ฑ ๋ฌ๋ ํ, ์ ์ํ์ฌ ๋ช๊ฐ์ ์์ดํ ์ ์ ์ฅํฉ๋๋ค. ์ดํ, ๋ค์ MySQL์ ์คํํ์ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ํ์ธํ๋ฉด todo์์ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ค์ด ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
8๋ถ : Docker Compose ์ฌ์ฉ
Docker Compose๋ ๋ค์ค ์ปจํ ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ณ ๊ณต์ ํ ์ ์๋๋ก ๊ฐ๋ฐ๋ ๋๊ตฌ์ ๋๋ค. Compose์์ ์๋น์ค๋ฅผ ์ ์ํ๋ YAML ํ์ผ์ ๋ง๋ค๊ณ , ๋จ์ผ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์คํํ๊ฑฐ๋ ๋ชจ๋ ์ข ๋ฃํ ์ ์์ต๋๋ค.
Compose๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ‘์ค์ํ’ ์ด์ ์ ํ์ผ์์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ ์ํ๊ณ ํ๋ก์ ํธ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์ ํ์ผ์ ์ ์ฅํ์ฌ(์ด์ ๋ฒ์ ์ ์ด ์ฌ์ฉ) ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
* mac์ฉ docker desktop์ ์ค์นํ์๋ค๋ฉด, ๋ณ๋๋ก ์ค์นํ ํ์๊ฐ ์๋ค.
docker-compose version
์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ฒ์ ์ด ๋ณด์ธ๋ค๋ฉด ์ค์น๊ฐ ๋์ด ์๋ ๊ฒ์ด๋ค.
Docker Compose ํ์ผ ๋ง๋ค๊ธฐ
ํ๋ก์ ํธ ๋ฃจํธ์ docker-compose.yml ์ด๋ผ๋ ํ์ผ ์์ฑํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ง์
# ์คํค๋ง ๋ฒ์ ์ ์. ์ต์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข๋ค.
version: "3.7"
# ์๋น์ค ๋ชฉ๋ก ์ ์
services:
# ์ฑ ์๋น์ค ์ ์
app:
# ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ด๋ฆ ์ ์
image: node:12-alpine
# ์คํํ๊ณ ์ ํ๋ ๋ช
๋ น์ด
command: sh -c "apk add --no-cache python2 g++ make && apk --no-cache --virtual build-dependencies add python2 make g++ && yarn install && yarn run dev"
# ํฌํธ ์ ์ ( host 3000 ์ container 3000์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
)
ports:
- 3000:3000
# ์์
๋๋ ํ ๋ฆฌ์ ๋ณผ๋ฅจ ๋งคํ์ ๋ง์ด๊ทธ๋ ์ด์
# ํ์ผ์ด ์์นํ ๊ณณ ๊ธฐ์ค์ผ๋ก ์๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
working_dir: /app
volumes:
- ./:/app
# ํ๊ฒฝ๋ณ์๋ฅผ ์ด์ฉํ DB ์ธํ
.
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
# MySQL ์๋น์ค ์ ์
mysql:
# ์ด๋ฏธ์ง ์ด๋ฆ ์ ์
image : mysql:5.7
# docker run ์ผ๋ก ์คํํ ๋๋ ์๋์ผ๋ก volume ์ด ์ค์ ๋์์ง๋ง
# ์ฌ๊ธฐ์๋ ์๋์ด ์๋๋ฏ๋ก ๊ฒฝ๋ก๋ฅผ ์ง์ ํด์ค๋ค.
# ์ด๋ฆ : ๊ฒฝ๋ก ๋ก ์ง์ ํด์ฃผ๋ฉฐ, ์ฌ๊ธฐ์ ์ง์ ๋ ์ด๋ฆ์ ๋ฐ๊นฅ volumes ์์ ํ์ฌํ์ฌ ์ฌ์ฉํ๋ค.
volumes:
- todo-mysql-data:/var/lib/mysql
# ํ๊ฒฝ๋ณ์ ์ง์
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์คํ
์์ ๊ฐ์ด ์ค์ ์ ๋๋์ผ๋ฉด, ์ด์ ์คํ์ ํ๋ฉด ๋๋ค.
docker-compose.yml ํ์ผ์ด ์๋ ๊ฒฝ๋ก์์ ์คํ.
docker-compose up -d
์๋์ ๊ฐ์ ๋ด์ฉ์ด ๋จ๋ฉด ์ฑ๊ณตํ ๊ฒ์ด๋ค.
Creating network "app_default" with the default driver
Creating volume "app_todo-mysql-data" with default driver
Creating app_app_1 ... done
Creating app_mysql_1 ... done
ํด๋น ๋ฌ๋ ๋ก๊ทธ๋ฅผ ์๋ ๋ช ๋ น์ด๋ก ํ์ธ.
docker-compose logs -f
์๋์ ๊ฐ์ด ํ๊ธฐ๊ฐ ๋๋ค๋ฉด ๋ฌ๋์ ์ฑ๊ณตํ ๊ฒ์ด๋ค.
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
app_1 | Connected to mysql db at host mysql
app_1 | Listening on port 3000
์คํ ์ค์ธ ์ฑ ์คํ ํ์ธ
vscode์์ docker ํ์ฅ์ ๋ณด๋ฉด ์คํ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ก์จ docker compose ๋ฅผ ํตํด mysql๊ณผ ์ฑ์ ๋คํธ์ํน์ผ๋ก ์ฐ๊ฒฐํ์ฌ ์๋น์ค๋ฅผ ์ฌ๋ฆฌ๋๋ฐ ์ฑ๊ณตํ์๋ค.
์ข ๋ฃํ๊ธฐ
๋ชจ๋ ์ข ๋ฃํ ์ค๋น๊ฐ ๋์์ผ๋ฉด docker-compose down์ ์คํํ๊ฑฐ๋ VS Code Docker ํ์ฅ์ ์ปจํ ์ด๋ ๋ชฉ๋ก์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋จ์ถ๋ก ํด๋ฆญํ๊ณ Compose ์ข ๋ฃ ๋ฅผ ์ ํํฉ๋๋ค. ์ปจํ ์ด๋๊ฐ ์ค์ง๋๊ณ ๋คํธ์ํฌ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
9๋ถ : ์ด๋ฏธ์ง ๊ณ์ธตํ
์ด๋ฏธ์ง ๊ณ์ธต ํ์ธ
docker image history <image-name>
์ด๋ฏธ์ง์ ์ฐ์ธ ๊ณ์ธต๋ค์ ํ์ธํ ์ ์๋ค. ๋งจ ์๊ฐ ์ต์ ๊ณ์ธต ์ด๋ฉฐ ์ด๋ฅผ ํตํด ๊ฐ ๊ณ์ธต์ ์ฉ๋ ๋ฑ์ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
๊ณ์ธต ์บ์ฑ
Dockerfile์ ๊ฐ ๋ช ๋ น์ด ๊ณ์ธต์ด ๋๋๊ฒ ์์ ํ์ธ ํ์ผ๋, ๊ณ์ธต์ด ๋ณ๊ฒฝ ๋ ๋ ๋ง๋ค ์ข ์์ฑ์ ๋ค์ ์ค์นํ๋ ๊ฒ์ ๋นํจ์จ ์ ์ด๋ฏ๋ก, ์ด๋ฅผ ์ค์ด๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ ์ฉํด์ผ ํจ.
์์ ์์๋ node์์ ์ข ์์ฑ์ ๊ฐ๋ package.json ํ์ผ์ ๋ณต์ฌํ์ฌ ์ค์น ํ ํ, ๋๋จธ์ง๋ฅผ ๊ทธ ์ดํ์ ๋ณต์ฌํ์ฌ package.json๋ง ๋ณ๊ฒฝ ์ ์ด ์์ ๋ ๋ค์ ์ค์นํ๋๋ก ๋ณ๊ฒฝํจ.
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
# ์ข
์์ฑ ์นดํผ
COPY package.json yarn.lock ./
COPY . .
RUN apk --no-cache --virtual build-dependencies add \
python2 \
make \
g++
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
๋ค๋จ๊ณ ๋น๋
- ๋ฐํ์ ์ข ์์ฑ๊ณผ ๋น๋ ์๊ฐ ์ข ์์ฑ ๊ตฌ๋ถ
- ์ฑ์ ์คํํ๋ ๋ฐ ํ์ํ ‘ํญ๋ชฉ’๋ง ์ ๊ณตํ์ฌ ์ ์ฒด ์ด๋ฏธ์ง ํฌ๊ธฐ ์ถ์
Maven/Tomcat ์์
# ์ฒซ๋ฒ์งธ ๋จ๊ณ. ๋น๋๋จ๊ณ์์๋ง JDK ํ์, ์ฌ๊ธฐ์ ์ํ.
FROM maven AS build
WORKDIR /app
COPY . .
RUN mvn package
# ๋๋ฒ์งธ ๋จ๊ณ. ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ํฐ์บฃ ๋๋ ํฐ๋ฆฌ๋ก ๋ณต์ฌ.
# ์ด ๋จ๊ณ๊ฐ ๋ง์ง๋ง์ด๋ฏ๋ก, ์ต์ข
๋น๋๋๋ ์ด๋ฏธ์ง๋ ์ด ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฌผ์.
FROM tomcat
COPY --from=build /app/target/file.war /usr/local/tomcat/webapps
React ์์
# ์ฒซ๋ฒ์งธ ๋จ๊ณ. ์ด ๋จ๊ณ์์ ๋น๋ ์ํ
FROM node:12 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build
# ๋๋ฒ์งธ ๋จ๊ณ. ์ด ๋จ๊ณ์์ nginx์ ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ฎ๊น.
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
์ฆ, ๋น๋ ๋จ๊ณ์๋ง ํ์ํ ๋๊ตฌ๋ค์ ์ ๋ถ ์ด๋ฏธ์ง์ ํฌํจ์ํค์ง ์๊ณ , ๋น๋ ์ํ ํ ์ด๋ฏธ์ง์๋ ํฌํจ ์ํค์ง ์์ ์ด๋ฏธ์ง์ ์ฉ๋์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค. ์ ๋๊ฐ์ง ์์ ๋ก ๋ณด๋ฉด, ๋น๋ ํ์ ๊ฒฐ๊ณผ๋ฌผ๋ง WAS์ ์ฎ๊ธฐ๊ณ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ธ ๊ฒ์ ์ ์ ์๋ค.
10๋ถ : ํด๋ผ์ฐ๋์ ๋ฐฐํฌ
ํด๋ผ์ฐ๋์ ๋ฐฐํฌํ๊ธฐ ์ํด์๋ ํด๋ผ์ฐ๋ ์ปจํ ์คํธ๊ฐ ํ์. ํ์ฌ๊น์ง ์ฌ์ฉํ ๊ฒ์ ๊ธฐ๋ณธ docker ์ปจํ ์คํธ์.
์์ ์์๋ Azure(์ ์ ) ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ณ์ ์ ์ด์ฉํ์ฌ ์ ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐ ํ ์ ์์.
ํด๋น ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด ๋ค์์ ๋ช
๋ น์ด๋ก ํด๋น ์ปจํ
์คํธ์์ ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ ์์.
docker context use myacicontext
docker run -dp 3000:3000 <username>/getting-started
๋.
'๐Docker' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker CentOS7] CentOS7 locale language ko_KR ์ค์ (0) | 2022.06.23 |
---|---|
[์ค์ต] Docker Spring Boot + Postgresql (3) (0) | 2022.01.25 |
[์ค์ต] Docker Spring Boot + Postgresql (2) (0) | 2022.01.24 |
[์ค์ต] Docker Spring boot + Postgresql (1) (1) | 2022.01.20 |
[MS ์์ต์] Docker Application build Python ์๋ฌ ํด๊ฒฐ (2) | 2022.01.10 |
๋๊ธ