Dockerize는 이제 더이상 선택이 아니라 필수라고 생각한다. 너무나 많이 사용되고 있고 Microservice Architecture에서는 Docker container는 필수라고 생각된다. 특히 Kubernetes 와 같은 좋은 툴이 나와서 Container orchestration도 쉽게할 수 있으니 사용하지 않을 수가 없다.
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
특히, 혼자서 1대의 Laptop 또는 Desktop으로 개발을 진행한다면 반드시 써야 한다. 나의 개인 프로젝트의 목표가 MSA 서버를 만드는 것이니 지금 개발 중인 Spring 기반의 서버도 Docker로 빌드를 해야한다.
Docker는 Documentation이 아주 잘되어 있다. 자세한 설명을 보고 싶으면 여기로 가면 된다. 여기에서는 Spring 서버를 간단하게 빌드하고 띄워보는 방법을 공유하고자 한다.
Docker container를 만들고 띄우기 위해서는 당연히 Docker가 필요하다. Docker 설치는 아래 문서를 참고하자. (Docker Desktop 설치)
2022.01.12 - [Infrastructure/kubernetes] - kubernetes 설치하기 with Docker desktop
Dockerfile
Docker container를 실행하기 위해서는 Docker image를 만들어야 한다. 우리가 Virtual Machine을 띄우기 위해 OS image가 필요한 것과 같은 원리이다. 대신 Container의 경우 머신의 OS를 그대로 사용하기 때문에 VM보다는 가볍다라고 보면된다. 그래서 이미지도 OS보다 용량이 적다.
이 이미지를 만들기 위해서는 Dockerfile이라고 하는 image build script가 필요하다.
아래는 간단한 Spring 용 Dockerfile이다.
FROM adoptopenjdk:11-jre-hotspot
ARG WAR_FILE=./target/*.war
ARG PROFILE
ENV SPRING_PROFILE=$PROFILE
COPY ${WAR_FILE} webapp.war
CMD ["java", "-Dspring.profiles.active=${SPRING_PROFILE}", "-jar", "webapp.war"]
나의 프로젝트의 경우 `war` 파일로 빌드를 하기 때문에 위와 같은 Commad를 사용하였다.
그리고 현재 Project에 Profile을 추가해 둔 상태기 때문에 Profile에 따라 서버를 실행한다.
Docker build
$ docker build --build-arg PROFILE=local --no-cache . -t spring-micro-session:latest
[+] Building 1.5s (7/7) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 256B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/adoptopenjdk:11-jre-hotspot 0.0s
=> [internal] load build context 1.2s
=> => transferring context: 42.15MB 1.2s
=> CACHED [1/2] FROM docker.io/library/adoptopenjdk:11-jre-hotspot 0.0s
=> [2/2] COPY ./target/*.war webapp.war 0.2s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:58639db680aa854a72685b1a1846036cc46f9cae59d3ec7d1e91e3b0230be9f0 0.0s
=> => naming to docker.io/library/spring-micro-session:latest
위와 같이 Docker를 빌드하면 이미지가 생성된다.
`--no-cache`는 빌드시에 cache되어 있는 정보를 사용하는 것이 아니라 매번 새롭게 빌드하는 옵션이다.
`-t`는 이미지의 이름과 Tag를 정의해주는 옵션이다. 여기에서 이미지 이름은 spring-micro-session 이고 tag는 latest이다.
Docker Run
`docker run` 명령어는 Container를 실행하는 명령어이다. 방금 생성한 이미지로 실행을 해보았다. 실행이 잘된다.
docker run --rm --name session spring-micro-session:latest ✔ 6045 21:32:57
,---. ,--.
' .-' ,---. ,---. ,---. `--' ,---. ,--,--,
`. `-. | .-. : ( .-' ( .-' ,--. | .-. | | \
.-' | \ --. .-' `) .-' `) | | ' '-' ' | || |
`-----' `----' `----' `----' `--' `---' `--''--'
spring-micro-session 0.0.1-SNAPSHOT
Powered by Spring Boot 2.6.2
2022-01-15 05:33:19.070 INFO 1 --- [ main] i.c.session.SessionApplication : Starting SessionApplication v0.0.1-SNAPSHOT using Java 11.0.11 on b1f2c1d52bff with PID 1 (/webapp.war started by root in /)
2022-01-15 05:33:19.072 DEBUG 1 --- [ main] i.c.session.SessionApplication : Running with Spring Boot v2.6.2, Spring v5.3.14
2022-01-15 05:33:19.072 INFO 1 --- [ main] i.c.session.SessionApplication : The following profiles are active: local
2022-01-15 05:33:19.393 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2022-01-15 05:33:19.393 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2022-01-15 05:33:19.405 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces.
2022-01-15 05:33:19.528 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2022-01-15 05:33:19.528 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2022-01-15 05:33:19.616 INFO 1 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 88 ms. Found 1 Redis repository interfaces.
2022-01-15 05:33:19.923 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8180 (http)
2022-01-15 05:33:19.931 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-01-15 05:33:19.931 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-01-15 05:33:20.536 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-01-15 05:33:20.536 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1426 ms
2022-01-15 05:33:21.708 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8180 (http) with context path ''
2022-01-15 05:33:21.719 INFO 1 --- [ main] i.c.session.SessionApplication : Started SessionApplication in 3.026 seconds (JVM running for 3.32)
`--rm` 옵션은 Container 실행을 중지하면 자동으로 Container를 삭제해주는 명령어이다.
`--name`은 Container의 이름을 지정한다.
`-d` 옵션으로 주면 daemon 형태로 실행할 수 있다.
$ docker run -d --rm --name session spring-micro-session:latest
Docker ps
`docker ps` 명령어는 현재 수행되는 Container의 정보를 확인할 수 있다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b8bf1923dca spring-micro-session:latest "java -Dspring.profi…" 2 minutes ago Up 2 minutes session
Docker stop
`docker stop` 명령어는 현재 동작 중인 docker container를 중지시킨다. container id와 함께 실행하면 된다.
$ docker stop 3b8bf1923dca ✔ 6053 21:42:12
3b8bf1923dca
'Java > Spring boot' 카테고리의 다른 글
Embedded Redis를 이용하여 Unit test 작성하기 (0) | 2022.01.17 |
---|---|
SLF4J: Class path contains multiple SLF4J bindings 해결 방법 (0) | 2022.01.17 |
Open API Document (Swagger) 설정하기 (0) | 2022.01.15 |
Spring Data Redis 에서 Key는 어떻게 생성되는가? (0) | 2022.01.13 |
Character Encoding 설정 - UTF-8 (0) | 2022.01.12 |