├── .gitignore ├── LICENSE ├── README.md ├── app ├── .gitignore ├── Dockerfile ├── LICENSE ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── hellokoding │ │ └── springboot │ │ ├── IndexController.java │ │ └── WebApplication.java │ └── resources │ ├── application.properties │ ├── static │ ├── css │ │ └── main.css │ └── js │ │ └── main.js │ └── templates │ └── index.ftl ├── docker-compose.yaml └── nginx └── conf.d └── app.conf /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | target 3 | *.iml 4 | out 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Hello Koding 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Dockerize Spring Boot application](https://hellokoding.com/docker-compose-with-spring-boot-nginx/) 2 | 3 | ## What you'll build 4 | - A simple Spring Boot application running behind NGINX and inside docker containers 5 | 6 | ## What you'll need 7 | - Docker CE 8 | 9 | ## Stack 10 | - Docker 11 | - Java 12 | - Spring Boot 13 | - NGINX 14 | - Maven 15 | 16 | ## Run 17 | - Run command `docker-compose up` 18 | - Access to http://localhost/ 19 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | target 3 | *.iml 4 | out 5 | .DS_Store 6 | -------------------------------------------------------------------------------- /app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.5-jdk-8 2 | -------------------------------------------------------------------------------- /app/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Hello Koding 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | com.hellokoding 5 | docker-springboot 6 | docker-springboot 7 | 8 | org.springframework.boot 9 | spring-boot-starter-parent 10 | 1.5.8.RELEASE 11 | 12 | 13 | 14 | 1.7 15 | 16 | 17 | 18 | 19 | org.springframework.boot 20 | spring-boot-starter-freemarker 21 | 22 | 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-maven-plugin 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/hellokoding/springboot/IndexController.java: -------------------------------------------------------------------------------- 1 | package com.hellokoding.springboot; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.ui.Model; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestParam; 7 | 8 | @Controller 9 | public class IndexController { 10 | @GetMapping("/") 11 | public String index() { 12 | return "index"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/hellokoding/springboot/WebApplication.java: -------------------------------------------------------------------------------- 1 | package com.hellokoding.springboot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class WebApplication { 8 | public static void main(String[] args) throws Exception { 9 | SpringApplication.run(WebApplication.class, args); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.freemarker.template-loader-path: classpath:/templates 2 | spring.freemarker.suffix: .ftl -------------------------------------------------------------------------------- /app/src/main/resources/static/css/main.css: -------------------------------------------------------------------------------- 1 | .hello-title{ 2 | color: darkgreen; 3 | } -------------------------------------------------------------------------------- /app/src/main/resources/static/js/main.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | console.log("Hello World!"); 3 | })(); -------------------------------------------------------------------------------- /app/src/main/resources/templates/index.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Hello Docker and Spring Boot! 6 | 7 | 8 |

Hello Docker and Spring Boot!

9 | 10 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | nginx: 4 | container_name: some-nginx 5 | image: nginx:1.13 6 | restart: always 7 | ports: 8 | - 80:80 9 | - 443:443 10 | volumes: 11 | - ./nginx/conf.d:/etc/nginx/conf.d 12 | depends_on: 13 | - app 14 | 15 | app: 16 | restart: always 17 | build: ./app 18 | working_dir: /app 19 | volumes: 20 | - ./app:/app 21 | expose: 22 | - "8080" 23 | command: mvn clean spring-boot:run 24 | -------------------------------------------------------------------------------- /nginx/conf.d/app.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | charset utf-8; 4 | access_log off; 5 | 6 | location / { 7 | proxy_pass http://app:8080; 8 | proxy_set_header Host $host:$server_port; 9 | proxy_set_header X-Forwarded-Host $server_name; 10 | proxy_set_header X-Real-IP $remote_addr; 11 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 | } 13 | 14 | location /static { 15 | access_log off; 16 | expires 30d; 17 | 18 | alias /app/static; 19 | } 20 | } 21 | --------------------------------------------------------------------------------