필요 시간
필요 기술
필요 작업
Linux 시스템을 사용하지 않는 경우 가상화된 서버가 필요합니다.
ㄴ 1. VirtualBox를 설치하면 Mac과 같은 다른 도구에서 boot2docker원활하게 관리할 수 있습니다.
ㄴ 2. VirtualBox의 다운로드 사이트를 방문 하여 컴퓨터의 버전을 선택하십시오. 다운로드하여 설치합니다.
ㄴ 3. 실제로 실행하는 것에 대해 걱정하지 마십시오.
64비트 머신에서만 실행되는 Docker 도 필요 합니다.
ㄴ 1. 컴퓨터에 Docker를 설정하는 방법에 대한 자세한 내용은 https://docs.docker.com/installation/#installation 을 참조 하세요 .
ㄴ 2. 계속 진행하기 전에 docker쉘에서 명령을 실행할 수 있는지 확인하십시오 .
ㄴ 3. 프로세스를 사용하는 경우 먼저 boot2docker 실행해야 합니다
프로젝트를 초기화하려면:
https://start.spring.io로 이동(Navigate to)합니다. 이 서비스는 애플리케이션에 필요한 모든 종속성(dependencies)을 가져오고 대부분의 설정을 자동으로 수행합니다.
Gradle 또는 Maven과 사용하려는 언어를 선택합니다. 이 가이드에서는 Java를 선택했다고 가정합니다.
종속성(Dependencies)을 클릭 하고 Spring Web 을 선택하십시오.
생성(Generate) 을 클릭 합니다.
선택 사항으로 구성된(configured with your choices.) 웹 응용 프로그램의 아카이브인 결과 ZIP 파일을 다운로드합니다.
If your IDE has the Spring Initializr integration, you can complete this process from your IDE.
You can also fork the project from Github and open it in your IDE or other editor.
Now you can create a simple application:
src/main/java/hello/Application.java
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello Docker World";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
코드 설명 :
by Spring MVC to handle web requests.
The class is flagged as a @SpringBootApplication and as a @RestController, meaning that it is ready for use
@RequestMapping maps_ / to the _home() method, which sends a
Hello World response.
The main() method
uses Spring Boot’s SpringApplication.run() method to launch an application.
실행
Now we can run the application without the Docker container (that is, in the host OS):
이제 Docker 컨테이너 없이(즉, 호스트 OS에서) 애플리케이션을 실행할 수 있습니다.
./gradlew build && java -jar build/libs/gs-spring-boot-docker-0.1.0.jar
./mvnw package && java -jar target/gs-spring-boot-docker-0.1.0.jar
출력
Then go to localhost:8080 to see your “Hello Docker World” message.
컨테이너화
- Command Form
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
- 속성
- 1. FROM : ㄴ 이 Dockerfile은 매우 간단하지만 Java와 JAR 파일만 있으면( just Java and a JAR file ) 아무 장식 없이 Spring Boot 앱을 실행하는 데 필요한 모든 것입니다 - 2. ARG : ㄴ 빌드는 애플리케이션을 실행할 스프링 사용자와 스프링 그룹을 생성합니다. - 3. COPY : ㄴ 그런 다음 app.jar로 실행되는 **컨테이너에 COPY 프로젝트에 JAR 파일을 복사 합니다. - 4. ENTRYPOINT : ㄴ ENTRYPOINT Java 프로세스를 래핑하는 셸이 없도록 Dockerfile의 배열 형식을 사용합니다. Docker에 대한 주제 가이드 는 이 주제에 대해 더 자세히 설명합니다.
step1-1. 플러그인별 컨테이너화 명령
docker build --build-arg JAR_FILE=build/libs/\*.jar -t springio/gs-spring-boot-docker
docker build -t springio/gs-spring-boot-docker .
step1-2. 이 명령은 이미지를 빌드하고 로 태그를 지정(tags builds)합니다
springio/gs-spring-boot-docker.
To reduce Tomcat startup time, we used to add a system property pointing to /dev/urandom as a source of entropy. This is not necessary anymore with JDK 8 or later.
사용자 권한으로 애플리케이션을 실행하면 일부 위험을 완화하는 데 도움이 됩니다(see, for example,: StackExchange의 스레드 참조 ). 따라서 중요한 개선 사항 Dockerfile은 루트가 아닌 사용자로 응용 프로그램을 실행하는 것입니다.
FROM openjdk:8-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG JAR_FILE=target/*.jar ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t springio/gs-spring-boot-docker .
docker run -p 8080:8080 springio/gs-spring-boot-docker
:: Spring Boot :: (v2.2.1.RELEASE)
2020-04-23 07:29:41.729 INFO 1 --- [main] hello.Application : Starting Application on b94c86e91cf9 with PID 1 (/app started by spring in /)
...
FROM openjdk:8-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG DEPENDENCY=target/dependency COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","hello.Application"]
- 부가 설명 1.
- If we get that right, it already contains a BOOT-INF/lib directory with the dependency JARs in it, and a BOOT-INF/classes directory with the application classes in it.
- Notice that we use the application’s own main class: hello.Application. (This is faster than using the indirection provided by the fat JAR launcher.)
우리는 애플리케이션의 자체 메인 클래스를 사용합니다:
. (이는 팻 JAR 런처에서 제공하는 간접 참조를 사용하는 것보다 빠릅니다.)
mkdir -p build/dependency && (cd build/dependency; jar -xf ../libs/*.jar)
mkdir -p target/dependency && (cd target/dependency; jar -xf ../*.jar)
- 의존성 주의사항
- Exploding the JAR file can result in the classpath order being different at runtime. A well-behaved and well-written application should not care about this, but you may see behavior changes if the dependencies are not carefully managed.
- If you use boot2docker, you need to run it first before you do anything with the Docker command line or with the build tools (it runs a daemon process that handles the work for you in a virtual machine).
docker build --build-arg DEPENDENCY=build/dependency -t springio/gs-spring-boot-docker .
docker build -t springio/gs-spring-boot-docker .
Of course, if you use only Gradle, you could change the Dockerfile to make the default value of DEPENDENCY match the location of the unpacked archive.
By default, the images generated by the default buildpacks do not run your application as root. Check the configuration guide for Gradle or Maven for how to change the default settings.
기본적으로 기본 빌드팩에서 생성된 이미지는 애플리케이션을 루트로 실행하지 않습니다. 기본 설정을 변경하는 방법 은 Gradle 또는 Maven 의 구성 가이드를 확인하세요 .
./gradlew bootBuildImage --imageName=springio/gs-spring-boot-docker
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=springio/gs-spring-boot-docker
$ docker run -p 8080:8080 -t springio/gs-spring-boot-docker
Container memory limit unset. Configuring JVM for 1G container.
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=86381K -XX:ReservedCodeCacheSize=240M -Xss1M -Xmx450194K (Head Room: 0%, Loaded Class Count: 12837, Thread Count: 250, Total Memory: 1073741824)
....
2015-03-31 13:25:48.035 INFO 1 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2015-03-31 13:25:48.037 INFO 1 --- [ main] hello.Application : Started Application in 5.613 seconds (JVM running for 7.293)
The CF memory calculator is used at runtime to size the JVM to fit the container.
CF 메모리 계산기는 런타임에 컨테이너에 맞게 JVM의 크기를 조정하는 데 사용됩니다.
- boot2docker가 있는 Mac을 사용하는 경우 > 출력 예시.
boot2docker가 있는 Mac을 사용하는 경우, 일반적으로 시작 시 다음과 같이 표시됩니다 :Docker client to the Docker daemon, please set: export DOCKER_CERT_PATH=/Users/gturnquist/.boot2docker/certs/boot2docker-vm export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://192.168.59.103:2376
애플리케이션을 보려면 localhost 대신 DOCKER_HOST의 IP 주소를 방문해야 합니다. 이 경우 VM의 공개 IP인 https://192.168.59.103:8080을 방문해야 합니다 .
실행 중일 때, 출력 예시
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81c723d22865 springio/gs-spring-boot-docker:latest "java -Djava.secur..." 34 seconds ago Up 33 seconds 0.0.0.0:8080->8080/tcp goofy_brown ```
컨테이너 ID로 종료 명령.
docker stop goofy_brown
81c723d22865
docker rm goofy_brown
docker run -e "SPRING_PROFILES_ACTIVE=prod" -p 8080:8080 -t springio/gs-spring-boot-docker
docker run -e "SPRING_PROFILES_ACTIVE=dev" -p 8080:8080 -t springio/gs-spring-boot-docker
docker run -e "JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" -p 8080:8080 -p 5005:5005 -t springio/gs-spring-boot-docker
Congratulations!
다음 가이드도 도움이 될 수 있습니다.
Spring MVC로 웹 콘텐츠 제공
스프링 부트로 애플리케이션 빌드
Docker를 사용한 Spring Boot에 대한 주제 가이드 (이 가이드보다 더 깊이 있음)