En Docker-guide til Java

1. Oversigt

I denne artikel ser vi på en anden veletableret platformsspecifik API - Java API-klient til Docker.

Gennem hele artiklen forstår vi, hvordan du opretter forbindelse til en kørende Docker-dæmon, og hvilken type vigtig funktionalitet API tilbyder Java-udviklere.

2. Maven-afhængighed

Først skal vi tilføje den vigtigste afhængighed i vores pom.xml fil:

 com.github.docker-java docker-java 3.0.14 

På tidspunktet for artiklens skrivning den seneste version af API'en er 3.0.14. Hver udgivelse kan ses enten fra GitHub-udgivelsessiden eller fra Maven-arkivet.

3. Brug af Docker-klienten

DockerClient er, hvor vi kan etablere en forbindelse mellem en Docker-motor / dæmon og vores applikation.

Som standard kan Docker-dæmonen kun være tilgængelig på unix: ///var/run/docker.sock fil. Vi kan kommunikere lokalt med Docker-motoren lytter til Unix-stikket, medmindre andet er konfigureret.

Her gælder vi for DockerClientBuilder klasse for at oprette en forbindelse ved at acceptere standardindstillingerne:

DockerClient dockerClient = DockerClientBuilder.getInstance (). Build ();

På samme måde kan vi åbne en forbindelse i to trin:

DefaultDockerClientConfig.Builder config = DefaultDockerClientConfig.createDefaultConfigBuilder (); DockerClient dockerClient = DockerClientBuilder .getInstance (config) .build ();

Da motorer kunne stole på andre egenskaber, kan klienten også konfigureres med forskellige forhold.

For eksempel accepterer bygherren en server-URL, det vil sige vi kan opdatere forbindelsesværdien, hvis motoren er tilgængelig på port 2375:

DockerClient dockerClient = DockerClientBuilder.getInstance ("tcp: //docker.baeldung.com: 2375") .build ();

Bemærk, at vi er nødt til at sætte pris på forbindelsesstrengen med unix: // eller tcp: // afhængigt af forbindelsestypen.

Hvis vi går et skridt videre, kan vi ende med en mere avanceret konfiguration ved hjælp af DefaultDockerClientConfig klasse:

DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withRegistryEmail ("[email protected]") .withRegistryPassword ("baeldung") .withRegistryUsername ("baeldung") .withDockerCertPath ("/ home / / / / / / / / / / / /. "/home/baeldung/.docker/") .withDockerTlsVerify ("1") .withDockerHost ("tcp: //docker.baeldung.com: 2376") .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

På samme måde kan vi udføre den samme tilgang ved hjælp af Ejendomme:

Egenskaber egenskaber = nye egenskaber (); properties.setProperty ("registry.email", "[email protected]"); properties.setProperty ("registry.password", "baeldung"); properties.setProperty ("registry.username", "baaldung"); properties.setProperty ("DOCKER_CERT_PATH", "/home/baeldung/.docker/certs"); egenskaber.setProperty ("DOCKER_CONFIG", "/home/baeldung/.docker/"); properties.setProperty ("DOCKER_TLS_VERIFY", "1"); properties.setProperty ("DOCKER_HOST", "tcp: //docker.baeldung.com: 2376"); DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withProperties (egenskaber) .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

Et andet valg, medmindre vi konfigurerer motorens indstillinger i kildekoden, er at indstille tilsvarende miljøvariabler, så vi kun kan overveje standard instantiering af DockerClient i projektet:

eksport DOCKER_CERT_PATH = / home / baeldung / .docker / certs eksport DOCKER_CONFIG = / home / baeldung / .docker / export DOCKER_TLS_VERIFY = 1 eksport DOCKER_HOST = tcp: //docker.baeldung.com: 2376

4. Containerstyring

API'en giver os en række valg omkring containeradministration. Lad os se på hver enkelt af dem.

4.1. Liste containere

Nu hvor vi har en etableret forbindelse, kan vi liste alle kørende containere på Docker-værten:

Listebeholdere = dockerClient.listContainersCmd (). Exec ();

Forudsat at visning af kørende containere ikke appellerer til behovet, kan vi gøre brug af de tilbudte muligheder for at forespørge containere.

I dette tilfælde viser vi containere med statusen "forladt":

Listebeholdere = dockerClient.listContainersCmd () .withShowSize (true) .withShowAll (true) .withStatusFilter ("exited"). Exec ()

Det svarer til:

$ docker ps -a -s -f status = forladt # eller $ docker container ls -a -s -f status = forladt

4.2. Opret en container

Oprettelse af en container serveres med createContainerCmd metode. Vi kan erklære en mere kompleks erklæring ved brug afde tilgængelige metoder startende med “med" præfiks.

Lad os antage, at vi har en dockerskab kommando, der definerer en værtsafhængig MongoDB-container, der lytter internt i port 27017:

$ docker oprette --name mongo \ --hostname = baeldung \ -e MONGO_LATEST_VERSION = 3.6 \ -p 9999: 27017 \ -v / Brugere / baeldung / mongo / data / db: / data / db \ mongo: 3.6 --bind_ip_all

Vi er i stand til at starte den samme container sammen med dens konfigurationer programmatisk:

CreateContainerResponse container = dockerClient.createContainerCmd ("mongo: 3.6") .withCmd ("- bind_ip_all") .withName ("mongo") .withHostName ("baeldung") .withEnv ("MONGO_LATEST_VERSION = 3.6") .ind. parse ("9999: 27017")) .withBinds (Bind.parse ("/ Brugere / baeldung / mongo / data / db: / data / db")). exec ();

4.3. Start, stop og dræb en container

Når vi har oprettet containeren, kan vi starte, stoppe og dræbe den med henholdsvis navn eller id:

dockerClient.startContainerCmd (container.getId ()). exec (); dockerClient.stopContainerCmd (container.getId ()). exec (); dockerClient.killContainerCmd (container.getId ()). exec ();

4.4. Undersøg en beholder

Det inspicereContainerCmd metoden tager en Snor argument, der angiver navnet på eller containeren. Ved hjælp af denne metode kan vi observere metadataene til en container direkte:

InspectContainerResponse container = dockerClient.inspectContainerCmd (container.getId ()). Exec ();

4.5. Snapshot en beholder

Svarende til docker begå kommando, kan vi oprette et nyt billede ved hjælp af commitCmd metode.

I vores eksempel er scenariet, vi kører tidligere en alpine: 3.6 container, hvis id er “3464bb547f88” og installeret git Oven på det.

Nu vil vi oprette et nyt billede-snapshot fra containeren:

String snapshotId = dockerClient.commitCmd ("3464bb547f88") .withAuthor ("Baeldung <[email protected]>") .withEnv ("SNAPSHOT_YEAR = 2018") .withMessage ("add git support") .withCmd ("git", " version ") .withRepository (" alpine ") .withTag (" 3.6.git "). exec ();

Siden vores nye billede leveres sammen med git forbliver på værten, kan vi søge på den på Docker-værten:

$ docker image ls alpine --format "table {{.Repository}} {{.Tag}}" REPOSITORY TAG alpine 3.6.git

5. Billedhåndtering

Der er et par relevante kommandoer, vi får til at styre billedoperationer.

5.1. Liste over billeder

For at liste alle tilgængelige billeder inklusive dinglende billeder på Docker-værten skal vi anvende til listImagesCmd metode:

Listebilleder = dockerClient.listImagesCmd (). Exec ();

Hvis vi har to billeder på vores Docker-vært, vi skulle få det Billede genstande af dem i løbetid. De billeder, vi ser efter, er:

$ docker image ls --format "tabel {{.Repository}} {{.Tag}}" REPOSITORY TAG alpine 3.6 mongo 3.6

Ved siden af ​​dette skal vi for at se de mellemliggende billeder udtrykkeligt anmode om det:

Listebilleder = dockerClient.listImagesCmd () .withShowAll (true) .exec ();

Hvis det kun er tilfældet at vise de hængende billeder, er medDanglingFilter metoden skal overvejes:

Listebilleder = dockerClient.listImagesCmd () .withDanglingFilter (true) .exec ();

5.2. Byg et billede

Lad os fokusere på måden at opbygge et billede ved hjælp af API. Det buildImageCmd metode bygger Docker-billeder fra en Dockerfil. I vores projekt har vi allerede en Dockerfile, der giver et alpint billede med git installeret:

FRA alpine: 3.6 KØR apk - opdater tilføj git openssh && \ rm -rf / var / lib / apt / lists / * && \ rm / var / cache / apk / * ENTRYPOINT ["git"] CMD ["--hjælp "]

Det nye billede bygges uden brug af cache, og inden byggeprocessen startes, vil Docker-motoren under alle omstændigheder forsøge at trække den nyere version af alpine: 3.6. Hvis alt går godt, skal vi til sidst se billedet med det givne navn,alpine: git:

String imageId = dockerClient.buildImageCmd () .withDockerfile (ny fil ("sti / til / Dockerfile")) .withPull (true) .withNoCache (true) .withTag ("alpine: git") .exec (ny BuildImageResultCallback ()) .awaitImageId ();

5.3. Undersøg et billede

Vi kan inspicere oplysningerne på lavt niveau om et billede takket være inspectImageCmd metode:

InspectImageResponse image = dockerClient.inspectImageCmd ("161714540c41"). Exec ();

5.4. Tag et billede

Tilføjelse af et tag til vores billede er ret simpelt ved hjælp af dockertag kommando, så API'en er ingen undtagelse. Vi kan udføre den samme hensigt med tagImageCmd metode også. At tagge et Docker-billede med id 161714540c41 ind i baeldung / alpin repository med git:

Streng imageId = "161714540c41"; String repository = "baeldung / alpine"; String tag = "git"; dockerClient.tagImageCmd (imageId, lager, tag) .exec ();

Vi vil liste det nyoprettede billede, og der er det:

$ docker image ls --format "tabel {{.Repository}} {{.Tag}}" REPOSITORY TAG baeldung / alpine git

5.5. Skub et billede

Inden du sender et billede til en registreringsdatabasetjeneste, skal dockerklienten være konfigureret til at samarbejde med tjenesten, fordi arbejde med registre skal godkendes på forhånd.

Da vi antager, at klienten var konfigureret med Docker Hub, kan vi skubbe på baeldung / alpine billede til baeldung DockerHub-kontoen:

dockerClient.pushImageCmd ("baeldung / alpine") .withTag ("git") .exec (ny PushImageResultCallback ()) .awaitCompletion (90, TimeUnit.SECONDS);

Vi skal overholde varigheden af ​​processen. I eksemplet vi venter 90 sekunder.

5.6. Træk et billede

For at downloade billeder fra registreringsdatabasetjenester bruger vi pullImageCmd metode. Derudover, hvis billedet trækkes fra et privat register, skal klienten kende vores legitimationsoplysninger, ellers ender processen med en fejl. Samme som at trække et billede, vi angiver et tilbagekald sammen med en fast periode for at trække et billede:

dockerClient.pullImageCmd ("baeldung / alpine") .withTag ("git") .exec (ny PullImageResultCallback ()) .awaitCompletion (30, TimeUnit.SECONDS);

For at kontrollere, om det nævnte billede findes på Docker-værten efter at have trukket det:

$ docker-billeder baeldung / alpine --format "tabel {{.Repository}} {{.Tag}}" REPOSITORY TAG baeldung / alpine git

5.7. Fjern et billede

En anden simpel funktion blandt resten er removeImageCmd metode. Vi kan fjerne et billede med dets korte eller lange ID:

dockerClient.removeImageCmd ("beaccc8687ae"). exec ();

5.8. Søg i registreringsdatabasen

For at søge et billede fra Docker Hub kommer klienten med searchImagesCmd metode, der tager en strengværdi, der angiver et udtryk. Her udforsker vi billeder relateret til et navn, der indeholder 'Java ' i Docker Hub:

Listeelementer = dockerClient.searchImagesCmd ("Java"). Exec ();

Outputtet returnerer de første 25 relaterede billeder i en liste over Søgepunkt genstande.

6. Volumenstyring

Hvis Java-projekter har brug for at interagere med Docker for mængder, skal vi også tage dette afsnit i betragtning. Kort sagt ser vi på de grundlæggende teknikker til volumener, der leveres af Docker Java API.

6.1. Liste over volumener

Alle tilgængelige mængder inklusive navngivne og ikke navngivne er angivet med:

ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd (). Exec (); Listevolumener = volumesResponse.getVolumes ();

6.2. Undersøg en lydstyrke

Det inspectVolumeCmd metoden er formularen til at vise de detaljerede oplysninger om et bind. Vi inspicerer lydstyrken ved at specificere dens korte id:

InspectVolumeResponse volume = dockerClient.inspectVolumeCmd ("0220b87330af5"). Exec ();

6.3. Opret en lydstyrke

API'en har to forskellige muligheder for at oprette en lydstyrke. Ikke-arg createVolumeCmd metoden opretter et volumen, hvor navnet er givet af Docker:

CreateVolumeResponse unnamedVolume = dockerClient.createVolumeCmd (). Exec ();

I stedet for at bruge standardadfærden kaldes hjælpemetoden med navn lader os indstille et navn til et volumen:

CreateVolumeResponse med navnet Volume = dockerClient.createVolumeCmd (). Med navn ("myNamedVolume"). Exec ();

6.4. Fjern en lydstyrke

Vi kan intuitivt slette en lydstyrke fra Docker-værten ved hjælp af removeVolumeCmd metode. Hvad er vigtigt at bemærke, at vi ikke kan slette en lydstyrke, hvis den er i brug fra en container. Vi fjerner lydstyrken, myNamedVolumefra volumenlisten:

dockerClient.removeVolumeCmd ("myNamedVolume"). exec ();

7. Netværksadministration

Vores sidste afsnit handler om styring af netværksopgaver med API.

7.1. Liste netværk

Vi kan vise listen over netværksenheder med en af ​​de konventionelle API-metoder, der starter med liste:

Liste netværk = dockerClient.listNetworksCmd (). Exec ();

7.2. Opret et netværk

Ækvivalent til docker-netværk oprettes kommando udføres med createNetworkCmd metode. Hvis vi har en tredive part eller en brugerdefineret netværksdriver, bliver med kører metode kan acceptere dem udover de indbyggede drivere. Lad os i vores tilfælde oprette et bronetværk, hvis navn er baeldung:

CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd () .withName ("baeldung") .withDriver ("bridge"). Exec ();

Desuden løser problemet ikke at oprette en netværksenhed med standardindstillingerne, vi kan ansøge om andre hjælpermetoder til at konstruere et avanceret netværk. Dermed, for at tilsidesætte standardundernettet med en brugerdefineret værdi:

CreateNetworkResponse networkResponse = dockerClient.createNetworkCmd () .withName ("baeldung") .withIpam (new Ipam () .withConfig (new Config () .withSubnet ("172.36.0.0/16"). WithIpRange ("172.36.5.0/24) )) .withDriver ("bro"). exec ();

Den samme kommando kan vi køre med docker kommando er:

$ docker-netværk opretter \ --subnet = 172.36.0.0 / 16 \ --ip-range = 172.36.5.0 / 24 \ baeldung

7.3. Undersøg et netværk

Visning af detaljer på et lavt niveau i et netværk er også omfattet af API:

Netværksnetværk = dockerClient.inspectNetworkCmd (). MedNetworkId ("baeldung"). Exec ();

7.4. Fjern et netværk

Vi kan sikkert fjerne en netværksenhed med dens navn eller id ved hjælp af fjern NetværkCmd metode:

dockerClient.removeNetworkCmd ("baeldung"). exec ();

8. Konklusion

I denne omfattende tutorial undersøgte vi de forskellige forskellige funktioner i Java Docker API-klientsammen med flere implementeringsmetoder til implementerings- og styringsscenarier.

Alle eksemplerne illustreret i denne artikel kan findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found