
'๋ฐ๋ผํ๋ฉฐ ๋ฐฐ์ฐ๋ ๋์ปค์ CI ํ๊ฒฝ' ์ฑ ์ ์ฝ๊ณ ๋ฆฌ๋ทฐ๋ฅผ ์ธ๊น ํ๋ค๊ฐ ๊ฐ๋ ์ ์ ์ฒด์ ์ผ๋ก ์ ๋ฆฌํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ๋จ๊ธฐ๋ ๊ธ ๐ซ
๋์ปค๋ ์ ํ๋ฆฌ์ผ์ด์
์ "์ปจํ
์ด๋"๋ผ๋ ํ์คํ๋ ์ ๋์ผ๋ก ํจํค์งํด์ ์ ์ํ๊ฒ ๊ตฌ์ถ, ํ
์คํธ, ๋ฐฐํฌ, ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์ํํธ์จ์ด ํ๋ซํผ
โ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํด ์์ฉํ๋ก๊ทธ๋จ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ณ ๋ฐฐํฌํ๊ณ ์คํํ ์ ์๋๋ก ์ค๊ณ
์ด๋ฏธ์ง๋ฅผ ํตํด ์ปจํ
์ด๋๋ฅผ ๋ง๋ ๋ค!
์ด๋ฏธ์ง: ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ทธ ์คํ์ ํ์ํ ์์คํ
, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ๋ ์ฝ๊ธฐ ์ ์ฉ ์คํ ํ
ํ๋ฆฟ
์ปจํ
์ด๋: ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ์คํํ ์ธ์คํด์ค

๊ฐ์๋จธ์ (VM)์ ํ์ดํผ๋ฐ์ด์ ๊ธฐ๋ฐ(๋ฌผ๋ฆฌ ํ๋์จ์ด ์์์ ์ฌ๋ฌ ๊ฐ์ ๋จธ์ ์ ๊ตฌ๋)์ผ๋ก, ์ ์ฒด ์ด์ ์ฒด์ (OS)๋ฅผ ํฌํจํ์ฌ ์์ฒด ์ปค๋, ํ๋์จ์ด ๋๋ผ์ด๋ฒ, ํ๋ก๊ทธ๋จ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
๋ฑ ๋ ๋ง์ ๋ฆฌ์์ค๋ฅผ ํฌํจํ๊ณ ์์ด ๋ฌด๊ฒ๋ค
๋ฐ๋ผ์ ๋จ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์
๋ง ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ ๋จธ์ ์ ์์ฑํ๋ ๊ฑด ๋นํจ์จ์ ์ด๋ค
๋ค๋ง ๋ ๊ฐ๋ ฅํ ๊ฒฉ๋ฆฌ์ ๋ณด์ ์ ๊ณต
์ปจํ
์ด๋๋ ์ฌ๋ฌ ๊ฐ์ ์ปจํ
์ด๋๋ฅผ ์คํํด๋ ๋์ผํ ์ปค๋์ ๊ณต์ ํ๋ฉฐ, ํ์ํ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ทธ ์ข
์์ฑ๋ง์ ํฌํจํ์ฌ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ค
์คํ ์๊ฐ์ด ์งง๊ณ ๋ฆฌ์์ค ์ฌ์ฉ๋ ํจ์จ์
๊ฐ ์ปจํ
์ด๋๋ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๊ฒฉ๋ฆฌ๋ ํ๋ก์ธ์ค๋ก ์คํ
์๋ก ํ์ ํ๋ฉด์ ์ผ์ด๋ ์ ์๋ ์ํฉ์ ๊ฐ์ ํด๋ณด์!
๊ฐ๋ฐ ํ๊ฒฝ ๋ถ์ผ์น
A : ํ๋ก์ ํธ ์คํํ๋ ค๋๊น ๊ฐ์๊ธฐ ์ด๋ฐ ์๋ฌ๊ฐ ๋๋ฉด์ ์๋ผ์ (java 17)
B : ์ ์ปดํจํฐ์์๋ ๋๋๋ฐ์? (java 11)
๐ ๋ฌธ๋ฒ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด์ฑ์ด ๋ฏธ๋ฌํ๊ฒ ์ด๊ธ๋๋ฉด์ ๊ฐ๋ฐ ํ๊ฒฝ ๋ถ์ผ์น๋ก ์ค๋ฅ๊ฐ ์ผ์ด๋ ์ ์์
โ
๋์ปค๋ฅผ ์ด๋ค๋ฉด ๊ฐ๋ฐ, ํ
์คํธ, ์ด์ ํ๊ฒฝ์ ์ผ์น์์ผ ํ๊ฒฝ ์ฐจ์ด๋ก ์ธํ ๋ฌธ์ ๋ฅผ ์์ฒ ์ฐจ๋จํ ์ ์๋ค!
๋ณต์กํ ์ค์น ๊ณผ์ ์๋ต
๋ฌผ๋ก ๋ฌผ๋ก ์ด๋ฐ ์ผ์ด ์ค๋ฌด์๋ ์๊ฒ ์ง๋ง ๊ฐ๋ฐ์ ๋ง ๋ฐฐ์ฐ๊ธฐ ์์ํ ์์ ์ ํ ํ๋ก์ ํธ๋ฅผ ํ๋ค๊ฐ ์์ง ๋ฐฐํฌ ์ ์ด๋ผ ํ๋ก ํธ์๋ A๊ฐ ๋ฐฑ์๋ API๋ฅผ ์ฐ๋ํด์ ํ
์คํธ๋ฅผ ํด๋ด์ผ ํ๋ ์ํฉ์ด๋ผ๊ณ ํ์
A: API ์ฐ๋ ํ
์คํธ ํ ๊ฑด๋ฐ ์ด๋ป๊ฒ ํด์ผ ํ๋์?
B: ์ ๋จผ์ Java๋ MySQL ๊น์๊ตฌ์ ์คํฌ๋ฆฝํธ ํ ๋ฒ ๋๋ฆฌ์๊ณ ์ ๊ทธ๋ฆฌ๊ณ Redis๋ ํฌํธ ์ด์ด์ ๋์๋์
์ผํ๋๋ฐ...
A: (๋ฐฑ์๋ DB ์ธํ
๊น์ง ํด์ผํ๋๊ฑฐ..?)
๐ ์ด๋ ๊ฒ API ์ฐ๊ฒฐ ํ๋๋ฅผ ์ํด์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐฑ์๋ ๋ค ๋ก์ปฌ์ ์ง์ ๊ตฌ์ถํ๊ฒ ๋๋ฉด ํ๊ฒฝ ์ธํ
์๋ง ํ๋ฃจ๋ฅผ ์ฐ๊ฒ ๋ ์๋ ์๋ค
โ
๋์ปค๋ฅผ ์ด๋ค๋ฉด ํ๋ก ํธ์๋๋ ๋ฐฑ์๋ ์ชฝ์์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ docker-compose.yml ํ์ผ ํ๋๋ง ๋ฐ์๋ค๊ฐ ์ปจํ
์ด๋ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋๋ค

1. ๋์ปค ํด๋ผ์ด์ธํธ(CLI) ์์ ๋ช
๋ น(์์ฒญ)
์) docker run hello-world
2-1. ๋์ปค ์๋ฒ(๋ฐ๋ชฌ)
ํด๋น ์ด๋ฏธ์ง๊ฐ ๋ก์ปฌ์ ์ด๋ฏธ ๋ค์ด๋ก๋ ๋์ด์๋์ง ํ์ธ (์ด๋ฏธ์ง ์บ์ ๋ณด๊ด ์ฅ์)
์์ผ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ฉฐ docker๊ฐ ์ด๋ค ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋์ง ํ์ธํด๋ณผ ์ ์์
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:5dd0d3e6e255913fc30f90b9f2b1d359cc2cbdb48090cc4b65f1676e203243cc
Status: Downloaded newer image for hello-world:latest
2-2. ๋์ปค ํ๋ธ์ ์ฐ๊ฒฐํ์ฌ ์ด๋ฏธ์ง ๊ฐ์ ธ์์ ๋ก์ปฌ์ ๋ณด๊ด ํ ์ด๋ฏธ์ง ์ด์ฉํ์ฌ ์ปจํ
์ด๋ ์์ฑํ๊ฒ ๋๋ค
์ด๋ ๋ช
๋ น์ด ์คํ ํ ๋์ค๋ ์ถ๋ ฅ ๊ฒฐ๊ณผ์์๋ ํ์ธ ๊ฐ๋ฅ
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64)
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

๋์ปคํ๋ธ๋ ๋์ปค ๋ ์ง์คํธ๋ฆฌ (์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ ๊ณต์ ํ๋ ์ค์ ์ง์ค์ ์์น)
๋ค์ํ ๊ณต๊ฐ Docker ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋์ด ์๊ณ , ๋น๋๋ ์ด๋ฏธ์ง๋ ์ ์ฅํ ์ ์์
docker-compose.yml์์ build ๋์ image:<๋์ปค์์ด๋>/<๋์ปค์ด๋ฏธ์ง์ด๋ฆ> ์ผ๋ก ๋์ปค์ด๋ฏธ์ง๋ฅผ ์ค์ ๋ก ๋น๋ ํ๋๊ฒ ์๋ ๋์ปค ํ๋ธ์ ๋น๋๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉ
services:
# ๋ก์ปฌ Dockerfile์ ๋น๋ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
my-app:
build: .
# ๋์ปค ํ๋ธ์ ์ด๋ฏธ ์ฌ๋ผ๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ฐ๋ ๊ฒฝ์ฐ
my-app:
image: ppnyoong/my-app:latest
๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค์ ํ์ผ
์ด ํ์ผ ์์๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐ ํ์ํ ๋ช
๋ น์ด๋ค์ด ์์๋๋ก ๊ธฐ์
โ ๋์ปค ์ปจํ
์ด๋๊ฐ ์ด๋ป๊ฒ ํ๋ํด์ผ ํ๋์ง์ ๋ํ ์ค์ ์ ์ ์
docker build ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Dockerfile๋ก๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด ๊ณผ์ ์์ ๊ฐ ๋ช
๋ น์ด๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ
FROM node:10
WORKDIR /usr/src/app
COPY package.json ./
RUN npm install
COPY ./ ./
EXPOSE 8080
CMD ["node","server.js"]
<์ด๋ฏธ์ง ์ด๋ฆ>:<ํ๊ทธ> ํ์์ผ๋ก ์์ฑ
์์ค์ฝ๋ ๋ณ๊ฒฝ๋ง ์ผ์ด๋ ๊ฒฝ์ฐ์๋ ์ข
์์ฑ๊น์ง ๋ค์ ๋ด๋ ค๋ฐ์ ํ์๊ฐ ์๋ค
์ข
์์ฑ์ ๋ด๋ ค๋ฐ๋ ๋จ๊ณ๋ฅผ ๋๋์ด ์ข
์์ฑ์ ๋ณํ๊ฐ ์์๋๋ง ๋ค์ ๋ด๋ ค๋ฐ๊ณ ์์ผ๋ฉด ์บ์(cache)๋ฅผ ์ด์ฉํด ํด๋น ๊ณผ์ ์๋ต
โ ๋น๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ์์ Using Cache ๊ฐ ๋จ๋๊ฑธ ํ์ธํ ์ ์๋ค
์ฝ๋ ์์ ์ ์์ค ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ ์๋๋ผ ํธ์คํธ ๋๋ ํฐ๋ฆฌ์ ์๋ ํ์ผ๋ค์ ์ฐธ์กฐํด์ ์ฌ์ฉ
โ COPY ํด์ ์ฌ๋น๋ํ ํ์๋ฅผ ์ค์ด๊ณ ๋ฐ๋ก๋ฐ๋ก ์์
๋ด์ฉ ํ์ธ ๊ฐ๋ฅ

-v๋ ๋ฐ์ธ๋ ๋ง์ดํธ, ์ต๋ช
๋ณผ๋ฅจ
์์ ์ต๋ช
๋ณผ๋ฅจ์ ๋ํ๋ด๊ณ ๋ค๋ ๋ฐ์ธ๋๋ฅผ ๋ํ๋ธ๋ค -v ํธ์คํธ ๊ฒฝ๋ก:์ปจํ
์ด๋ ๊ฒฝ๋ก
ํ๋์ ํ์ผ์์ ์ฌ๋ฌ Docker ์ปจํ
์ด๋๋ฅผ ์ ์ํ๊ณ ํ๋ฒ์ ์คํํ๊ธฐ ์ํ ๋๊ตฌ
docker-compose.yaml ํ์ผ๋ก ๊ตฌ์ฑ
docker-compose up--build ๋ฅผ ๋ถ์ด๋ฉด ์ด๋ฏธ์ง ์๋ ์๋ ์ด๋ฏธ์ง ๋น๋ํ๊ณ ์์docker-compose stopdocker-compose downversion: '3.8' # ๋์ปค ์ปดํฌ์ฆ์ ๋ฒ์
services: # ์ด๊ณณ์ ์คํํ๋ ค๋ ์ปจํ
์ด๋๋ค์ ์ ์
# ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ Redis ์๋น์ค
redis-server: # ์ปจํ
์ด๋ ์ด๋ฆ
image: redis:alpine # ์ปจํ
์ด๋์์ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง
restart: always
# ๋ก์ปฌ Dockerfile์ ๋น๋ํ์ฌ ์ฌ์ฉํ๋ Node.js ์ฑ ์๋น์ค
node-app: # ์ปจํ
์ด๋ ์ด๋ฆ
build: . # ํ์ฌ ๋๋ ํฐ๋ฆฌ์ Dockerfile ๋น๋
ports:
- "8080:8080" # ํฌํธ๋งคํ "๋ก์ปฌ:์ปจํ
์ด๋ ํฌํธ"
depends_on:
- redis-server # redis-server๊ฐ ๋จผ์ ์์๋๋๋ก ์ค์
environment: # ํ๊ฒฝ ๋ณ์
- REDIS_HOST=redis-server
- REDIS_PORT=6379
restart ์ต์
๋น๊ตalways ์ธ์ ๋ ๋ค์ ์์unless-stopped ๋ฉ์ถ์ง ์์๋ค๋ฉด ๋ค์ ์์no (๊ธฐ๋ณธ๊ฐ)on-failure ์คํจํ์ ๋๋ง ๋ค์ ์์Dockerfile์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ ๊ณตํ๊ณ , compose ํ์ผ์ ์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ์ ์ (compose ํ์ผ์ ํน์ ์๋น์ค์ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํด Dockerfile์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์)
docker versiondocker run hello-worlddocker run = docker create + docker startdocker run <์ด๋ฏธ์ง> lsdocker ps (ps=process status)docker ps -a (a=all) docker inspect <์ปจํ
์ด๋๋ช
>docker logs <์ปจํ
์ด๋๋ช
>docker exec -it <์ปจํ
์ด๋๋ช
> <๋ช
๋ น์ด>docker exec -it <์ปจํ
์ด๋๋ช
> shdocker stop <์ปจํ
์ด๋๋ช
>docker kill <์ปจํ
์ด๋๋ช
>docker rmi <์ด๋ฏธ์ง>docker imagesCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "/docker-entrypoint.โฆ" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp web-server
--name ์ต์
์ผ๋ก ์ด๋ฆ์ ์ค์ ํ์ง ์์ผ๋ฉด ๋์ปค ์์ง์ด ์์๋ก ํ์ฉ์ฌ์ ๋ช
์ฌ๋ฅผ ์กฐํฉํด ์ค์ docker rename <์๋ ์ด๋ฆ> <๋ณ๊ฒฝํ ์ด๋ฆ>)Docker docs
๋ฐ๋ผํ๋ฉฐ ๋ฐฐ์ฐ๋ ๋์ปค์ CI ํ๊ฒฝ
[๋ฐ๋ผํ๋ฉฐ ๋ฐฐ์ฐ๋ ๋์ปค์ CI ํ๊ฒฝ] Docker ๊ฐ๋
"Docker ์์ด๋ ๋์ง ์๋์?" โ ๋ฉด์ ๊ด์ด ๋ฃ๊ณ ์ถ์ ์ง์ง ๋๋ต
[๋ฉด์ ] ๊ธฐ์ ๋ฉด์ - Docker
๋์ปค ๋ฉด์ ์ง๋ฌธ 20์ ์ ๋ฆฌ ์ค๋ฌด ๊ฐ๋ฐ์๋ผ๋ฉด ๊ผญ ์์์ผ ํ ํต์ฌ ๊ฐ๋