Spring Boot 응용 프로그램 이 Docker 에 발 표 된 실현

14768 단어 SpringBootDocker
Spring 홈 페이지 에는 Docker 를 사용 하여 Spring Boot 애플 리 케 이 션 을 발표 하 는 방법 을 소개 한 편Getting Start이 있 는데 상세 한 편 이지 만 일부 세부 사항 은 언급 되 지 않 았 고 홈 페이지 의 입문 매 뉴 얼 은 영문 판 이다.여기에 다시 기록 을 정리 하 는 것 은 영어 가 좋 지 않 은 친구 들 에 게 참고 하고 자신 에 게 메모 도 남 기 는 셈 이다.
준비 하 다.
필요 한 도구 및 실행 환경:
  • JDK 1.8 or later
  • Maven 3.0 +
  • 좋아 하 는 IDE 나 다른 텍스트 편집기
  • 프로젝트 생 성
    우선,Spring Boot 프로젝트 를 만들어 야 합 니 다.Spring Tool Suite 와 IntelliJ IDEA 는 모두 자체 플러그 인 을 만 들 수 있 고http://start.spring.io/에서 만 들 수 있 습 니 다.이런 방식 을 추천 합 니 다.폼 에 있 는Group IdArtifact Id을 작성 한 후 Generate Project 단 추 를 누 르 면 생 성 되 며 다운로드 한 프로젝트 를 원 하 는 IDE 에 가 져 옵 니 다.
    pom.xml 파일 을 수정 하고 docker-maven-plugin 을 추가 합 니 다.
    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.matrixstudio.springboot</groupId>
      <artifactId>docker</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <name>docker</name>
      <description>Demo project for Spring Boot</description>
    
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
      </parent>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <docker.image.prefix>springio</docker.image.prefix>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
    
          <!-- Docker maven plugin -->
          <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.4.3</version>
            <configuration>
              <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
              <dockerDirectory>src/main/docker</dockerDirectory>
              <resources>
                <resource>
                  <targetPath>/</targetPath>
                  <directory>${project.build.directory}</directory>
                  <include>${project.build.finalName}.jar</include>
                </resource>
              </resources>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    docker-maven-plugin 플러그 인 은 Spring Boot 프로젝트 를 Docker 미 러 로 구축 하 는 데 사 용 됩 니 다.
  • imageName 은 Docker 미 러 이름 을 표시 합 니 다.Docker 의 이름 규범 을 사용 합 니 다.이름 은 springio/docker
  • 입 니 다.
  • dockerDirectory 는 Dockerfile 의 경 로 를 표시 합 니 다
  • resource 는 구축 에 필요 한 자원 파일 을 표시 합 니 다.이 파일 들 은 Dockerfile 과 함께 놓 여 있 습 니 다.여 기 는 Spring Boot 에서 생 성 된 jar 파일 만 있 으 면 됩 니 다.
  • DockerApplication.java파일 을 열 고 다음 내용 으로 수정 합 니 다.
    
    package org.matrixstudio.springboot;
    
    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 DockerApplication {
    
      @RequestMapping("/")
      public String home() {
        return "Hello Docker World";
      }
    
      public static void main(String[] args) {
        SpringApplication.run(DockerApplication.class, args);
      }
    }
    
    
    컴 파일 및 실행
    다음 명령 을 실행 하여 Spring Boot 프로젝트 를 실행 합 니 다.
    
    mvn package && java -jar target/docker-0.0.1-SNAPSHOT.jar
    브 라 우 저 를 열 고 입력http://localhost:8080하 십시오.'Hello Docker World'가 나타 나 면 실행 에 성 공 했 음 을 설명 합 니 다.
    주:위의 명령 을 실행 할 때 Maven 공식 창고 에서 의존 가방 을 많이 다운로드 해 야 합 니 다.국내 네트워크 가 불안정 하고 다운로드 속도 가 느 리 므 로 제3자 가 제공 하 는 미 러 스테이션,예 를 들 어 아 리 의 Maven 미 러 창 고 를 사용 하 는 것 을 고려 할 수 있 습 니 다.pom.xml 에 아래 설정 을 추가 합 니 다:
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.matrixstudio.springboot</groupId>
      <artifactId>docker</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <!-- Dependencies -->
      ......
    
      <!-- Build -->
      ......
    
      <!-- Aliyun repository -->
      <repositories>
        <repository>
        <id>central</id>
          <name>aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
        </repository>
      </repositories>
    </project>
    
    
    용기 화 항목
    우선 기계 에 Docker 가 설치 되 어 있 는 지 확인 해 야 합 니 다.Docker 가 리 눅 스 서버 에 설치 되 어 있다 면 위의 Spring Boot 프로젝트 를 이 서버 에 업로드 해 야 합 니 다.아래 절 차 는 리 눅 스 환경 에서 작 동 한다 고 가정 합 니 다.
    Dockerfile 만 들 기
    Docker 는Dockerfile라 는 파일 을 사용 하여 image 층 을 지정 합 니 다.따라서 우 리 는 먼저Dockerfile파일 을 만 들 고 아래 명령 을 실행 하여Dockerfile파일 을 만들어 야 합 니 다.
    
    sudo tee src/main/docker/Dockerfile <<-'EOF'
    FROM frolvlad/alpine-oraclejdk8:slim
    VOLUME /tmp
    ADD docker-0.0.1-SNAPSHOT.jar app.jar
    RUN sh -c 'touch /app.jar'
    ENV JAVA_OPTS=""
    ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
    EOF
    
    위의 명령 을 대충 설명 하 세 요.
  • VOLUME 는 Spring Boot 가 내 장 된 Tomcat 용 기 를 사용 하기 때문에 Tomcat 은 기본적으로/tmp 를 작업 디 렉 터 리 로 사용 합 니 다.효 과 는 호스트 의/var/lib/docker 디 렉 터 리 에 임시 파일 을 만 들 고 용기 에 연 결 된/tmp 입 니 다.
  • 프로젝트 의 jar 파일 을 app.jar 로 용기 에 추가 합 니 다
  • RUN 은 새로 만 든 미 러 에서 명령 을 실행 한 다음 실행 결 과 를 현재 미 러 에 제출 하 겠 다 고 밝 혔 다.파일 의 수정 시간 을 변경 하려 면 touch 명령 을 사용 합 니 다.Docker 가 만 든 모든 용기 파일 의 기본 상 태 는'수정 되 지 않 음'입 니 다.이것 은 간단 한 응용 에 있어 서 필요 하지 않 지만 일부 정적 내용(예 를 들 어 index.html)의 파일 에 대해 서 는'수정 시간'이 필요 합 니 다.
  • Tomcat 의 시작 시간 을 단축 시 키 기 위해 자바 security.egd 의 시스템 속성 지향/dev/urandom 을 ENTRYPOINT 로 추가 합 니 다.
  • Docker 미 러 구축
    다음 명령 을 실행 하여 Docker 미 러 구축:
    
    mvn package docker:build
    빌 드 완료 후 다음 명령 을 실행 합 니 다:
    
    sudo docker images
    결 과 는: 
    REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
    springio/docker              latest              7e2ba2f7e81e        2 minutes ago       195 MB
    frolvlad/alpine-oraclejdk8   slim                00d8610f052e        4 days ago          167 MB
    우리 가 구축 한 미 러 가 이미 나 타 났 음 을 볼 수 있 습 니 다.다음 단 계 는 이 미 러 를 실행 하 는 것 입 니 다.
    Docker 미 러 실행
    이전 빌 드 된 Docker 미 러 를 실행 하려 면 다음 명령 을 실행 하 십시오.
    
    sudo docker run -p 8080:8080 -t springio/docker
    
    만약 의외 의 사고 가 발생 하지 않 는 다 면,아래 의 출력 내용 을 볼 수 있 습 니 다.
    
     .  ____     _      __ _ _
     /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/ ___)| |_)| | | | | || (_| | ) ) ) )
     ' |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::    (v1.5.2.RELEASE)
    
    2017-03-08 03:34:59.434 INFO 6 --- [      main] o.m.springboot.DockerApplication     : Starting DockerApplication v0.0.1-SNAPSHOT on 00eed53e6928 with PID 6 (/app.jar started by root in /)
    2017-03-08 03:34:59.445 INFO 6 --- [      main] o.m.springboot.DockerApplication     : No active profile set, falling back to default profiles: default
    2017-03-08 03:34:59.752 INFO 6 --- [      main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4b9af9a9: startup date [Wed Mar 08 03:34:59 GMT 2017]; root of context hierarchy
    2017-03-08 03:35:03.755 INFO 6 --- [      main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
    2017-03-08 03:35:03.807 INFO 6 --- [      main] o.apache.catalina.core.StandardService  : Starting service Tomcat
    2017-03-08 03:35:03.821 INFO 6 --- [      main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.11
    2017-03-08 03:35:04.042 INFO 6 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]    : Initializing Spring embedded WebApplicationContext
    2017-03-08 03:35:04.043 INFO 6 --- [ost-startStop-1] o.s.web.context.ContextLoader      : Root WebApplicationContext: initialization completed in 4303 ms
    2017-03-08 03:35:04.441 INFO 6 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
    2017-03-08 03:35:04.455 INFO 6 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean  : Mapping filter: 'characterEncodingFilter' to: [/*]
    2017-03-08 03:35:04.457 INFO 6 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
    2017-03-08 03:35:04.468 INFO 6 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean  : Mapping filter: 'httpPutFormContentFilter' to: [/*]
    2017-03-08 03:35:04.468 INFO 6 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean  : Mapping filter: 'requestContextFilter' to: [/*]
    2017-03-08 03:35:05.110 INFO 6 --- [      main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4b9af9a9: startup date [Wed Mar 08 03:34:59 GMT 2017]; root of context hierarchy
    2017-03-08 03:35:05.390 INFO 6 --- [      main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String org.matrixstudio.springboot.DockerApplication.home()
    2017-03-08 03:35:05.402 INFO 6 --- [      main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    2017-03-08 03:35:05.404 INFO 6 --- [      main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2017-03-08 03:35:05.512 INFO 6 --- [      main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-03-08 03:35:05.512 INFO 6 --- [      main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-03-08 03:35:05.639 INFO 6 --- [      main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-03-08 03:35:06.019 INFO 6 --- [      main] o.s.j.e.a.AnnotationMBeanExporter    : Registering beans for JMX exposure on startup
    2017-03-08 03:35:06.168 INFO 6 --- [      main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
    2017-03-08 03:35:06.183 INFO 6 --- [      main] o.m.springboot.DockerApplication     : Started DockerApplication in 7.893 seconds (JVM running for 8.743)
    2017-03-08 03:35:56.728 INFO 6 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]    : Initializing Spring FrameworkServlet 'dispatcherServlet'
    2017-03-08 03:35:56.728 INFO 6 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet    : FrameworkServlet 'dispatcherServlet': initialization started
    2017-03-08 03:35:56.774 INFO 6 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet    : FrameworkServlet 'dispatcherServlet': initialization completed in 43 ms
    
    실행 중인 Docker 용 기 를 보 려 면 다음 명령 을 실행 하 십시오.
    
    sudo docker ps
    Docker 용기 가 실행 중인 것 을 볼 수 있 습 니 다.
    
     CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS       PORTS          NAMES
    00eed53e6928    springio/docker   "sh -c 'java $JAVA..."  About a minute ago  Up About a minute  0.0.0.0:8080->8080/tcp  fervent_leavitt
    현재 입력http://localhost:8080'Hello Docker World'결 과 를 볼 수 있 습 니 다.
    용 기 를 멈 추 려 면 다음 명령 을 실행 할 수 있 습 니 다.
    
    sudo docker stop 00e
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기