#20 Spring Boot – szybki start z Dockerem

Jest to wpis dla osób, które chciałyby w szybki sposób uruchomić swoją aplikację Spring Boot’ową na Dockerze. Uruchamianie aplikacji na kontenerach ma wiele zalet, jedną z nich jest wspólne środowisko dla wszystkich developerów. Dzięki temu unikniemy “u mnie działa”. Jak uruchamiać aplikację na kontenerze? Odpowiedź we wpisie.

Na początek warto stworzyć sobie prostą aplikację z jednym endpointem. Przykładowa aplikacja na GitHubie.

Dockerfile

W naszym projekcie Spring Boot’owym tworzymy nowy plik Dockerfile. W tym pliku wpisujemy:

FROM openjdk:8-jre-alpine
ADD target/code-couple-docker.jar code-couple-docker.jar
EXPOSE 8081
ENTRYPOINT ["java", "-jar", "code-couple-docker.jar"]

gdzie:

  • FROM – wskazujemy obraz do budowy kontenera (minimalny system operacyjny z zależnościami)
  • EXPOSE – wskazujemy port, poprzez który będzie można komunikować się z kontenerem (port, który udostępnia kontener)
  • ADD – kopiujemy nasz plik do kontenera (kopiujemy naszą aplikację)
  • ENTRYPOINT – podajemy parametry do uruchomienia aplikacji (uruchamiamy jara)

Deprecated

W linii FROM wybrałem wersję open-jdk:8-jre-alpine, a nie java, ponieważ oficjalne repozytorium java jest deprecated:

JDK vs JRE

Jeśli zależy nam na optymalizacji naszych kontenerów powinniśmy zastanowić się, czy na pewno potrzebujemy całe JDK, czy samo JRE nie będzie wystarczające. W naszym przypadku JRE wystarczy.

Debian vs Alpine

Jak widzicie, wybrałem wersję 8-jre-alpine oznacza to, iż nasza wersja Javy będzie okrojona. Nie dostaniemy pakietów potrzebnych do między innymi JavyFX, czy VisualVM do monitoringu. Fragmenty, które zostały usunięte:

# Download and unarchive Java
RUN mkdir /opt && curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie"\
  http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz \
    | tar -xzf - -C /opt &&\
    ln -s /opt/jdk1.7.0_79 /opt/jdk &&\
    rm -rf /opt/jdk/*src.zip \
           /opt/jdk/lib/missioncontrol \
           /opt/jdk/lib/visualvm \
           /opt/jdk/lib/*javafx* \
           /opt/jdk/jre/lib/plugin.jar \
           /opt/jdk/jre/lib/ext/jfxrt.jar \
           /opt/jdk/jre/bin/javaws \
           /opt/jdk/jre/lib/javaws.jar \
           /opt/jdk/jre/lib/desktop \
           /opt/jdk/jre/plugin \
           /opt/jdk/jre/lib/deploy* \
           /opt/jdk/jre/lib/*javafx* \
           /opt/jdk/jre/lib/*jfx* \
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \
           /opt/jdk/jre/lib/amd64/libprism_*.so \
           /opt/jdk/jre/lib/amd64/libfxplugins.so \
           /opt/jdk/jre/lib/amd64/libglass.so \
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \
           /opt/jdk/jre/lib/amd64/libjavafx*.so \
           /opt/jdk/jre/lib/amd64/libjfx*.so \

Tworzymy obraz

Jeśli nie mamy jeszcze zainstalowanego Dockera można go pobrać tutaj https://www.docker.com/ i zainstalować według instrukcji. Następnie uruchamiamy Dockera, i wpisujemy kilka poleceń:

docker build -f Dockerfile -t code-couple-docker:latest .

gdzie:

  • -f wskazujemy nasz plik Dockerfile – domyślnie szukany jest w aktualnej lokalizacji
  • -t podajemy tag do naszego obrazu – domyślnie dodawane jest latest

Zbudowany obraz możemy uruchomić poleceniem:

docker run -p 8081:8081 code-couple-docker

gdzie:

  • -p oznacza mapowanie portów, mapujemy port 8081 (zdefiniowany w application.properties naszej aplikacji) z naszego kontenera na port 8081 na naszej maszynie

Teraz możemy korzystać z naszej aplikacji na porcie 8081.

Więcej

Oczywiście opisałem tutaj najbardziej rzemieślniczy sposób uruchamiania aplikacji na środowisku kontenerów, jednakże chciałem, aby był to artykuł dla osób początkujących z Dockerem. W następnych wpisach pokażę jak zautomatyzować ten proces. Pojawią się też wpisy o Docker Cloud. Cały projekt jak zawsze na GitHubie.