지난 글에서 가상화와 도커에 대해 공부하면서, 도커가 무엇인지 어느 정도 파악했다.
이제 실제 사용까지 해보자!
🧐 Docker desktop 다운로드
도커 데스크탑은 컨테이너화된 애플리케이션 및 마이크로서비스를 빌드, 공유 및 실행을 할 수 있는 애플리케이션이다.
https://docs.docker.com/desktop/
도커 데스크탑 다운로드 후 터미널 창에서 docker --version
을 확인해보면 버전이 보인다.
맥, 리눅스, 윈도우 환경 모두 도커 데스크탑 설치로 편리하게 사용할 수 있다.
🧐 Local 환경에서 Docker 실행하기
공식 블로그에 나와있는대로 스프링 부트 도커 이미지를 만들고, 실행해보자!
https://www.docker.com/blog/kickstart-your-spring-boot-application-development/
🧐 우선 Spring boot Application부터 생성한다.
1) 의존성에 Spring Web만 추가하여 Generate
2) SpringBootDockerApplication.java
에 간단하게 Hello World! 리턴하는 REST api 하나 만들기
@RestController
@SpringBootApplication
public class SpringBootDockerApplication {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(SpringBootDockerApplication.class, args);
}
3) ./mvnw package
명령어로 프로젝트를 build
위 명령어는 Maven Wrapper를 사용하여 Maven 프로젝트를 패키징하는 명령어이다. 로컬에 Maven이 없어도 빌드 가능!
4) java -jar target/spring-boot-docker-0.0.1-SNAPSHOT.jar
명령어로 앱 실행
빌드하여 생성된 JAR 파일을 실행한다.
🧐 이젠 만든 Spring Boot Application을 컨테이너로 만들어보자
1) DockerFile 작성하기
DockerFile은 도커 이미지를 구축하기 위해 명령어를 나열한 파일이다.
`touch Dockerfile` 도커 파일을 생성하고
아래와 같이 작성한다.
Maven:
FROM eclipse-temurin:17-jdk-focal
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]
작성된 도커 파일을 살펴보자
- `FROM eclipse-temurin:17-jdk-focal`: Dockerfile은 `FROM` 명령어로 시작하며 빌드의 기점이 되는 이미지 정의
- `WORKDIR /app`: 작업 디렉토리 설정
- `COPY .mvn/ .mvn`, `COPY mvnw pom.xml ./`: Maven wrappers, pom file 호스트 파일 디렉토리를 이미지 내부로 복사
- `RUN ./mvnw depedency:go-offline`: 이미지 빌드 중에 명령어 실행
- `COPY src ./src`: src 파일도 복사
- `CMD ["./mvnw", "spring-boot:run"]`: 컨테이너 시작 시 기본 명령어 정의
2) Docker Image build
`docker build --platform linux/amd64 -t spring-helloworld .`
- `docker build`: Docker image를 build하는 명령어
- `--platform linux/amd64`: build하는 Docker image가 linux/amd64 플랫폼에서 실행하길 지정
- `-t spring-helloworld`: 'spring-helloworld'라는 태그를 지정
- `.`: Dockerfile과 빌드에 필요한 파일이 있는 디렉토리 지정
이미지가 생성되었다!
생성한 이미지를 허브에 올려서 쉽게 공유하는 것도 가능하다.
3) Spring Boot Docker Container 실행하기
`docker run -p 8080:8080 -t spring-helloworld`
위 명령어를 실행하면 실제 로컬에서 작동되고 있는 것을 확인할 수 있다.
🧐 +Tip) 도커 이미지 최적화를 위한 Dockerfile 최적화
- 경량 베이스 이미지 사용하기: 가능한 가장 경량의 베이스 이미지를 사용한다.
- 멀티 스테이지 빌드 사용하기: 빌드 단계에만 필요한 도구를 최종 이미지에서 제외 시킨다.
- 필요없는 파일 제거: 임시파일, 캐시 파일 모두 제거한다.
- 레이어 수 최소화 하기: RUN, COPY, ADD 명령어는 새로운 레이어를 생성하여, 가능한 적은 수의 레이어를 생성한다.
- COPY, ADD 명령어는 신중하기: 필요한 파일만 이미지에 추가한다.
- 환경변수를 이용한 설정하기: 설정 변경이 필요할 때 이미지를 다시 빌드하지 않아도 된다.
- 적절한 태그 사용하기: 적절한 버전을 지정하여 불필요한 업데이트 방지한다.
🧐 이제 Docker Compose로 Multi-Container Spring boot Application를 만들어보자
도커 컴포즈(Docker Compose)란 여러 컨테이너를 정의하고 실행하기 위한 도구이다.
- docker-compose.yml 파일로 전체 애플리케이션 설정 관리
- 간단한 명령어를 통해 서비스 생성, 시작, 중지
- 로컬 환경에서 전체 애플리케이션을 테스트 가능
- 환경의 일관성을 보장
- 복잡한 애플리케이션을 구성하는 다수의 서비스를 한 번에 관리
자 이제 공식문서 실습을 따라가보자
1) 레포지토리 clone
`git clone https://github.com/docker/awesome-compose`
compose.yml 파일을 살펴보자.
- services
- 애플리케이션을 구성하는 컨테이너 정의
- 도커 이미지, 포트, 볼륨 마운트 등 컨테이너 실행 설정 포함 - volumes
- 데이터를 영구적으로 저장하기 위한 볼륨 정의
- 컨테이너가 삭제되어도 데이터 보존하며, 컨테이너 간 데이터 공유 - secrets
- 비밀키 - networks
- 컨테이너 간 통신을 위한 네트워크 정의
2) Running docker compose
`docker compose up -d`
도커 컴포즈를 실행하는 명령어 이다.
`docker compose ps` 로 실행 중인 것을 확인할 수 있다.
또한, localhost:8080에서 실행되는 것을 확인할 수 있다.
3) 컨테이너 정지와 삭제
`docker compose down`
도커 컨테이너를 실제 만들어보고, 도커 컴포즈로 여러 컨테이너들을 로컬에서 실행해보았다.
실제로 Dockerfile이나 compose.yml 파일을 작성해보지 않아서,,, 뭔가 막막하게 느껴지지만
각 애플리케이션을 독립된 환경에서 실행할 수 있고, 환경의 일관성을 유지한다는 점하는데 편리하기까지 하니 많은 사람들에게 이용되는 것이 아닌가싶다.
'Server > Docker' 카테고리의 다른 글
[Docker] Docker로 배포하기: 1. 가상화, Docker란 (4) | 2024.04.08 |
---|