Opakowujemy aplikację Spring-boot w obraz Dockerowy

Potrzebuję opisać ten proces, ponieważ chcę w przyszłości trochę wiecej naprodukować wpisów o chmurze. Bardzo często będę w tych postach korzystał z aplikacji opartej o spring-boota, ponieważ jest to technologia w której czuje się najpewniej. 🙂

Zacznijmy od zbudowania zwykłej, prostej aplikacji za pomocą Spring Initializr. Na nasze aktualne potrzeby wystarczy nam dorzucić zależność Web, aby później sprawdzić czy rzeczywiście wszystko dobrze śmiga.

Pełny kod znajdziecie w repozytorium pod adresem https://github.com/mtszpater/Spring-boot-in-Docker

Stwórzmy jakiś prosty Controller i sprawdźmy, że rzeczywiście wszystko działa poprawnie.

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/hello")
    public String helloWorld(){
        return "Hello from HomeController!";
    }
}

Wejdźmy na stronę localhost:8080/hello.

Tworzenie obrazu Dockerowego

Przyda nam się najprostrzy przepis na nasz obraz tzw. Dockerfile. Wygląda on tak:

FROM openjdk:8-jre-alpine
VOLUME /tmp
COPY ./target/app.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Do uruchomienia naszej aplikacji potrzebujemy tak na prawdę tylko najprostsze openjdk oraz przekopiowanie tam naszego app.jar.

Aby przy budowaniu nasza aplikacja tworzyła plik o takiej nazwie w pom.xml w sekcji <build></build> musimy dodać linijkę:

		<finalName>app</finalName>

Teraz już z górki. Zbudujmy aplikację.

mvn clean install

Stwórzmy obraz dockerowy i nazwijmy go.

sudo docker build -t my-example-app .

Uruchamiamy go ustawiając porty wyjściowe, tak aby w momencie gdy wejdziemy u nas pod port 8080 nasz kontener wiedział, że dobijamy się do niego.

sudo docker run -p 8080:8080 my-example-app

Ponownie wejdźmy pod adres localhost:8080/hello. I sprawdźmy czy wszystko jest ok.

Repozytorium obrazów DockerHub

Oooogromna baza gotowych obrazów z których można skorzystać (co w sumie zrobiliśmy przy budowaniu Dockerfile gdy zaciągaliśmy obraz openjdk:8-jre-alpine.

Jeżeli w planach mamy skorzystanie z naszego obrazu w przyszłości – na serwerze, na innym komputerze to możemy nasz obraz też tam dorzucić. Repozytorium dockera jest w pełni darmowe (przynajmniej dla zwykłych śmiertelników). Nawet jest możliwość stworzenia prywatnego repozytorium. 🙂

Konwencja na DockerHubie jest taka, że o ile nie jesteśmy zaufaną organizacją (jak np. dostawcy openjdk) to musimy nasze obrazy tagować nasz_login/nazwa_obrazu:wersja – z czego wersja jest opcjonalna.

Zatem szybko przebudujmy nasz obraz i wypchnijmy go w świat.

sudo docker push mtszpater/my-example-app

I na końcu jesteśmy w domu: https://cloud.docker.com/repository/docker/mtszpater/my-example-app/general