🔹 Docker(도커)는 리눅스 컨테이너 기술을 기반으로,
애플리케이션을 독립적이고 격리된 환경에서 실행할 수 있게 지원하는 플랫폼
🔹기존의 가상 머신(VM)과 달리 운영 체제(OS) 전체를 가상화하지 않고,
프로세스 단위로 격리 경량화된 컨테이너를 통해 빠른 실행 및 배포 가능
런타임: 애플리케이션 실행을 위해 가상화된 OS 일부
Docker 아키텍쳐
이미지와 컨테이너
- 이미지: 실행 가능한 앱의 정적인 설계도 (변하지 않음)
- 컨테이너: 이미지를 메모리에 띄운 실행 인스턴스 (변할 수 있음)
비유) 이미지 = 레시피, 컨테이너 = 그걸로 만든 요리
- Dockerfile: 이미지 생성을 위한 명세서
계층(Layer) 기반 빌드 → 캐싱, 빠른 재사용
흐름
🔹 Dockerfile → docker build → docker 이미지 생성
🔹 docker 이미지 → docker run → 컨테이너 생성 및 실행
DockerFile 작성해보기
1) FROM (필수)
기본이 될 이미지를 지정하는 명령 (밑에 까는)
ex)
FROM eclipse-temurin:21-jdk
2) ENTRYPOINT 또는 CMD (컨테이너 시작 명령)
컨테이너가 시작할 때 자동으로 실행할 명령어를 정의함.
(주로 마지막에)
ENTRYPOINT: 컨테이너의 기본 실행 명령을 설정 (항상 실행)
CMD: 기본 명령어나 파라미터를 설정할 때 사용
ENTRYPOINT ["java", "-jar", "build/libs/projectname-0.0.1-SNAPSHOT.jar"]
Repository / Registry ( like maven repo / github )
https://hub.docker.com/_/eclipse-temurin
eclipse-temurin - Official Image | Docker Hub
Quick reference Supported tags and respective Dockerfile links Note: the description for this image is longer than the Hub length limit of 25000, so the "Supported tags" list has been trimmed to compensate. See also docker/hub-feedback#238 and docker/ro
hub.docker.com
DOCKERFILE 작성
#TODO 컨테이너 런타임을 가져온다 (dockerhub에서)
# FROM eclipse-temurin:21-jdk 무거운 jdk 보단 가벼운 이미지 사용하기
FROM eclipse-temurin:21-jre-alpine AS Builder
WORKDIR /app
COPY . .
#TODO Gradle 빌드 후 jar 생성
RUN ./gradlew clean bootJar --no-daemon -x test
#TODO 포트 EXPOSE
EXPOSE 8082
#TODO 빌드된 JAR 실행
RUN apk add --no-cache vim
ENTRYPOINT ["java", "-jar", "build/libs/likelion-backend-0.0.1-SNAPSHOT.jar"]
DOCKERFILE을 작성한 위치에서
docker build .
를 통해서 docekr 이미지 생성
실제로 쓸땐 빌드용과 실행용을 분리하는게 좋다
# 빌드 단계 기능 많은 JDK로 jar에 담고
FROM gradle:jdk21-alpine AS builder
WORKDIR /app
COPY . .
RUN gradle clean build -x test
# 실행 단계 (가벼운 JRE 이미지 사용)
FROM eclipse-temurin:21-jre-alpine
# vi 설치 (Alpine 기반이므로 apk 사용)
RUN apk add --no-cache vim
COPY --from=builder /app/build/libs/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
요런 식으로
docker 이미지로 실행하게 되면 안쓰게 되는 의존성도 제외하는게 좋다
예를들어
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
이런 겹치는 의존성들은 제외하는게 image 파일크기를 줄이는데 도움이 됨
Docker 이미지를 만들었으면 이제 실행을 해야하는데
docker image ls 로 만든 이미지 정보 조회하고
Docker 실행 관련 명령어
🔹 Container 상태 체크
docker ps
docker ps -a
🔹 Container 생성 / 실행 / 삭제
docker run / docker start
docker stop / docker rm
🔹 docker hub (github 같은 외부 저장소)
docker pull / docker push
🔹 Container 실행
docker run --rm(컨테이너 종료시 컨테이너도 삭제) -d(백그라운드)
🔹 Container 꺼진 후 container/image 삭제
docker rm $(docker ps -a -f status=exited -q)
docker rmi $(docker images -f "dangling=true" -q)
🔹 이전 docker container 종료 /. 지우기
docker run --rm(컨테이너 종료시 컨테이너도 삭제) -d(백그라운드)
docker ps # docker ps -a
docker stop -f {}
docker rm $(docker ps -a -f status=exited -q)
docker rmi $(docker images -f "dangling=true" -q)
실행 시킨 컨테이너 정보 조회
docker ps | grep "컨테이너 이름"
실행중인 Docker Container 접속하기
docker exec -it 21abae6dce05 /bin/bash
docker exec -it 21abae6dce05 /bin/ash
저는 가벼운 리눅스배포판인 eclipse-temurin:21-jdk-alpine로 실행해서 /bin/ash 폴더를 경로로 사용함
로컬 호스트 말고 간단한 live server로 테스트할때 사용하면 좋을듯
'Web Backend' 카테고리의 다른 글
Kubernetess (0) | 2025.04.07 |
---|---|
Docker Swarm (0) | 2025.04.07 |
Docker-compose (0) | 2025.04.07 |
Docker 네트워크 (3) | 2025.04.07 |
Kubernetess 시작하기 (0) | 2025.04.07 |