docker

Dockerfile과 Docker Compose를 이용한 애플리케이션 배포

밍글링글링 2024. 9. 27.
728x90

마크다운으로 블로그 2번쨰 포스팅... 너무 편.. 편하다. 이걸 이제 알다니...

마크다운으로 포스팅한 2번째 글 시작합니다.

Dockerfile과 Docker Compose를 이용한 애플리케이션 배포

소개

이 글에서는 Dockerfile과 docker-compose.yml을 사용하여 애플리케이션을 배포하는 방법에 대해 설명합니다.. 이 방법을 통해 복잡한 멀티 컨테이너 애플리케이션을 쉽게 관리하고 배포할 수 있다.

프로젝트 구조

.
├── frontend  (ui)
│   ├── Dockerfile
│   └── docker-compose.yml
├── backend   (api)
│   ├── Dockerfile
│   └── docker-compose.yml
└── compose-deploy.yml

backend (api)

Dockerfile

FROM gradle:7.4-jdk11 AS build

WORKDIR /app
COPY . .
RUN gradle build

# 실행 스테이지
FROM openjdk:11-jre-slim

ARG BUILD_JAR
ARG BOOT_JAR

COPY --from=build ${BUILD_JAR} ${BOOT_JAR}
EXPOSE 7201
ENTRYPOINT exec java $JAVA_OPTS -jar app.jar

위 내용은 설명하면, jdk11 버전을 통해 gradle 배포를 하는데, 멀티 스테이지 형태로 구성하였다.

docker-compose.yml

우선, spring boot 로 되어있는, API 서버부터 도커로 올렸다.

version: '3.8'

services:
  MINGYUN_API:
    command: >
      sh -c "
        echo 'mingyun-backend docker-compose build'
      "
    image: mingyun-api:1.0
    container_name: mingyun-api
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_JAR: /app/build/libs/mingyun.0.1-SNAPSHOT.jar
        BOOT_JAR: app.jar
    ports:
      - "7201:7201"
    environment:
      - TZ=Asia/Seoul
      - JAVA_OPTS=-Dspring.profiles.active=proc -Dfile.encoding=UTF-8 -DLOG_HOME=/usr/local/mingyun/web/logs
    volumes:
      - /var/www/mingyun:/var/www/mingyun
      - /data/nas/mingyun:/data/nas/mingyun
    restart: unless-stopped

frontend (ui)

필자는 이 블로그에 포스팅하는 프로젝트는 보여지지는 않겠지만, 특이하게... 스벨트킷으로 FE를 구현했었다.

Dockerfile

# 베이스 이미지 선택
FROM node:18-alpine

ARG BUILD_OPTION

WORKDIR /app
COPY . ./
RUN npm install
RUN npm run ${BUILD_OPTION}
EXPOSE 3000
ENTRYPOINT exec node $EXPORT_PATH

대략, node18 버전 으로 3000포트로 배포하겠다는 내용이다

docker-compose.yml

version: '3.8'

services:
  MINGYUN_UI:
    command: >
      sh -c "
        echo 'mingyun-ui docker-compose build'
      "
    image: mingyun-ui:1.0
    container_name: mingyun-ui
    build:
      context: .
      dockerfile: Dockerfile
      args:
        BUILD_OPTION: build:prod
    ports:
      - "13012:3000"
    environment:
      - TZ=Asia/Seoul
      - NODE_ENV=production
      - JAVA_OPTS=-Dspring.profiles.active=proc -Dfile.encoding=UTF-8 -DLOG_HOME=/usr/local/mingyun/web/logs
      - EXPORT_PATH=./build/index.js
    volumes:
      - /var/www/mingyun:/var/www/mingyun
      - /data/nas/mingyun:/data/nas/mingyun
    restart: unless-stopped

프로젝트 구조를 다시 보면, 아래와 같이 존재한다.

.
├── frontend  (ui)
│   ├── Dockerfile
│   └── docker-compose.yml
├── backend   (api)
│   ├── Dockerfile
│   └── docker-compose.yml
└── compose-deploy.yml

멀티모듈 형식으로 프로젝트를 구성했어가지고, 2개의 docker-compose 파일을 컨트롤 하기위해, compose.deploy.yml 을 작성했는데,

다음과 같다.

compose-deploy.yml

services:
  MINGYUN_API_COMPOSE:
    extends:
      file: backend/docker-compose.yml
      service: MINGYUN_API
    networks:
      - mingyun_network

  MINGYUN_UI_COMPOSE:
    extends:
      file: frontend/docker-compose.yml
      service: MINGYUN_UI
    networks:
      - mingyun_network

networks:
  mingyun_network:
    driver: bridge

docker 명령어

# 이미지 관련
docker images: 로컬에 저장된 이미지 목록 조회
docker pull <이미지명>: Docker Hub에서 이미지 다운로드
docker rmi <이미지명>: 이미지 삭제

# 컨테이너 관련
docker run <옵션> <이미지명>: 컨테이너 생성 및 실행
docker ps: 실행 중인 컨테이너 목록 조회
docker ps -a: 모든 컨테이너 목록 조회
docker stop <컨테이너명>: 컨테이너 중지
docker start <컨테이너명>: 중지된 컨테이너 시작
docker rm <컨테이너명>: 컨테이너 삭제

# 기타
docker exec -it <컨테이너명> /bin/bash: 실행 중인 컨테이너에 접속
docker logs <컨테이너명>: 컨테이너 로그 확인

docker-compose 명령어

docker-compose up: 서비스 시작 (백그라운드 실행: -d 옵션 추가)
docker-compose down: 서비스 중지 및 컨테이너 삭제
docker-compose ps: 서비스의 상태 확인
docker-compose logs: 서비스의 로그 출력
docker-compose build: 서비스 빌드 (또는 재빌드)
docker-compose stop: 서비스 중지 (컨테이너 삭제하지 않음)
docker-compose start: 중지된 서비스 시작
docker-compose restart: 서비스 재시작
docker-compose exec <서비스명> <명령어>: 실행 중인 컨테이너에서 명령 실행

여기서 필자는 커널에서 배포하는 스크립트를 러스트 언어(Rust language) 로 작성하였다.

각자 원하는 방식으로 설계해서 만들면 되겠지만, 이 글은 보는 독자들을 위해, github url 을 공유하겠다.

GITHUB 주소

https://github.com/m1n67un/compose-deploy

 

GitHub - m1n67un/compose-deploy: compose-deploy

compose-deploy. Contribute to m1n67un/compose-deploy development by creating an account on GitHub.

github.com

 

 

이상.

728x90

댓글