ale
의 Dockerfile 템플릿을 활용해 Dockerfile을 간편하게 배포할 수 있습니다.
ale
의 템플릿 / 프리셋은 효율적인 리소스 관리를 위한 최소한의 라이브러리만 사용합니다.
Windows, Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우,
예제 코드를 참고해 Dockerfile을 작성해서 배포하세요.
저장소와 템플릿 선택
대시보드의 또는 ⌘ + K
로 생성되는 배포창에서 Dockerfile 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하거나 Git URL 탭에서 Git 저장소 URL을 입력하세요.
배포 설정과 배포
기본 설정
-
Environment variables(ENV) : 컨테이너를 실행할 때 참조되는 환경변수
-
Build arguments(ARG) : 이미지를 빌드할 때 참조되는 인자
-
Port : 컨테이너가 실행되는 대상포트로,
docker run
명령어의 -p, --publish
옵션에 적용되는 인자
-
Health Check : 컨테이너 상태 검증 엔드포인트
-
Start commands : 컨테이너 시작 명령어
더 많은 옵션
-
Dockerfile text : Dockerfile의 전체 내용 입력
-
Build Labels(LABEL) : Dockerfile로 컨테이너 이미지 빌드 시 버전, 라이센스 등 추가 정보 주입
-
uid : 컨테이너에서 프로세스를 실행하는 사용자의 고유한 식별자(기본값 1000)
-
gid : 컨테이너에서 프로세스가 속한 그룹의 고유한 식별자(기본값 1000)
-
Update strategy
- Rolling Update : 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
- Recreate : 모든 서비스 종료후 새로운 버전의 서비스 생성 및 구동, 다운타임 발생
-
Shell : 컨테이너가 실행된 후 실행할 쉘(sh, bash, zsh 등)
성능(리소스) 설정과 배포
-
리소스 유형 : 온디맨드와 스팟 리소스 중 선택
-
CPU : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, ‘최소 vCPU’ 선택 시 0.1 vCPU 사용
-
메모리 : 서비스가 사용할 메모리 리소스의 최대값을 설정
-
동시실행(레플리카) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
-
배포 :
배포하기
클릭
로그와 터미널
서비스 카드 또는 상세페이지의 아이콘을 클릭하면, 배포/실행로그 조회 또는 터미널에 접속할 수 있습니다.
메트릭
서비스 상세페이지의 메트릭 탭에서, 서비스의 메트릭을 조회할 수 있습니다.
재배포(업데이트)
코드 수정, 리소스 변경 등 업데이트할 내역이 있는 경우, 서비스 상세페이지 설정탭 하단부의 배포하기
를 클릭하면 업데이트를 반영한 새로운 배포가 진행됩니다.
롤백(복원)
서비스 상세페이지의 배포내역탭에서 이전 버전의 서비스 상태로 복원할 수 있습니다.
복원할 버전을 혼동하지 않기 위해, 커밋 메세지를 확인하세요.
언어별 참고 예제 코드
Github 저장소로 이동# 의존성 설치
FROM node:16-buster
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
ENV NODE_ENV production
COPY . .
# node 이미지에 이미 "node"라는 사용자가 uid/gid 1000번으로 생성되어 있음
USER node
EXPOSE 3000
CMD ["npm", "start"]
Github 저장소로 이동# 프로젝트 빌드
FROM node:16-buster AS builder
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm run build
# Production 런타임 - nginx
FROM nginxinc/nginx-unprivileged:1.23 AS runner
WORKDIR /usr/share/nginx/html
COPY --from=builder /app/build .
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
Github 저장소로 이동FROM python:3.9-slim-buster
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED 1
ARG UID=1000
ARG GID=1000
RUN groupadd -g "${GID}" python \
&& useradd --create-home --no-log-init -u "${UID}" -g "${GID}" python
WORKDIR /home/python
COPY --chown=python:python requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
# USER 변경은 반드시 pip 패키지 설치 스크립트 이후에 작성되어야 함
USER python:python
ENV PATH="/home/${USER}/.local/bin:${PATH}"
COPY --chown=python:python . .
ARG FLASK_ENV
ENV FLASK_ENV=${FLASK_ENV}
EXPOSE 5000
# WSGI, 포트 번호, 모듈명 등은 각 소스 코드에 알맞게 수정하여 배포 진행
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
Github 저장소로 이동# JDK 이미지를 통한 executable jar 빌드
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
# COPY build.gradle.kts settings.gradle.kts ./ Kotlin인 경우 .kts 확장자 적용
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew bootJar --no-daemon
# jar 실행을 위한 JRE 이미지 적용
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar
USER worker:worker
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "main.jar"]
Github 저장소로 이동# JDK 이미지를 통한 executable jar 빌드
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
# COPY build.gradle.kts settings.gradle.kts ./ Kotlin인 경우 .kts 확장자 적용
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew bootJar :api:bootJar --no-daemon
# RUN ./gradlew bootJar :<main 지정 모듈명>:bootJar --no-daemon
# jar 실행을 위한 JRE 이미지 적용
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/api/build/libs/*.jar ./main.jar
# COPY --from=build --chown=worker:worker /app/<main 지정 모듈명>/build/libs/*.jar ./main.jar
USER worker:worker
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "main.jar"]
Spring Boot CRUD App(Gradle)
Github 저장소로 이동# Build
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle.kts settings.gradle.kts ./
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew build --no-daemon -x test
# Runtime
FROM eclipse-temurin:17-jre-alpine AS runtime
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar
USER worker:worker
ENV PROFILE=${PROFILE}
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]
Spring Boot CRUD App(Maven)
Github 저장소로 이동# Build
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
RUN ./mvnw dependency:go-offline -B
COPY . .
RUN chmod +x ./mvnw
RUN ./mvnw package -DskipTests
# Runtime
FROM eclipse-temurin:17-jre-alpine as runtime
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/target/*.jar ./main.jar
USER worker:worker
ENV PROFILE=${PROFILE}
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]