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

2024. 9. 27. 20:17·docker
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
반응형

'docker' 카테고리의 다른 글

[docker] Dockerfile과 쉘 스크립트를 이용하여 스프링부트에서 빌드한 war파일 인스턴스 자동화 실행시키기  (0) 2022.11.30
[docker] Dockerfile로 서버에 war 파일 배포하기(feat. jar)  (0) 2022.11.28
[docker] oracle 19c 설치  (0) 2022.04.06
[docker] gitlab(깃랩) 설치  (0) 2022.03.31
[docker] node 설치  (0) 2022.03.28
'docker' 카테고리의 다른 글
  • [docker] Dockerfile과 쉘 스크립트를 이용하여 스프링부트에서 빌드한 war파일 인스턴스 자동화 실행시키기
  • [docker] Dockerfile로 서버에 war 파일 배포하기(feat. jar)
  • [docker] oracle 19c 설치
  • [docker] gitlab(깃랩) 설치
밍글링글링
밍글링글링
mingling - 밍글링, 밍글밍글링. 코드와 어우러지다. IT/ 프로그래밍/소스
    반응형
    250x250
  • 밍글링글링
    mingling
    밍글링글링
  • 전체
    오늘
    어제
    • 밍글링글링 (407) N
      • Flutter (2)
      • 일상생활 (8)
        • 리뷰 (1)
        • 생활정보 (4)
        • 맛집 (0)
        • 여행 (0)
        • 모든정보 (3)
      • JAVA (126)
        • 개념 (6)
        • 예제 (115)
        • Exception (2)
      • C (1)
        • C (1)
        • C++ (0)
        • C# (0)
      • JS (29)
        • JavaScript (18)
        • JQuery (5)
        • AJax (0)
        • NODE.JS (6)
        • Angular.JS 2.0 (0)
      • WEB (87)
        • HTML (6)
        • CSS (61)
        • JSP (20)
        • JSTL (0)
      • FrameWork (8)
        • Spring (8)
        • BootStrap (0)
        • MyBATIS (0)
        • JUnit (0)
      • 외부 라이브러리 (5)
      • 공유 소스 관리 (5)
        • Git (5)
        • SVN (0)
      • 빅데이터 프로그래밍 (37)
        • Python (37)
        • R Programming (0)
      • DB (7)
        • ORACLE (0)
        • MySql (6)
      • Development Tools (7)
        • StarUML (0)
        • eXERD (0)
        • Eclipse (4)
      • SKILL (6)
        • Migration (0)
        • Security (6)
      • MicroSoft (0)
        • Excel (0)
        • Word (0)
      • Android (0)
      • Server (21)
        • Ubuntu (5)
        • Linux (15)
      • IOS (0)
      • XML (0)
      • 미디어 (0)
      • 공지사항 (3)
      • NETWORK (1)
      • 게임 (4)
        • 피파 (1)
        • 리니지M (0)
        • 배틀그라운드 (1)
        • 듀랑고 (2)
      • 세상 이슈 (6)
      • 일렉트론 (0)
      • 대회 소식 (4)
      • 업무 (2)
      • Express, Vue (6)
      • docker (11)
      • svelte (3)
      • 블록체인 (1)
      • IT (10) N
      • Rust (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jsp include
    css perspective
    리눅스 설치
    자바 생성자
    자바 객체 지향
    Node
    jsp parameter
    css table
    docker
    lang rust
    servlet class
    클론코딩
    rust linux
    vue 설치
    svelte
    css list
    gitlab 설치
    ubuntu
    nginx ssl 적용
    Rust lang
    AI 코딩 에이전트
    css transition
    오류
    자바 for문
    css float
    spring java
    proxy pass
    러스트
    SSL 인증서
    java casting
    vue cli
    nginx
    VS Code 팁
    자바 exception
    에디터 팁
    nginx ssl 설정
    Extension Bisect
    브라우저 자동화
    API 설계
    Java Array
    ssl 인증서 발급
    프런트엔드
    css tb
    React Compiler
    티스토리 자동화
    css block
    vscode
    mysql db
    자바 클래스
    자바 배열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
밍글링글링
Dockerfile과 Docker Compose를 이용한 애플리케이션 배포
상단으로

티스토리툴바