๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/DevOps

Docker์™€ Nginx๋ฅผ ํ™œ์šฉํ•ด react ํ”„๋กœ์ ํŠธ ec2์— ๋ฐฐํฌ ๋ฐ jenkins๋ฅผ ํ™œ์šฉํ•œ CI/CD ๊ตฌ์ถ• + docker compose ํ™œ์šฉ - 3(์  ํ‚จ์Šค์™€ ๊นƒ๋žฉ ์—ฐ๊ฒฐ ๋ฐ ci/cd ์„ค์ •)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 3. 18.

jenkins์™€ gitlab ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ

docker, docker-compose, nginx, jenkins, react, ec2 ๋ฐฐํฌ

1. ๋ฐฐํฌ ํ๋ฆ„ ์š”์•ฝ ๋ฐ q&a
2. ๋ฐฐํฌ ํ”„๋กœ์ ํŠธ docker ๋ฐ nginx ํŒŒ์ผ ์„ค์ •
3. ์  ํ‚จ์Šค์™€ ๊นƒ๋žฉ ์—ฐ๊ฒฐ ๋ฐ ci/cd ์„ค์ •

1. ์  ํ‚จ์Šค ์„ค์น˜

๋จผ์ € ๋‹ค์Œ ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ๋„์ปค์ธ ๋„์ปค๊ฐ€ ์ ์šฉ๋œ ์  ํ‚จ์Šค๋ฅผ ec2 ์„œ๋ฒ„ ๋‚ด๋ถ€์— ์„ค์น˜ํ•ด์ฃผ์ž

Docker in Docker๋ฅผ ์ ์šฉํ•œ Jenkins ์„ค์น˜ํ•˜๊ธฐ

โœ” ์™œ ๋„์ปค๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•œ ์  ํ‚จ์Šค์— ๋˜ ๋„์ปค๋ฅผ ์„ค์น˜ํ• ๊นŒ?

  • ๋จผ์ € ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ด ์  ํ‚จ์Šค๋ฅผ image&conatainerํ™” ํ•ด์„œ ec2 ์„œ๋ฒ„์— ์„ค์น˜ํ•ด๋‘”๋‹ค.
  • ์„ค์น˜๋œ ์  ํ‚จ์Šค๋Š” ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์ ํŠธ(๋ณธ ๊ธ€์—์„œ๋Š” frontend)์— ๋Œ€ํ•œ ci/cd๋ฅผ ๋งก๊ฒŒ ๋˜๋Š”๋ฐ, ๋นŒ๋“œ/๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋„์ปค๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆํ™” ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์  ํ‚จ์Šค ๋‚ด๋ถ€์—๋„ ๋„์ปค๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

2. ์  ํ‚จ์Šค ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

1๋ฒˆ ๋ธ”๋กœ๊ทธ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด ๋„์ปค๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ๊นƒ๋žฉ๊ณผ ๋„์ปค ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž˜ ์„ค์น˜๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ์„ค์น˜๊ฐ€ ์•ˆ๋˜์—ˆ๋‹ค๋ฉด DashBoard > Manager Jenkins > Plugin Manager์—์„œ gitlab, docker ๊ฒ€์ƒ‰ ํ›„ ๊ฐ๊ฐ ์ƒ์œ„ 4๊ฐœ ํ•ญ๋ชฉ์„ ์„ค์น˜ํ•ด์ฃผ์ž

๋ณธ๊ฒฉ์ ์ธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โœ” Jenkins ๋ฉ”์ธ ํ™”๋ฉด์—์„œ ์ƒˆ๋กœ์šด item์„ ๋ˆŒ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์ž

โœ” ํ”„๋กœ์ ํŠธ๋Š” ํ”„๋ฆฌ์Šคํƒ€์ผ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค.

Q. ์™œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์•„๋‹ˆ๋ผ ํ”„๋ฆฌ์Šคํƒ€์ผ๋กœ ํ–ˆ๋‚˜์š”?

A. Jenkins์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ๋นŒ๋“œ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ jenkinsfile๋กœ ๋นผ์„œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ทœ๋ชจ ์ž‘์—…์— ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ณธ ํ”„๋กœ์ ํŠธ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ตณ์ด ํ•ด๋‹น ๊ธฐ๋Šฅ๋“ค์ด ํ•„์š”ํ•˜์ง€ ์•Š์•„์„œ ๋น„๊ต์  ๊ฐ„ํŽธํ•œ ํ”„๋ฆฌ์Šคํƒ€์ผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ์  ํ‚จ์Šค -> ๊นƒ๋žฉ ์—ฐ๊ฒฐ

โœ” ์†Œ์Šค์ฝ”๋“œ ๊ด€๋ฆฌ์—์„œ git์„ ์„ ํƒํ•ด์ฃผ๊ณ  ์—ฐ๊ฒฐํ•  ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

โœ” Credential ๊ฐ™์€ ๊ฒฝ์šฐ์— sshํ‚ค๋‚˜ apiํ† ํฐ์„ ์ด์šฉํ•˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๋ณธ ๊ธ€์—์„œ๋Š” ๋น„๊ต์  ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์ธ ๊นƒ๋žฉ ๊ณ„์ •์„ ํ†ตํ•ด ์ธ์ฆ์„ ํ–ˆ๋‹ค.

โœ” ๋นŒ๋“œ ์œ ๋ฐœ > Build when a change is pushed to Gitlab์„ ์„ ํƒํ•˜๊ณ  ์ƒ์„ฑ๋œ ์›นํ›… url์„ ์ž˜ ๊ธฐ์–ตํ•ด๋‘์ž

โœ” ๊ณ ๊ธ‰์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด Secret token๋ž€์ด ์žˆ๋‹ค. generate๋ˆŒ๋Ÿฌ์„œ ํ† ํฐ์„ ์ƒ์„ฑํ•ด์ฃผ๊ณ  ์ž˜ ๊ธฐ์–ตํ•ด๋‘์ž. ์œ„์— ์ƒ์„ฑ๋œ ์›นํ›… url๊ณผ ํ•จ๊ป˜ ๊นƒ๋žฉ์—์„œ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค

4. ์  ํ‚จ์Šค ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

โœ” Build Steps > Execute shell ์„ ํƒ

โœ” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”๋กœ ์ด๋™ ํ›„ dockerfile์„ ์‹คํ–‰ํ•˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

cd front-end

# ์ตœ์‹  ์ด๋ฏธ์ง€ ๋นŒ๋“œํ•˜๊ณ  ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ ๋ฎ์–ด์“ฐ๊ธฐ
docker-compose up -d --build --force-recreate

# ๊ธฐ์กด ์ด๋ฏธ์ง€ ์ฃฝ์ด๊ธฐ
docker image prune -f

โœ” ์šฐ๋ฆฌ๋Š” ์ง์ „ ๊ธ€์—์„œ docker-compse๋กœ Docekrfile์˜ ์‹คํ–‰ํ™˜๊ฒฝ์„ ์ •์˜ํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น docker-compose.yml ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

# ์ฐธ๊ณ : docker-compose๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

# ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋กœ ์ด๋™์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ
cd ${PROJECT_ROOT}
# ๊ธฐ์กด์— ๋Œ์•„๊ฐ€๋Š” ์ปจํ…Œ์ด๋„ˆ ์ฃฝ์ด๊ธฐ
if docker ps -a --filter "name=${CONTAINER_NAME}" > /dev/null; then
  docker kill frontend && docker rm frontend
fi
docker build -t ${CONTAINER_NAME} .
docker run -d -p ํฌํŠธ๋ฒˆํ˜ธ:ํฌํŠธ๋ฒˆํ˜ธ ${CONTAINER_NAME} --name ${CONTAINER_NAME}

# ๊ธฐ์กด ์ด๋ฏธ์ง€ ์ฃฝ์ด๊ธฐ
docker image prune -f

โœ” docker-compose๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ shell-script๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ํ–ˆ์œผ๋ฉด jenkins์—์„œ์˜ ์„ค์ •์€ ๋๋‚ฌ๋‹ค.

5. ๊นƒ๋žฉ -> ์  ํ‚จ์Šค ์—ฐ๊ฒฐ

โœ” ๋ฐฐํฌํ•  ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” gitlab ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋“ค์–ด๊ฐ€์„œ ์ขŒ์ธกํ•˜๋‹จ settings > Webhooks์— ๋“ค์–ด๊ฐ€์ž

  • ๋งŒ์•ฝ settings๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฉค๋ฒ„ ๊ถŒํ•œ ์„ค์ •์„ ํ™•์ธํ•ด์ฃผ์ž

โœ” #3 ์—์„œ ์–ป์€ webhook URL๊ณผ secret token์„ ์ž…๋ ฅํ•ด์ฃผ๊ณ  ๋ธŒ๋žœ์น˜๋ฅผ ์„ค์ •ํ•ด์ฃผ์ž

โœ” ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” Trigger ์„ค์ • ํ›„ Add webhook ํด๋ฆญํ•˜์ž

โœ” ํ•˜๋‹จ์˜ project hooks์—์„œ ์›ํ•˜๋Š” trigger๋ฅผ ์œ ๋ฐœํ•ด ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž 200์ด ๋ณด๋‚ด์ง€๋ฉด ์„ฑ๊ณต์ด๋‹ค.

6. ์„ฑ๊ณต!

โœ” ์›นํ›… ์„ค์ •์„ ์™„๋ฃŒํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฑธ์–ด๋‘” ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋ฉด ์  ํ‚จ์Šค์—์„œ ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

โœ” ์ฝ˜์†” ์•„์›ƒํ’‹์„ ํ™•์ธํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ ์–ด๋‘” ๋„์ปคํŒŒ์ผ์˜ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ” ec2 ์„œ๋ฒ„์—์„œ๋„ docker ps๋ฅผ ํ†ตํ•ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™์ค‘์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ“๊ธ€