Przygotowanie obrazu Docker z aplikacją Java do wysłania na hub.docker.com

Wstęp

Zawarte w tym artykule informacje bazują na poprzednich wpisach:

Zbudowanie lokalnego obrazu docker

W katalogu np. /home/dockeruser/java/javawritemariadbexample/ gdzie mamy wszystkie potrzebne do działania aplikacji pliki tworzymy plik Dockerfile o zawartości

FROM openjdk:11
COPY JavaWriteMariadbExampleApp.jar /opt
COPY mariadb-java-client-3.1.2.jar /opt
ENV TZ="Europe/Warsaw"
ENV JAVA_OPTS=""
ENV APP_OPTIONS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /opt/JavaWriteMariadbExampleApp.jar $APP_OPTIONS" ]

i budujemy lokalnie nasz obraz Dockera aplikacji w Java na podstawie obrazu Dockera openjdk:11 pobranego z hub.docker.com

# obraz będzie się nazywał java-write-mariadb-img i miał umowną wersję 1.0
docker build -t java-write-mariadb-img:1.0 .

Sprawdzamy czy obraz jest w lokalnym repozytorium obrazów Docker.

docker images

REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
java-write-mariadb-img               1.0       85581b4b540b   45 seconds ago   655MB

Uruchomienie kontenera z aplikacją na podstawie lokalnego obrazu Docker

Uruchamiamy nowy kontener java-write-mariadb-app na podstawie lokalnego obrazu dockera java-write-mariadb-img:1.0 podając w z linii komend zmienne środowiskowe. Jeśli ich nie podamy kontener po prostu się zatrzyma po starcie gdyż nie będzie miał zmiennych potrzebnych do połączenia z serwerem bazy danych MariaDB.

docker run -d --name java-write-mariadb-app \
-e CF_MARIADB_SERVER=192.168.30.40 \
-e CF_MARIADB_DATABASE=docker_dba \
-e CF_MARIADB_USER=docker_usr \
-e CF_MARIADB_PASS=Hdbryu3te72, \
-e CF_INSERT_INTERVAL=15 \
java-write-mariadb-img:1.0

Sprawdzamy czy kontener jest uruchomiony

docker ps | grep java-write-mariadb-app
6e1b317ff194   java-write-mariadb-img:1.0   "sh -c 'java $JAVA_O…"   4 minutes ago   Up 4 minute java-write-mariadb-app

oraz jak działa aplikacja Java w jego wnętrzu. Jak widać wszystko jest w porządku i nasza aplikacja wstawia co 15 sekund (zmienna CF_INSERT_INTERVAL) nowy rekord do bazy danych MariaDB.

docker logs -f java-write-mariadb-app

-------------------- 26 -------------------------
Current datetime:2023-06-29 17:23:21
description:Java jest najczęściej używana w backendowych systemach aplikacji internetowych
rand_number:88368
operation_status:0
A new row has been inserted successfully.

Usunięcie kontenera aplikacji i obrazu Docker aplikacji z systemu

# zatrzymujemy i usuwmamy kontener
docker stop java-write-mariadb-app
docker rm java-write-mariadb-app

# sprawdzamy id obrazu np. 85581b4b540b
docker images
REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
java-write-mariadb-img               1.0       85581b4b540b   12 minutes ago   655MB

# usuwamy obraz na podstawie id np. 85581b4b540b
docker image rm 85581b4b540b
Untagged: java-write-mariadb-img:1.0
Deleted: sha256:85581b4b540bfd5810a0e6ce249089089c00db4a245c53e3ca584d257f4f666f

Wysłanie obrazu Docker do repozytorium hub.docker.com

Dodanie tagu do naszego obrazu

# sprawdzamy image id naszego lokalnego obrazu
docker images
REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
java-write-mariadb-img               1.0       85581b4b540b   18 minutes ago   655MB

# dodajemy nowy tag do obrazu 85581b4b540b o nazwie zibidockers/java-write-mariadb:1.0
# gdzie zibidockers to nazwa użytkownika hub.dockers.com a java-write-mariadb:1.0 to nazwa i umowna wersja
docker tag 85581b4b540b zibidockers/java-write-mariadb:1.0

# w naszym repozytorium pojawi się nowy obraz, który za chwilę wyślemy do hub.docker.com
docker images
REPOSITORY                           TAG       IMAGE ID       CREATED          SIZE
java-write-mariadb-img               1.0       85581b4b540b   23 minutes ago   655MB
zibidockers/java-write-mariadb       1.0       85581b4b540b   23 minutes ago   655MB

Logowanie do hub.docker.com

Wcześniej należy założyć konto na stronie Docker Hub Container Image Library | App Containerization

docker login -u zibidockers -p xxxxxxxxxx

# sprawdzamy ile zostało nam limitu dziennego na wysyłanie / pobranie obrazów Docker
TOKEN=$(curl --user 'zibidockers:xxxxxxxxxx' "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest

HTTP/1.1 200 OK
content-length: 2782
content-type: application/vnd.docker.distribution.manifest.v1+prettyjws
docker-content-digest: sha256:767a3811223231242142121323233229e0e2020
docker-distribution-api-version: registry/2.0
etag: "sha256:767a387a3811223231242142121323233229e0e20e2020"
date: Thu, 29 Jun 2023 15:29:34 GMT
strict-transport-security: max-age=31536000
ratelimit-limit: 200;w=21600
ratelimit-remaining: 199;w=21600
docker-ratelimit-source: 5qwqw3-caaa-4wq8-9sas7b-8a96sdsae1cc

# jak widać ratelimit-remaining wynosi obecnie 199 z 200

Wysłanie naszego obrazu Docker do hub.docker.com

docker push zibidockers/java-write-mariadb:1.0

The push refers to repository [docker.io/zibidockers/java-write-mariadb]
ff99664ff98c: Pushed
313a60cf3e49: Pushed
7b7f3078e1db: Mounted from library/openjdk
826c3ddbb29c: Mounted from library/openjdk
b626401ef603: Mounted from library/openjdk
9b55156abf26: Mounted from library/openjdk
293d5db30c9f: Mounted from library/openjdk
03127cdb479b: Mounted from library/openjdk
9c742cd6c7a5: Mounted from library/openjdk
1.0: digest: sha256:8bf7c22922a0dasdasdasdsdsawewewqe67fd16c5e03a size: 2213

Weryfikacja poprawności wysłanego do hub.docker.com obrazu Docker

Logujemy się na stronie https://hub.docker.com/ i sprawdzamy czy powstało nowe repozytorium.

Weryfikacja z wiersza poleceń.

# po zalogowaniu do hub.docker.com z konsoli

docker search zibidockers

NAME                             DESCRIPTION         STARS     OFFICIAL   AUTOMATED
zibidockers/mymariadb                                0
zibidockers/node-panjabu         test node-panjabu   0
zibidockers/java-write-mariadb                       0

Archiwizowanie i odtwarzanie lokalnego obrazu Docker

# zapis lokalnego obrazu zibidockers/java-write-mariadb:1.0 do pliku archiwum java-write-mariadb_1.0.tar
docker save zibidockers/java-write-mariadb:1.0 > java-write-mariadb_1.0.tar

# po usunięciu lokalnego obrazu zibidockers/java-write-mariadb:1.0
# można go łatwo przywrócić bez ponownego ściągania z hub.docker.com
docker load --input java-write-mariadb_1.0.tar

Uruchomienie kontenera z aplikacją na podstawie obrazu z hub.docker.com

docker run -d --name java-write-mariadb-app \
-e CF_MARIADB_SERVER=192.168.30.40 \ 
-e CF_MARIADB_DATABASE=docker_dba \
-e CF_MARIADB_USER=docker_usr \
-e CF_MARIADB_PASS=Hdbryu3te72, \
-e CF_INSERT_INTERVAL=15 \
zibidockers/java-write-mariadb:1.0

Strona z obrazem Docker https://hub.docker.com/repository/docker/zibidockers/java-write-mariadb/general