이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[Docker] Dockerfile 프로젝트 배포하기

  • 2023.12.06 00:01
  • DevOps/Docker && Kubernetes

 

 

 

FROM node 

WORKDIR /app

COPY . /app

RUN npm install

EXPOSE 80

CMD ["node" "server.js"]

 

 

FROM :이미지 빌드를 위한 기반 이미지를 설정하고, 도커는 node라는 이름으로 이미지를 찾는다.

 

WORKDIR : 컨테이너 내부의 작업 디렉토리를 생성한다. 모든 작업은 이 경로에서 실행된다.

 

COPY : (Dockerfile이 위치한 호스트 파일시스템)  (컨테이너 내부)  / 실행에 필요한 소스코드나 묶음 파일을 복사할 때 사용한다. 

도커는 실행 환경을 구축하는 역할도 하지만, 실제로 애플리케이션을 실행할 수 있어야 한다.

마운트를 사용해도 괜찮다.

 

RUN : 이미지 빌드 중 명령어를 실행해 WORKDIR 내부에서 필요한 종속성을 설치한다.

 

EXPOSE : 도커 컨테이너는 고립된 상태로 실행되기에 컨테이너가 특정 포트를 LISTEN 함을 명시해 줘야 한다.

컨테이너의 포트 사용에 대한 정보를 제공하는 메타데이터이고, 문서화를 위해 사용된다.

실제 포트 매핑은 docker run -p 8000:80에서 이루어지니 주의하자. (호스트의 8000 포트를 컨테이너의 80포트와 매핑)

 

CMD : 애플리케이션을 실행할 때 사용하고, 컨테이너가 시작할 때 한 번만 실행된다. 

 

 

Dockerfile을 템플릿으로 이미지를 작성하고, 이미지를 통해 컨테이너를 실행시킨다.

이미지는 read-only라고 생각하면 된다. 수정사항이 발생하면 Dockerfile을 통해 이미지를 다시 만들어야 한다.

 

환경 변수를 설정하는 방법으로는 크게 세 가지가 있다.

 

 

1.

FROM node:14

WORKDIR /app

ENV NODE_ENV production
ENV PORT 3000

COPY . /app

RUN npm install

EXPOSE $PORT
CMD ["node", "app.js"]

 

 

Dockerfile에 환경변수를 설정해두면 이미지 빌드 시점부터 컨테이너 실행 시점까지 변수가 유지된다.

 

 

 

2. 

# .env
NODE_ENV=production
PORT=3000

# script
docker run --env-file .env -p 80:3000 imageName

 

.env 파일에 환경변수를 설정하고 컨테이너를 실행시킬 때 설정한 변수를 사용한다.

 

 

3.

docker run -e NODE_ENV=production -e PORT=3000 -p 80:3000 myimage

 

직접 스크립트에서 설정한다. 

 

 

 

 

두 가지 프로젝트를 배포해보자.

 

 

1.

Spring Boot + Thymeleaf + MySQL

 

스프링부트에는 웹 서버가 내장되어있고, 정적 파일을 포함한 모든 리소스를 웹 서버를 사용해서 제공하기 때문에 프로젝트를 jar 파일 형태로 패키징하면 별다른 설정 없이 바로 배포할 수 있다.

 

따라서 도커를 통해 프로젝트를 배포할 때 Java 런타임 환경만 추가해 주면 된다.

 

jar파일을 추출하고 jar 파일이 위치한 디렉토리에서 해당 Dockerfile을 작성하자.

 

 

FROM openjdk:11-jre-slim
WORKDIR /root
COPY temp.jar /usr/local/lib/temp.jar
ENTRYPOINT ["java", "-jar", "/usr/local/lib/temp.jar"]

 

 

이후 다음 명령어를 실행하자.

 

docker build -t temp . 

docker run --name temp_container -p 8080:8080 temp

 

포트번호는 적절하게 선택해주고.. 컨테이너 내부에서 jar파일이 위치하는 경로는 크게 중요하지 않다.

 

 

위와 같이 실행 시 localhost:8080 URL로 접속하면 완성한 프로젝트를 확인할 수 있다.

 

 

 

2. 

Frontend : Vue

Backend : SpringBoot / MySQL 

 

백엔드와 프론트엔드가 구분돼서 개발된 애플리케이션은 도커로 띄울 때 각각 컨테이너에 올리고 서로 api 통신하는 방식으로 설계한다.

 

백엔드는 스프링부트 기반이니 jar 추출해서 같은 방법으로 올리고..

프론트엔드는 따로 빌드해야 한다.

 

 

백엔드 Dockerfile

FROM openjdk:11-jre-slim
WORKDIR /root
COPY temp.jar .
CMD java -jar temp.jar

 

1번 예시와 같은 방법으로 진행하면 된다.

 

프론트엔드는 vue와 quasar 기반이니 따로 빌드한 후 Dockerfile을 실행하자.

 

npm install

quasar build 

 

두 가지 명령어로 빌드를 진행한다. (vue 버전과 환경 설정 파일도 적절히 수정해야 한다)

 

프론트엔드 Dockerfile

FROM nginx:stable-alpine

COPY dist/spa/ /usr/share/nginx/html/

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

 

웹 서버를 통해 클라이언트에게 컨텐츠를 제공하기 때문에 nginx 웹 서버를 사용한다.

 

docker build -t temp .

docker container run -d -p 8084:80 temp

 

(포트 번호는 적절히 설정하자)

 

이후 localhost:8040 으로 접속 시 완성한 애플리케이션을 로컬 환경에서 돌릴 수 있다. 

 

Multi-Stage Build를 사용하면 소스코드 빌드와 nginx 서버에 배포하는 과정을 한 번에 수행할 수 있다. 

 

FROM node:14-alpine as build

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

RUN npm run build

FROM nginx:stable-alpine

COPY --from=build /app/build /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

 

 

기본적으로 여러 빌드 스테이지를 순차적으로 실행한다.

각 스테이지는 FROM 으로 독립적인 기반 이미지를 가질 수 있고, 이전 스테이지에서 생성된 리소스를 다음 스테이지로 전달할 수 있다.

 

as 문법으로 스테이지에 별칭을 부여하고 스테이지의 결과물을 참조할 때 사용한다.

 

첫 번째 스테이지 : 애플리케이션의 의존성을 설치하고 빌드한다.

두 번째 스테이지 : 첫 번째 스테이지에서 생성된 빌드 리소스를 복사한다.

 

최종 이미지는 마지막 FROM 문에서 시작되는 이미지에 기반하고, 런타임에 필요한 최소한의 파일만 포함해 크기가 작다.

 

 

 

 

 

반응형
저작자표시 (새창열림)

'DevOps > Docker && Kubernetes' 카테고리의 다른 글

[k8s] 쿠버네티스 도입  (0) 2023.12.17
[Docker] 네트워킹과 Docker Compose  (1) 2023.12.10
[Docker] Docker Compose  (0) 2023.03.24
[Docker] 도커 파일 시스템과 볼륨  (0) 2023.03.09
[Docker] 도커 활용하기  (0) 2023.03.08

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [k8s] 쿠버네티스 도입

    [k8s] 쿠버네티스 도입

    2023.12.17
  • [Docker] 네트워킹과 Docker Compose

    [Docker] 네트워킹과 Docker Compose

    2023.12.10
  • [Docker] Docker Compose

    [Docker] Docker Compose

    2023.03.24
  • [Docker] 도커 파일 시스템과 볼륨

    [Docker] 도커 파일 시스템과 볼륨

    2023.03.09
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (605) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • JavaScript (15)
      • C (25)
      • C++ (12)
      • Python (1)
      • PHP (2)
    • Computer Science (68) N
      • Operating System (18)
      • Computer Network (16) N
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • Solutions (13)
    • Life Logs (0)
    • 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바