Table of Content
Docker and Spring boot Application
This blog details the steps taken to add docker support to a spring boot application written in java.
This blog is developed with
- Java 11
- Docker 19.03.5
- Spring Boot 1.5.9
- Maven
The spring boot application is a simple application to read all the links from a target URL and rendering the links.
Code Structure
SpringBootLinkApplication.java
@ComponentScan({"com.bootng"}) @SpringBootApplicationpublic class SpringBootLinkApplication { private static final Logger log = LoggerFactory.getLogger(SpringBootLinkApplication.class); public static void main(String args[]) { log.debug("about to call SpringBootLinkApplication.run()"); SpringApplication.run(SpringBootLinkApplication.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { log.info("Let's inspect the beans provided by Spring Boot:");String[] beanNames = ctx.getBeanDefinitionNames();Arrays.sort(beanNames); for (String beanName: beanNames) { log.info(beanName); } }; } }
LinkController.java
@Controllerpublic class LinkController { private static final Logger log = LoggerFactory.getLogger(SpringBootLinkApplication.class); @Autowired BlogService blogService; @RequestMapping(value = { "/" }, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Object getHome() { log.info("inside getHome "); return "GoTo \\links to see all the links \n"; } @RequestMapping(value = { "/links" }, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Object getHeadLines() { log.info("inside blog GET getHeadLines method"); String sourceLink = "http://www.bootng.com"; List < String > links = blogService.getAllLinks(sourceLink); StringBuilder result = new StringBuilder(); for (String link: links) { result.append(link).append("\n"); } return "Links scanned from bootng.com \n" + result; } public @ResponseBody Object getHeadLines(@RequestParam String sourceLink) { log.info("inside blog GET getHeadLines method"); List < String > links = blogService.getAllLinks(sourceLink); StringBuilder result = new StringBuilder(); for (String link: links) { result.append(link).append("\n"); } return "Links scanned from specified url \n" + result; } @RequestMapping(value = { "/test" }, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Object isSerivceUp() { log.info("inside blog GET method"); return "Service is Running Fine"; } }
BlogLinkService.java
@Servicepublic class BlogLinkService { public List < String > getAllLinks(String url) { List < String > result = new ArrayList < String > (); Document doc; try { doc = Jsoup.connect(url).get(); Elements links = doc.select("a[href]"); for (Element link: links) { result.add(String.format(" %s : %s", link.attr("abs:href"), link.text())); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return result; }}
The above files are part of the main Java Classes for the Springboot application. Which defines the Application, Controller, and Service Class. Now we will add docker support to it. For that we need to add a file with name "DockerFile" to the repository as follows.
DockerFile
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.war #cd /usr/local/workspace WORKDIR /usr/local/workspace COPY ${JAR_FILE} app.jar # java -jar /usr/local/workspace/app.jar ENTRYPOINT ["java","-jar","app.jar"]
Building Docker Image
Build Project and Build Docker Image
Following commands will first build our Spring Boot application generate a war file, and then build the docker image containing the war file
mvn install docker build . -t springboot_docker Sending build context to Docker daemon 43.16MB Step 1/5 : FROM openjdk:8-jdk-alpine ---> a3562aa0b991 Step 2/5 : ARG JAR_FILE=target/*.war ---> Using cache ---> e637fbb1ac39 Step 3/5 : WORKDIR /usr/local/workspace ---> Using cache ---> daa4b4a89727 Step 4/5 : COPY ${JAR_FILE} app.jar ---> Using cache ---> bd3788117296 Step 5/5 : ENTRYPOINT ["java","-jar","app.jar"] ---> Using cache ---> 118546685007 Successfully built 118546685007 Successfully tagged springboot_docker:latest
Execute the SpringBoot application inside the docker image with tag "springboot_docker"
Previous step we build the docker image containing our Spring boot applicaiton and tagged the docker image with tag "springboot_docker". To run the dockerized application run the following command.
docker run -p 8080:8080 springboot_docker . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.9.RELEASE) INFO main c.b.SpringBootLinkApplication:57 - Started SpringBootLinkApplication in 4.813 seconds
Access the Application
Since the Spring boot web application is running on port 8080, open a browser and go to http://localhost:8080/links?sourceLink=http://bootng.com. It should print links somewhat like bellow
Links scanned from bootng.com https://www.bootng.com/search/label/spring-boot?max-results=3 : spring-boot https://www.bootng.com/search/label/gcp?max-results=3 : GCP https://www.bootng.com/search/label/angular?max-results=3 : Angular https://www.bootng.com/search/label/Agile?max-results=3 : Agile https://www.bootng.com/search/label/Java?max-results=3 : Java https://www.bootng.com/search/label/Java?max-results=3 : Links
Download Source code Repo
- git clone https://github.com/bootng/springboot\_docker.git
- cd springboot_docker
- mvn install
- docker build . - t springboot_docker
- docker run -p 8080:8080 springboot_docker
Top comments (0)