
Docker
어플리케이션을 컨테이너라는 격리된 환경에서 실행되도록 하는 도구
핵심 개념
image
어플리케이션에 실행한 모든 요소를 담은 템플릿
코드, 라이브러리, 설정 등이 담긴다
Container
이미지를 실행한 인스턴스 → 실제로 돌아가는 환경
운영체제를 새로 띄우는 것이 아니라 OS 커널을 공유하여 실행됨
독립된 환경으로 작동하므로 로컬 환경마다 다를 수 있는 문제를 해결함
컨테이너를 실행하기 위한 명령어
docker run [-d] \
-p [host port : container port] \
[--name container_name] \
image_namerun
컨테이너를 실행하는 명령어
-d
detached 로 백그라운드 환경에서 실행하겠다는 의미
-p host port : container port
host port → 내 로컬에서 사용할 포트 번호
container port → 컨테이너에서 사용할 포트 번호
--name container_name
컨테이너 이름 지정
image_name
실행할 이미지 이름을 기재
docker run -d -p 6379:6379 --name redis-container redis:latest컨테이너 실행 확인하기
docker ps
현재 실행중인 컨테이너를 보여주는 명령어
STATUS 가 UP 이면 실행 중
실행 중인 컨테이너 내부 접근
docker exec -it [container ID] bash
exec
접근 명령어
-it
터미널 모드로 접속
bash
Bash shell 로 실행
그외 명령어
// 컨테이너 실행 멈추기
docker stop [컨테이너 이름]
// 로그 보기 (에러 및 실행 확인) (-f -> tail -f 같이 실시간 확인)
docker logs [-f] [컨테이너 이름]
// 컨테이너 삭제
docker rm [컨테이너 이름]Dockerfile
이미지를 만드는 설계도
Dockerfile 명령어
FROM
이미지의 시작점을 지정하는 명령어
기초공사가 끝난 땅을 사는 것과 비슷하다
Spring Boot 를 배포한다면 JDK 이미지를 가져와야 공사를 이어할테니
JDK 이미지를 가져와야 한다
WORKDIR
컨테이너 안에서 작업할 기본폴더를 지정 하는 명령어
RUN
이미지 빌드 시점에 실행되는 명령어
패키지 설치, 파일 다운로드 등 빌드에 필요한 모든 작업을 수행할 때 사용한다
ENV
컨테이너 실행시 환경변수를 설정함, 빌드, 런타임 시점에 전부 사용한다
COPY
빌드된 파일을 컨테이너 안으로 복사하는 명령어
Spring Boot 어플리케이션이니 Jar 를 복사하면 된다
EXPOSE
컨테이너의 포트 지정 명령어
CMD
실행 명령어를 지정하는 명령어
다만 run 시 명령어가 있다면 무시된다
ENTRYPOINT
컨테이너가 시작되면 자동으로 실행할 명령어
CMD와 ENTRYPOINT의 명령어 구조는
보편적인 Shell 명령어와 Exec 형식으로 나뉘는데
일반적으로 Exec형식으로 사용된다 (쉘이 끼어드는 것을 없애기 위해서)
ENTRYPOINT java -jar app.jar → /bin/sh java -jar app.jar
쉘이 실행되면 PID 1번이 Shell 이 되어버리는 것도 문제
ENTRYPOINT [“java“, “-jar“, “app.jar“] → 그대로 직접 실행됨
전반적인 셋업 과정
먼저 공식 이미지 (MySQL, Redis .. 와 같은) 외에
이미지를 사용하기 위해서는 Dockerfile 을 작성해야한다
Dockerfile 작성
FROM eclipse-temurin:25-alpine
WORKDIR /app
COPY build/libs/*.jar app.jar
ENV SPRING_PROFILES_ACTIVE=local
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]Docker image 만들기
docker build -f [도커파일] -t [이름] .여기까지 진행하면 우선 로컬 상태는 실행할 수 있다
하지만 여기까지는 SpringBoot 만 실행 한 것이다
이제 DB 까지도 Docker 로 실행해봐야 한다
이렇게 복합적으로 컨테이너를 실행하기 위해서는
docker compose 를 사용해야 한다
사용하기 위해서는docker-compose.yml 을 작성해야한다