Post

[Docker] ๋„์ปค CI(Docker CI)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Docker CI๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. Dockerfile๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ๋ฐ์„œ ๋‚˜์•„๊ฐ€, ์ฝ”๋“œ๋ฅผ ํ‘ธ์‹œํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œยทํ‘ธ์‹œ๋˜๋„๋ก GitHub Actions๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

Docker CI๋ž€? CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ. ์ฝ”๋“œ๋ฅผ Git์— ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œยทํ…Œ์ŠคํŠธํ•ด, ํ•ญ์ƒ ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•œ๋‹ค.


1. CI/CD & ์ž๋™ํ™” ํ๋ฆ„

CI/CD๋Š” ์ฝ”๋“œ ๋ณ€๊ฒฝ์„ ์ž์ฃผ ํ†ตํ•ฉํ•˜๊ณ , ์ž๋™ ๋นŒ๋“œยทํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์ณ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ฒ„๊ทธ๋ฅผ ์กฐ๊ธฐ์— ์žก๋Š”๋‹ค.

flowchart LR
    Dev(("๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž"))
    Git[("๐Ÿ“ GitHub")]
    GA["โš™๏ธ GitHub Actions"]
    Hub[("๐Ÿณ Docker Hub")]
    Dev -- "git push" --> Git
    Git -- "์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ" --> GA
    GA -- "build & push" --> Hub

๐Ÿ’ก GitHub Actions๋Š” ์ €์žฅ์†Œ ์ด๋ฒคํŠธ(pushยทPR ๋“ฑ)์— ๋ฐ˜์‘ํ•ด ์›Œํฌํ”Œ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ๋‹ค. YAML๋กœ ์ •์˜ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์•ก์…˜์„ ์กฐํ•ฉํ•ด ๋นŒ๋“œยทํ…Œ์ŠคํŠธยท๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•œ๋‹ค.


2. ๊ตฌ์„ฑ ๋‹จ๊ณ„

๋‹จ๊ณ„๋‚ด์šฉ
โ‘ ๋กœ์ปฌ์—์„œ Dockerfile ๋นŒ๋“œ โ†’ Docker Hub push(์ตœ์ดˆ)
โ‘กGitHub ์ €์žฅ์†Œ ์ƒ์„ฑ + ์ฝ”๋“œ ํ‘ธ์‹œ
โ‘ขSettings > Secrets์— DOCKER_HUB_USERNAMEยทDOCKER_HUB_PASSWORD ๋“ฑ๋ก
โ‘ฃ.github/workflows/docker-image.yml ์ž‘์„ฑ
โ‘ค์ฝ”๋“œ ๋ณ€๊ฒฝยทํ‘ธ์‹œ โ†’ Actions ์ž๋™ ์‹คํ–‰
โ‘ฅActions ํƒญ์—์„œ ๊ฒฐ๊ณผ ํ™•์ธ

โš ๏ธ Docker Hub ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๋ฏผ๊ฐ ์ •๋ณด๋Š” ์ ˆ๋Œ€ YAML์— ์ง์ ‘ ์“ฐ์ง€ ๋ง๊ณ  Secrets์— ์ €์žฅํ•œ๋‹ค. ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” ${{ secrets.์ด๋ฆ„ }}์œผ๋กœ ์ฐธ์กฐํ•ด, ์ฝ”๋“œ์— ์ž๊ฒฉ ์ฆ๋ช…์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.


3. ์›Œํฌํ”Œ๋กœ ํŒŒ์ผ (docker-image.yml)

master ๋ธŒ๋žœ์น˜ ํ‘ธ์‹œ๋‚˜ ํƒœ๊ทธ ์ƒ์„ฑ ์‹œ, ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ด Docker Hub์— ์˜ฌ๋ฆฐ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
name: Push Docker Image to Docker Hub
on:
  push:
    branches:
      - 'master'
    tags:
      - '**'
jobs:
  push:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2
    - name: Docker meta
      id: docker_meta
      uses: crazy-max/ghaction-docker-meta@v1
      with:
        images: leecloudo/nodejs-ci
        tag-semver: |
          {{version}}
          {{major}}.{{minor}}
    - name: Set up QEMU
      uses: docker/setup-qemu-action@v2
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_PASSWORD }}
    - name: Build and push Docker Image
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: ${{ steps.docker_meta.outputs.tags }}
        labels: ${{ steps.docker_meta.outputs.labels }}

์ฃผ์š” ์Šคํ… ํ•ด์„ค:

์Šคํ…์—ญํ• 
checkout์†Œ์Šค ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
docker_metaํƒœ๊ทธยท๋ผ๋ฒจ ์ž๋™ ์ƒ์„ฑ(์‹œ๋งจํ‹ฑ ๋ฒ„์ „)
QEMUยทBuildx๋ฉ€ํ‹ฐ ์•„ํ‚คํ…์ฒ˜ ๋นŒ๋“œ ์ง€์›
login-actionSecrets๋กœ Docker Hub ๋กœ๊ทธ์ธ
build-push-action์ด๋ฏธ์ง€ ๋นŒ๋“œ + push

๐Ÿ’ก QEMU + Buildx๋ฅผ ์“ฐ๋ฉด amd64๋ฟ ์•„๋‹ˆ๋ผ arm64(์˜ˆ: ์• ํ”Œ ์‹ค๋ฆฌ์ฝ˜ยท๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด) ์ด๋ฏธ์ง€๊นŒ์ง€ ํ•œ ๋ฒˆ์— ๋ฉ€ํ‹ฐ ์•„ํ‚คํ…์ฒ˜ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. docker_meta๋Š” ์ปค๋ฐ‹ยทํƒœ๊ทธ๋กœ๋ถ€ํ„ฐ ๋ฒ„์ „ ํƒœ๊ทธ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
Docker CI (GitHub Actions)
โ”œโ”€ ๊ฐœ๋…   ํ‘ธ์‹œ โ†’ ์ด๋ฏธ์ง€ ์ž๋™ ๋นŒ๋“œยทํ‘ธ์‹œ
โ”œโ”€ ํŠธ๋ฆฌ๊ฑฐ on.push (๋ธŒ๋žœ์น˜ยทํƒœ๊ทธ)
โ”œโ”€ ๋ณด์•ˆ   Secrets์— Docker Hub ์ž๊ฒฉ ์ฆ๋ช…
โ””โ”€ ๋นŒ๋“œ   Buildx(๋ฉ€ํ‹ฐ ์•„ํ‚คํ…์ฒ˜) + build-push-action
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Docker CI์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ž๋™ํ™”
GitHub Actions์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ
Secrets๋ฏผ๊ฐ ์ •๋ณด ์•ˆ์ „ ์ €์žฅ

Docker CI์˜ ํ•ต์‹ฌ์€ โ€œํ‘ธ์‹œํ•˜๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€๋Š”โ€ ํ๋ฆ„์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. GitHub Actions์™€ Secrets๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ์ˆ˜๋™ ๋นŒ๋“œยทํ‘ธ์‹œ ์—†์ด ํ•ญ์ƒ ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.