[Docker] Dockerfile 프로젝트 배포하기
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 |
댓글
이 글 공유하기
다른 글
-
[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