[TIL]Docker

기 원·2025년 5월 14일

1. CI/CD

1. CI/CD란?

1. 정의

  • CI: Continuous Integration (지속적인 통합)
  • CD: Continuous Delivery / Deployment (지속적인 제공/배포)

2. 특징

  • 자동화된 빌드, 테스트, 배포
  • 안정적이고 빠른 코드 제공 가능
  • 스크럼 기반의 애자일 개발과 잘 어울림

3. 전통적인 배포 vs 현대적 배포

구분전통적 방식현대적 방식
배포 방식수동, 롤백 어려움자동화된 테스트 + 배포
서버 구성개별 설정 필요Docker 등으로 표준화
속도느림빠름

2. Docker 기초

1. 왜 Docker인가?

  • 환경 차이 없이 동일한 컨테이너 환경에서 실행 가능
  • 독립적이고 확장성 있는 배포 가능
  • CI/CD와의 궁합 좋음
  • 호스트 OS에 영향 없음

3. Docker 설치

Windows

  • WSL2 설치: wsl --install
  • Ubuntu 22.04 설치
  • Docker GPG 키 및 리포지토리 설정 후 설치
  • Docker Desktop 설정에서 WSL 연동

4. Container 실행 테스트

docker image pull nginx:1.25.3-alpine
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine
curl localhost:8001

5. Docker Image 관리

1. 개념

  • Stateless: 상태 비저장
  • Immutable: 변경 불가 이미지

2. 주요 명령어

docker pull nginx:latest
docker image inspect nginx:latest
docker image history nginx:latest
docker login
docker logout

6. Docker Container 관리

1. Image vs Container

  • Image: 레시피(붕어빵 틀)
  • Container: 실행된 인스턴스(붕어빵)

2. 주요 명령어

docker run -ti --name test ubuntu:22.04
docker start test
docker attach test
docker ps -a
docker stop test
docker rm test
docker logs test
docker inspect test

3. 포트, 로그, 리소스 확인

docker port test
docker stats test
docker logs -f test

7. Docker 파일 생성 및 실행 실습

mkdir nodejsapp && cd nodejsapp
# app.js 및 Dockerfile 생성
docker buildx build -t node-test:1.0 .
docker run -itd -p 6060:6060 --name=node-test node-test:1.0
curl http://localhost:6060

8. 정리 및 정리 명령어

1. 리소스 정리

docker container prune         # 중지된 컨테이너 삭제
docker image prune             # Dangling 이미지 삭제
docker system prune            # 전체 정리

2. Github & CI/CD

1. Github Actions란?

정의

  • Github에 내장된 CI/CD 도구
  • .github/workflows 디렉토리에 YAML 파일 작성
  • 무료 제공: 500MB 저장공간 + 월 2000분

2. Github Actions로 CI 구성

예시 워크플로우

name: CI
on:
  push:
    branches: [develop, feature/*]
  pull_request:
    branches: [develop]

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '17'
      - name: run unittest
        run: ./gradlew clean test

3. Github Actions로 CD 구성

예시 워크플로우

name: CD
on:
  push:
    branches: [main]

jobs:
  cd:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: java setup
        uses: actions/setup-java@v3
        with:
          distribution: 'adopt'
          java-version: '17'
      - name: run unittest
        run: ./gradlew clean test
      - name: deploy to heroku
        uses: akhileshns/heroku-deploy@v3.12.12
        with:
          heroku_api_key: ${{ secrets.HEROKU_API_KEY }}
          heroku_app_name: "sampleapp-github-actions"
          heroku_email: "nbcdocker@proton.me"

4. Github Actions 주요 구성 요소

구성 요소설명
Workflow전체 자동화된 프로세스
Event트리거(예: push, PR)
Runner작업을 실행하는 가상머신
Job여러 Step 묶음
Step개별 명령 또는 Action
Action재사용 가능한 기능 단위

5. 예제 실행

간단한 데모 워크플로우

name: GitHub Actions Demo
on: [push]

jobs:
  Explore-GitHub-Actions:
    runs-on: ubuntu-latest
    steps:
      - run: echo "🎉 자동 트리거됨!"
      - run: echo "🐧 OS: ${{ runner.os }}"
      - name: Check out repository
        uses: actions/checkout@v4

6. Spring Boot + Github Actions (CI)

  • develop, feature 브랜치에 push 또는 PR 발생 시 gradle test 실행

✔ 예시: .github/workflows/run-test.yaml

name: Run Test
on:
  push:
    branches: [develop, feature/*]
  pull_request:
    branches: [develop]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v4
      - name: java setup
        uses: actions/setup-java@v2
        with:
          distribution: 'adopt'
          java-version: '17'
      - name: make executable gradlew
        run: chmod +x ./gradlew
      - name: run unittest
        run: ./gradlew clean test

7. Cloudtype 배포 자동화

1. 개념 흐름

  1. feature/** → PR 생성 → 자동 테스트
  2. PR 성공 시 → main 브랜치 merge
  3. main → 자동 배포 to cloudtype

2. PR 테스트용: test-pr.yml

name: test every pr
on:
  workflow_dispatch:
  pull_request:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: setup jdk
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          cache: gradle
      - name: Grant execute permission
        run: chmod +x ./gradlew
      - name: gradlew test
        run: ./gradlew test

3. Cloudtype 배포용: deploy-main.yml

name: Deploy to cloudtype
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Connect deploy key
        uses: cloudtype-github-actions/connect@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          ghtoken: ${{ secrets.GHP_TOKEN }}
      - name: Deploy
        uses: cloudtype-github-actions/deploy@v1
        with:
          token: ${{ secrets.CLOUDTYPE_TOKEN }}
          project: nbc.docker/cicd
          stage: main
          yaml: |
            name: cicd
            app: java@17
            options:
              ports: 8080
            context:
              git:
                url: git@github.com:${{ github.repository }}
                ref: ${{ github.ref }}
              preset: java-springboot

8. 환경 설정 가이드

1. Cloudtype

  • 가입: cloudtype.io
  • 카드 등록 후 무료 요금제 활성화 필요
  • API 키 발급 후 Github Secrets에 등록

2. Github Secrets 등록

Key설명
GHP_TOKENGithub Personal Token
CLOUDTYPE_TOKENCloudtype API Key

3. Docker

1. Dockerfile로 나만의 Docker Image 만들기

1. 개념

  • Dockerfile은 앱 실행을 위한 모든 환경 설정 레시피
  • 동일한 환경, 자동화된 이미지 생성, 재사용 가능

2. 예제

FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3. 명령어 정리

명령어설명
FROM베이스 이미지 지정
RUN명령 실행
COPY파일 복사
CMD / ENTRYPOINT컨테이너 시작 시 실행 명령
EXPOSE외부 노출 포트 설정
WORKDIR작업 디렉토리 설정
ENV환경변수 설정
USER사용자 변경

2. Docker Compose를 사용한 멀티 컨테이너 관리

1. Docker Compose란?

  • 여러 컨테이너를 하나의 YAML 파일로 정의
  • 의존성 관리, 포트 설정, 환경변수 관리 가능

2. 예제: docker-compose.yaml

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    depends_on:
      - api
  api:
    image: java:latest
    ports:
      - 8080:8080
    environment:
      - MYSQL_HOST=mysql
  mysql:
    image: mysql:latest
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=password

3. Docker Compose 명령어

명령어설명
docker-compose up -d백그라운드 실행
docker-compose down컨테이너 및 네트워크 삭제
docker-compose logs로그 출력
docker-compose exec실행 중인 컨테이너 명령 실행
docker-compose run일회성 컨테이너 실행

4. 모니터링과 로깅

1. docker stats

docker stats
  • CPU, 메모리 사용량, I/O 실시간 확인

2. htop 도구 설치 및 실행

docker exec -ti test-tools /bin/bash
apt update && apt install htop -y
htop

3. 디스크 확인

docker exec -ti test-tools /bin/bash
df -h
du -sh

5. 컨테이너 로깅

1. 로그 확인

docker logs [컨테이너명]
docker logs -f --tail 10 [컨테이너명]

2. 로그 파일 경로 확인

docker inspect [컨테이너명] --format "{{.LogPath}}"

3. 로그 로테이션 예제

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=5 \
  --name nginxtest \
  nginx:latest

4. docker-compose 로 설정

services:
  app:
    logging:
      driver: 'json-file'
      options:
        max-size: '10m'
        max-file: '10'
profile
노력하고 있다니까요?

1개의 댓글

comment-user-thumbnail
2025년 5월 15일

도커 도커....

답글 달기