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
이상.
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 |
댓글