En Docker-guide for Java

1. Oversikt

I denne artikkelen ser vi på en annen veletablert plattformsspesifikk API - Java API Client for Docker.

Gjennom artikkelen forstår vi måten å koble til en Docker-demon som kjører, og hvilken type viktig funksjonalitet API tilbyr Java-utviklere.

2. Maven avhengighet

Først må vi legge til hovedavhengigheten i vår pom.xml fil:

 com.github.docker-java docker-java 3.0.14 

Da artikkelen ble skrevet, den siste versjonen av API er 3.0.14. Hver utgivelse kan sees enten fra GitHub-utgivelsessiden eller fra Maven-arkivet.

3. Bruke Docker-klienten

DockerClient er der vi kan etablere en forbindelse mellom en Docker-motor / demon og applikasjonen vår.

Som standard kan Docker-demonen bare være tilgjengelig på unix: ///var/run/docker.sock fil. Vi kan kommunisere lokalt med Docker-motoren lytter på Unix-kontakten med mindre annet er konfigurert.

Her gjelder vi for DockerClientBuilder klasse for å opprette en forbindelse ved å godta standardinnstillingene:

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

På samme måte kan vi åpne en forbindelse i to trinn:

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

Siden motorer kan stole på andre egenskaper, kan klienten også konfigureres med forskjellige forhold.

For eksempel godtar byggherren en server-URL, det vil si vi kan oppdatere tilkoblingsverdien hvis motoren er tilgjengelig på port 2375:

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

Legg merke til at vi trenger å være avhengig av tilkoblingsstrengen med unix: // eller tcp: // avhengig av tilkoblingstype.

Hvis vi går et skritt videre, kan vi ende opp med en mer avansert konfigurasjon ved hjelp av DefaultDockerClientConfig klasse:

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

På samme måte kan vi utføre den samme tilnærmingen ved hjelp av Eiendommer:

Egenskaper egenskaper = nye egenskaper (); 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"); properties.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 (egenskaper) .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

Et annet valg med mindre vi konfigurerer motorens innstillinger i kildekoden, er å angi tilsvarende miljøvariabler slik at vi bare kan vurdere standard instantiering av DockerClient i prosjektet:

eksporter 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. Beholderstyring

API-et gir oss en rekke valg om containeradministrasjon. La oss se på hver enkelt av dem.

4.1. Listebeholdere

Nå som vi har en etablert forbindelse, kan vi liste alle kjørende containere som ligger på Docker-verten:

Liste containere = dockerClient.listContainersCmd (). Exec ();

Forutsatt at det ikke appellerer til behovet for å vise de kjørende containerne, kan vi bruke de tilbudte alternativene for å spørre containere.

I dette tilfellet viser vi containere med statusen "avsluttet":

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

Det tilsvarer:

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

4.2. Lag en beholder

Å lage en container serveres med createContainerCmd metode. Vi kan erklære mer komplisert erklæring ved hjelp avtilgjengelige metoder som begynner medmed" prefiks.

La oss anta at vi har en dockerskape kommando som definerer en vertsavhengig MongoDB-container som lytter internt på port 27017:

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

Vi er i stand til å starte den samme beholderen sammen med konfigurasjonene programmatisk:

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

4.3. Start, stopp og drep en container

Når vi har opprettet containeren, kan vi starte, stoppe og drepe den med henholdsvis navn eller id:

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

4.4. Inspiser en beholder

De inspectContainerCmd metoden tar en String argument som indikerer navnet eller iden til en container. Ved hjelp av denne metoden kan vi observere metadataene til en container direkte:

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

4.5. Snapshot a Container

I likhet med docker begå kommandoen, kan vi lage et nytt bilde ved hjelp av commitCmd metode.

I vårt eksempel er scenariet, vi har tidligere kjørt en alpin: 3.6 container hvis id er “3464bb547f88” og installert git på toppen av det.

Nå ønsker vi å lage et nytt bilde øyeblikksbilde fra beholderen:

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

Siden vårt nye bilde følger med git forblir på verten, kan vi søke på Docker-verten:

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

5. Bildestyring

Det er noen få gjeldende kommandoer vi får for å administrere bildeoperasjoner.

5.1. Liste bilder

For å liste alle tilgjengelige bilder, inkludert dinglende bilder på Docker-verten, må vi søke på listImagesCmd metode:

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

Hvis vi har to bilder på Docker Host, vi bør få tak i Bilde gjenstander av dem i løpetid. Bildene vi ser etter er:

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

Ved siden av dette, for å se mellombildene, må vi be om det eksplisitt:

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

Hvis bare det å vise de dinglende bildene er tilfelle, vil medDanglingFilter metoden må vurderes:

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

5.2. Bygg et bilde

La oss fokusere på måten å bygge et bilde på ved hjelp av API. De buildImageCmd metoden bygger Docker-bilder fra en Dockerfil. I prosjektet vårt har vi allerede en Dockerfile som gir et Alpint bilde med git installert:

FRA alpin: 3.6 KJØR apk - oppdatering legg til git openssh && \ rm -rf / var / lib / apt / lists / * && \ rm / var / cache / apk / * ENTRYPOINT ["git"] CMD ["--hjelp "]

Det nye bildet vil bli bygget uten bruk av hurtigbuffer, og før du starter byggeprosessen, vil Docker-motoren i alle fall prøve å hente den nyere versjonen av alpin: 3.6. Hvis alt går bra, bør vi til slutt se bildet med gitt navn,alpin: git:

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

5.3. Inspiser et bilde

Vi kan inspisere lavnivåinformasjonen om et bilde takket være inspectImageCmd metode:

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

5.4. Merk et bilde

Å legge til en tagg til bildet vårt er ganske enkelt å bruke dockerstikkord kommando, så API er ikke noe unntak. Vi kan utføre den samme intensjonen med tagImageCmd metode også. For å merke et Docker-bilde med id 161714540c41 inn i baeldung / alpin repository med git:

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

Vi vil liste opp det nylig opprettede bildet, og der er det:

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

5.5. Skyv et bilde

Før du sender ut et bilde til en registertjeneste, må docker-klienten være konfigurert til å samarbeide med tjenesten fordi det å jobbe med registre må godkjennes på forhånd.

Siden vi antar at klienten var konfigurert med Docker Hub, kan vi presse baeldung / alpin bilde til baeldung DockerHub-kontoen:

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

Vi må følge prosessens varighet. I eksemplet, vi venter 90 sekunder.

5.6. Trekk et bilde

For å laste ned bilder fra registretjenester bruker vi pullImageCmd metode. I tillegg, hvis bildet blir hentet fra et privat register, må klienten vite legitimasjonen vår, ellers ender prosessen med en feil. Samme som å trekke et bilde, spesifiserer vi en tilbakeringing sammen med en fast periode for å trekke et bilde:

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

Slik sjekker du om det nevnte bildet finnes på Docker-verten etter å ha trukket det:

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

5.7. Fjern et bilde

En annen enkel funksjon blant resten er removeImageCmd metode. Vi kan fjerne et bilde med kort eller lang ID:

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

5.8. Søk i registeret

For å søke i et bilde fra Docker Hub, kommer klienten med searchImagesCmd metode som tar en strengverdi som indikerer et begrep. Her utforsker vi bilder relatert til et navn som inneholder ‘Java ' i Docker Hub:

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

Utgangen returnerer 25 første relaterte bilder i en liste over Søkemne gjenstander.

6. Volumstyring

Hvis Java-prosjekter trenger å samhandle med Docker for volumer, bør vi også ta hensyn til denne delen. Kort sett ser vi på de grunnleggende teknikkene for volumer levert av Docker Java API.

6.1. Liste over volumer

Alle tilgjengelige volumer inkludert navngitte og ikke navngitte er oppført med:

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

6.2. Inspiser et volum

De inspectVolumeCmd metoden er skjemaet for å vise detaljert informasjon om et volum. Vi inspiserer volumet ved å spesifisere dets korte ID:

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

6.3. Lag et volum

API-et serverer to forskjellige alternativer for å lage et volum. Den ikke-arg createVolumeCmd metoden oppretter et volum der navnet er gitt av Docker:

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

I stedet for å bruke standard oppførsel, hjalp metoden med navn lar oss sette et navn til et volum:

CreateVolumeResponse med navnet Volum = dockerClient.createVolumeCmd (). WithName ("myNamedVolume"). Exec ();

6.4. Fjern et volum

Vi kan intuitivt slette et volum fra Docker-verten ved hjelp av removeVolumeCmd metode. Hva er viktig å merke seg at vi ikke kan slette et volum hvis det er i bruk fra en container. Vi fjerner volumet, myNamedVolume, fra volumlisten:

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

7. Nettverksadministrasjon

Den siste delen vår handler om å administrere nettverksoppgaver med API.

7.1. Liste nettverk

Vi kan vise listen over nettverksenheter med en av de konvensjonelle API-metodene som begynner med liste:

Liste nettverk = dockerClient.listNetworksCmd (). Exec ();

7.2. Opprett et nettverk

Tilsvarende av docker-nettverk opprette kommandoen gjennomføres med createNetworkCmd metode. Hvis vi har et tretti parti eller en tilpasset nettverksdriver, kan med driver metoden kan godta dem i tillegg til de innebygde driverne. I vårt tilfelle, la oss lage et bronettverk som heter baeldung:

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

Videre løser ikke problemet å opprette en nettverksenhet med standardinnstillingene, vi kan søke om andre hjelpermetoder for å konstruere et avansert nettverk. Og dermed, for å overstyre standard undernettverk med en tilpasset verdi:

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

Den samme kommandoen kan vi kjøre med docker kommandoen er:

$ docker-nettverk opprett \ --subnet = 172.36.0.0 / 16 \ --ip-range = 172.36.5.0 / 24 \ baeldung

7.3. Inspiser et nettverk

Å vise detaljer på et lavt nivå i et nettverk er også dekket i API: et:

Nettverksnettverk = dockerClient.inspectNetworkCmd (). WithNetworkId ("baeldung"). Exec ();

7.4. Fjern et nettverk

Vi kan trygt fjerne en nettverksenhet med navn eller ID ved hjelp av fjerne NettverkCmd metode:

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

8. Konklusjon

I denne omfattende opplæringen undersøkte vi de forskjellige funksjonalitetene til Java Docker API-klient, sammen med flere implementeringsmetoder for distribusjon og administrasjonsscenarier.

Alle eksemplene illustrert i denne artikkelen finner du på GitHub.


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