Infra

[Infra] Docker, Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ MSA ํ”„๋กœ์ ํŠธ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ(1) - Docker ์„ค์น˜

giraffe_ 2023. 5. 28. 23:16

 ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋’ค, Docker์™€ Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๊ตฌ๊ธ€๋ง ํ•˜๋ฉด์„œ ๋…ํ•™์„ ํ–ˆ๊ณ , ๋ฌด์ˆ˜ํ•œ ์‚ฝ์งˆ๊ณผ ์ด์ „ ํ”„๋กœ์ ํŠธ๋“ค์˜ ๋ฌธ์„œ์™€ ์ฃผ๋ณ€ ๋™๊ธฐ๋“ค์˜ ๋„์›€์„ ๋ฐ›์€ ๋์— ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค! ๋ถ€์กฑํ•œ ๋ถ€๋ถ„๋„ ์žˆ์ง€๋งŒ(๋ฌด์ค‘๋‹จ ๋ฐฐํฌ X, docker-compse ์‚ฌ์šฉ X, ๋ณด์•ˆ ์‹ ๊ฒฝ ๋ชป์”€) ์Šค์Šค๋กœ Docker, Jenkins์˜ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•˜๊ณ , ๋ฐ”๋กœ ํŒ€ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์ข‹์•˜๋‹ค.

 

์‚ฝ์งˆํ•˜๋ฉด์„œ ๋ฐฐ์šด ๊ฒƒ์„ ์•ˆ ๊นŒ๋จน๊ณ ์ž, ๊ทธ๋ฆฌ๊ณ  ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด ๋˜๊ณ ์ž ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

 

 

 

3๊ฐœ์˜ ํฌ์ŠคํŒ…์— ๋‚˜๋ˆ ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์ง„ํ–‰๋  ๊ฒƒ์ด๋‹ค.

1. Docker ์„ค์น˜ํ•˜๊ธฐ + ์ˆ˜๋™ ๋ฐฐํฌ

2. ์ž๋™ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Jenkins ์„ค์น˜ํ•˜๊ธฐ

3. GitLab Webhook๊ณผ Jenkinsfile ํ™œ์šฉํ•˜์—ฌ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ

 

 

 

 

 

๐Ÿ’ป ํ™˜๊ฒฝ

  • OS : Window
  • Server : AWS EC2
  • Backend : Spring boot, Spring Cloud(Gateway, Eureka), Gradle, Java11
  • Deploy : Docker, Dockerhub, Jenkins
  • Git : Gitlab

 

 

 

 

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋„

์•„ํ‚คํ…์ฒ˜(์ˆ˜์ •๋จ)

  • ๋ฐฑ์—”๋“œ 6๊ฐœ(๊ทธ๋ฆผ์ƒ์—๋Š” 5๊ฐœ ๋งž์Œ), DB 2๊ฐœ, Jenkins(Docker in docker๋กœ ํ–ˆ๋‹ค) ์ด 9๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.
  • GitLab์—์„œ push ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 

CI/CD ๊ณผ์ •

 

 

  1. ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น ๋ธŒ๋žœ์น˜์— push ๋œ๋‹ค. (ํ‘ธ์‰ฌ ์ด๋ฒคํŠธ ๋ฐœ์ƒ)
  2. ํ”„๋กœ์ ํŠธ ๋‚ด์˜ Jenkinsfile์„ ์ฝ์–ด ์‹คํ–‰ํ•œ๋‹ค.
  3. Git์— ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ Cloneํ•ด, ๋นŒ๋“œ๋ฅผ ํ•œ๋‹ค.
  4. jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๊ณ , ๋„์ปค ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•œ๋‹ค.
  5. ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋„์ปค ํ—ˆ๋ธŒ์— ์—…๋กœ๋“œ ํ•œ๋‹ค.
  6. ์ง€๊ธˆ ๋„์ปค์—์„œ run ๋˜๊ณ  ์žˆ๋Š” ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์ค‘์ง€ํ•˜๊ณ , ์‚ญ์ œ์‹œํ‚จ๋‹ค.
  7. ๊ทธ๋ฆฌ๊ณ  ๋„์ปค ํ—ˆ๋ธŒ์— ์žˆ๋˜ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„ run ํ•œ๋‹ค.
  8. Spring ์„œ๋ฒ„๊ฐ€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ AWS์— ๋ฐฐํฌ๋œ๋‹ค.

 

 

 

 

 

์ด ํฌ์ŠคํŒ…์—์„œ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ์€ 4~8๊นŒ์ง€์˜ ๊ณผ์ •์œผ๋กœ Docker ์„ค์น˜๋ฅผ ํ•˜๊ณ , ์šฐ์„  ๋„์ปค๋กœ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ Jenkins๋ฅผ ์„ค์น˜ํ•ด์„œ 1~3 ๊ณผ์ •์„ ์‹คํ–‰ํ•˜๊ณ , 4~8์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ฃฌ๋‹ค.

 

 

 

 

 


๐Ÿณ Docker ์„ค์น˜

Ubuntu ์„œ๋ฒ„์— Docker๋ฅผ ์„ค์น˜ํ•œ๋‹ค. ์„ค์น˜ ๊ณผ์ •์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ–ˆ๋‹ค.

(https://docs.docker.com/engine/install/ubuntu/)

 

 

 

  • apt ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ ๋ฐ ์„ค์น˜
sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg

 

  • Docker GPG key ์ถ”๊ฐ€
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

 

  • ์ €์žฅ์†Œ ์„ค์ •
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

  • Docker Engine ์„ค์น˜
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

 

 

 

 

 

๐Ÿณ Dockerfile ์ž‘์„ฑ

Spring Cloud(Gateway, Eureka) Service์™€ ๊ฐ๊ฐ์˜ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ํ™˜๊ฒฝ์ธ Gradle, Java11์—์„œ ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‚˜์˜ Dockerfile๋ฅผ ๋งŒ๋“ค์–ด์คฌ๋‹ค.

 

 

 

FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
ARG JAR_FILE=build/libs/*jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

Java11 jdk๋กœ ๋นŒ๋“œ๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค. Spring boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋ฉด `build/libs` ์•„๋ž˜ jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ƒ์„ฑ๋œ jar ํŒŒ์ผ์„ `app.jar` ํŒŒ์ผ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณต์‚ฌํ•ด Docker์˜ image๋กœ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

 

  • `FROM` : ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„(Docker Hub์—์„œ ๊ฒ€์ƒ‰ํ•ด์„œ ์ฐพ์œผ๋ฉด ๋จ)
  • `VOLUME` : ๊ฐ€์ƒ์˜ ๋””๋ ‰ํ† ๋ฆฌ
  • `COPY` : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ → ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋กœ ๋ณต์‚ฌ
  • `ENTRYPOINT` : ์ด๋ฏธ์ง€๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ˆ˜ํ–‰ํ•  ์ปค๋งจ๋“œ

 

 

 

 

 

Dockerfile์ด ์œ„์น˜ํ•˜๋Š” ๊ฒฝ๋กœ๋Š” Spring boot ํ”„๋กœ์ ํŠธ ๋ฐ”๋กœ ์•„๋ž˜์ด๋‹ค.

 

 

 

 

 

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋“ค์„ ํ†ตํ•ด ์›๊ฒฉ ์„œ๋ฒ„์— ์ˆ˜๋™ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

 

 

 

์ˆ˜๋™ ๋ฐฐํฌ ๊ณผ์ •

(ํ”„๋กœ์ ํŠธ์˜ ํ„ฐ๋ฏธ๋„์—์„œ)

  • ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
docker build -t [Docker Hub ๊ณ„์ •]/[์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

  • Docker Hub์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ
docker push [Docker Hub ๊ณ„์ •]/[์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

 

 

(Ubuntu์—์„œ)

  • Docker ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ
docker pull [Docker Hub ๊ณ„์ •]/[์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

  • Docker ์ด๋ฏธ์ง€ ์‹คํ–‰
docker run --name [์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„] -d -p [ํฌํŠธ๋ฒˆํ˜ธ]:[ํฌํŠธ๋ฒˆํ˜ธ] [Docker hub ๊ณ„์ •]/[์ด๋ฏธ์ง€ ์ด๋ฆ„]

 

 

 

 

 

์ž๋™ ๋ฐฐํฌ์˜ ํ•„์š”์„ฑ

 ๊ฐœ๋ณ„ ํ”„๋กœ์ ํŠธ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด์˜ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๊ณ , ์ง€์šฐ๊ณ , ์ƒˆ๋กœ Docker ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ณ , ์—…๋กœ๋“œํ•˜๊ณ , ์‹คํ–‰์‹œ์ผœ ๋ฐฐํฌํ•˜๋Š” ์ผ์€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ค„ ํ•„์š”์„ฑ์ด ๋А๊ปด์ง„๋‹ค.

 

 ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ ๋กœ์ปฌ์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ณ์„œ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ Git ์ €์žฅ์†Œ๋กœ push ํ•  ๋•Œ๋งˆ๋‹ค ์ตœ์ข…๋ณธ์ธ ๊ทธ ๋ฒ„์ „์œผ๋กœ ๋ฐฐํฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค.

 

 ์ง€์†์  ํ†ตํ•ฉ๊ณผ ์ž๋™ ๋ฐฐํฌ๋ฅผ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Jenkins๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ Jenkins๋ฅผ ์„ค์น˜ํ•˜๊ณ , Webhook์„ ํ†ตํ•œ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.