본문 바로가기

Server/Docker

[Docker] Docker로 배포하기: 2. 도커 컨테이너 생성, 도커 컴포즈 실행

 

 

지난 글에서 가상화와 도커에 대해 공부하면서, 도커가 무엇인지 어느 정도 파악했다.

이제 실제 사용까지 해보자!

 


🧐 Docker desktop 다운로드

도커 데스크탑은 컨테이너화된 애플리케이션 및 마이크로서비스를 빌드, 공유 및 실행을 할 수 있는 애플리케이션이다.

 

https://docs.docker.com/desktop/

 

Overview of Docker Desktop

Explore more of Docker Desktop, what it has to offer, and its key features. Take the next step by downloading or find additional resources.

docs.docker.com

 

도커 데스크탑 다운로드 후 터미널 창에서 docker --version을 확인해보면 버전이 보인다.

맥, 리눅스, 윈도우 환경 모두 도커 데스크탑 설치로 편리하게 사용할 수 있다.

 

🧐 Local 환경에서 Docker 실행하기

 

공식 블로그에 나와있는대로 스프링 부트 도커 이미지를 만들고, 실행해보자!

https://www.docker.com/blog/kickstart-your-spring-boot-application-development/

 

Kickstart Your Spring Boot Application Development | Docker

Learn from Docker experts to simplify and advance your app development and management with Docker. Stay up to date on Docker events and new version

www.docker.com

 


 

🧐 우선 Spring boot Application부터 생성한다. 

 

1) 의존성에 Spring Web만 추가하여 Generate

Maven으로 생성해주세요!!!

 

 

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 최적화

 

  1. 경량 베이스 이미지 사용하기: 가능한 가장 경량의 베이스 이미지를 사용한다.
  2. 멀티 스테이지 빌드 사용하기: 빌드 단계에만 필요한 도구를 최종 이미지에서 제외 시킨다.
  3. 필요없는 파일 제거: 임시파일, 캐시 파일 모두 제거한다.
  4. 레이어 수 최소화 하기: RUN, COPY, ADD 명령어는 새로운 레이어를 생성하여, 가능한 적은 수의 레이어를 생성한다.
  5. COPY, ADD 명령어는 신중하기: 필요한 파일만 이미지에 추가한다.
  6. 환경변수를 이용한 설정하기: 설정 변경이 필요할 때 이미지를 다시 빌드하지 않아도 된다.
  7. 적절한 태그 사용하기: 적절한 버전을 지정하여 불필요한 업데이트 방지한다.

 


 

🧐 이제 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