필요 시간
필요 기술
필요 작업
Linux 시스템을 사용하지 않는 경우 가상화된 서버가 필요합니다.
ㄴ 1. VirtualBox를 설치하면 Mac과 같은 다른 도구에서 boot2docker원활하게 관리할 수 있습니다.
ㄴ 2. VirtualBox의 다운로드 사이트를 방문 하여 컴퓨터의 버전을 선택하십시오. 다운로드하여 설치합니다.
ㄴ 3. 실제로 실행하는 것에 대해 걱정하지 마십시오.
64비트 머신에서만 실행되는 Docker 도 필요 합니다.
ㄴ 1. 컴퓨터에 Docker를 설정하는 방법에 대한 자세한 내용은 https://docs.docker.com/installation/#installation 을 참조 하세요 .
ㄴ 2. 계속 진행하기 전에 docker쉘에서 명령을 실행할 수 있는지 확인하십시오 .
ㄴ 3. 프로세스를 사용하는 경우 먼저 boot2docker 실행해야 합니다
목차
- 서버 : Spring Boot Application
- 2-1. 서버 구성 : Spring Initializr
- 2-2. 서버 구현 : simple application > restAPI
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.
- 목차
- 도커 내 애플리케이션 실행 : run the application In docker
3-1. Docker os로 실행
3-2. Docker container로 실행
실행
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.
step 3-2-1. 컨테이너화 ?
Docker에는 이미지의 "계층"을 지정( layers specify )하는 데 사용 하는 간단한 "Dockerfile" 파일 형식이 있습니다.
Spring Boot 프로젝트에서 다음 Dockerfile을 생성합니다. > 아래 예제 1,2,3
step 3-2-2. 컨테이너화를 위한 도커파일 생성
1) 플러그인별, 기본 생성
- If you use Gradle, you can run it with the following command:
docker build --build-arg JAR_FILE=build/libs/\*.jar -t springio/gs-spring-boot-docker
- If you use Maven, you can run it with the following command:
docker build -t springio/gs-spring-boot-docker .
2) 이 명령은 이미지를 빌드하고 로 태그를 지정(tags builds)합니다
springio/gs-spring-boot-docker.
- Command Form
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
- Command Attr
- FROM :
이 Dockerfile은 매우 간단하지만 Java와 JAR 파일만 있으면( just Java and a JAR file ) 아무 장식 없이 Spring Boot 앱을 실행하는 데 필요한 모든 것입니다
- ARG :
빌드는 애플리케이션을 실행할 스프링 사용자와 스프링 그룹을 생성합니다.
- COPY :
그런 다음 app.jar로 실행되는 **컨테이너에 COPY 프로젝트에 JAR 파일을 복사 합니다.
- ENTRYPOINT :
ENTRYPOINT Java 프로세스를 래핑하는 셸이 없도록 Dockerfile의 배열 형식을 사용합니다.
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 /)
...
step 3-2-4. 도커 디렉토리의 위치와 네이밍 설정
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).
step 3-2-4. 디렉토리명을 일컫는 디렉토리 매개변수 지정
From a Gradle build, you need to add the explicit build arguments in the Docker command line:
docker build --build-arg DEPENDENCY=build/dependency -t springio/gs-spring-boot-docker .
To build the image in Maven, you can use a simpler Docker command line:
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.
step 3-2-5. 고도화 히스토리
Docker 명령줄을 사용하여 빌드하는 대신 빌드 플러그인을 사용할 수 있습니다.
ㄴ Spring Boot는 자체 빌드 플러그인을 사용하여 Maven 또는 Gradle에서 컨테이너 빌드를 지원합니다.
Google 에는 Maven 및 Gradle 플러그인이 포함된 Jib 이라는 오픈 소스 도구도 있습니다.
ㄴ 아마도 이 접근 방식에서 가장 흥미로운 점은 Dockerfile을 필요로 하지않습니다.
docker build 에서 가져온 것과 동일한 표준 컨테이너 형식을 사용하여 이미지를 빌드할 수 있습니다
ㄴ 또한 도커가 설치되지 않은 환경에서도 작동할 수 있습니다(빌드 서버에서는 일반적이지 않음).
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 의 구성 가이드를 확인하세요 .
( Build a Docker Image with Gradle )
./gradlew bootBuildImage --imageName=springio/gs-spring-boot-docker
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=springio/gs-spring-boot-docker
To push to a Docker registry ,
1) you need to have permission to push, which you do not have by default.
Docker 레지스트리에 푸시하려면 기본적으로 없는 푸시 권한이 있어야 합니다.
2) Change the image prefix to your own Dockerhub ID and docker login to make sure you are authenticated before you run Docker.
이미지 접두사를 고유한 Dockerhub ID로 변경하고 docker loginDocker를 실행하기 전에 인증되었는지 확인하십시오.
step 1 . 도커에 푸쉬
이미지 접두사를 고유한 Dockerhub ID로 변경하고 docker loginDocker를 실행하기 전에 인증되었는지 확인하십시오.
$ 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의 크기를 조정하는 데 사용됩니다.
step 2. 출력 확인 :
step 2-1. 기본 출력 확인 :
The application is then available on http://localhost:8080 (visit that and it says, “Hello Docker World”).
그런 다음 애플리케이션은 http://localhost:8080 에서 사용할 수 있습니다 (방문하면 "Hello Docker World"라고 표시됨).
- step 2. 번외 출력 :
- 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을 방문해야 합니다 .
step 2-1. 실행 중일 때, 출력 예시
$ 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 ```
step 2-2. 컨테이너 ID로 종료 명령.
docker stop goofy_brown
81c723d22865
step2-3. 컨테이너 삭제.
(/var/lib/docker작업이 끝나면 컨테이너를 삭제할 수도 있습니다. 파일 시스템 어딘가에 유지됨).
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에 대한 주제 가이드 (이 가이드보다 더 깊이 있음)