Sprievodca dokom pre jazyk Java

1. Prehľad

V tomto článku sa pozrieme na ďalšie dobre zavedené API špecifické pre platformu - Klient Java API pre Docker.

V celom článku rozumieme spôsobu, ako sa spojiť s bežiacim démonom Docker a aký typ dôležitých funkcií ponúka API vývojárom Java.

2. Závislosť od Maven

Najprv musíme do našej pridať hlavnú závislosť pom.xml spis:

 com.github.docker-java docker-java 3.0.14 

V čase písania článku najnovšia verzia API je 3.0.14. Každé vydanie je možné zobraziť buď zo stránky vydania GitHub, alebo z úložiska Maven.

3. Používanie klienta Docker

DockerClient je miesto, kde môžeme nadviazať spojenie medzi Dockerovým motorom / démonom a našou aplikáciou.

V predvolenom nastavení je démon Docker prístupný iba na serveri unix: ///var/run/docker.sock spis. Môžeme lokálne komunikovať s Dockerov motor počúva na sokete Unix, pokiaľ nie je nakonfigurované inak.

Tu sa uchádzame o DockerClientBuilder triedy vytvoriť spojenie prijatím predvolených nastavení:

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

Podobne môžeme otvoriť pripojenie v dvoch krokoch:

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

Pretože sa motory mohli spoliehať na iné vlastnosti, klient je konfigurovateľný aj za iných podmienok.

Napríklad staviteľ akceptuje adresu URL servera, to znamená môžeme aktualizovať hodnotu pripojenia, ak je motor k dispozícii na porte 2375:

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

Upozorňujeme, že sa musíme pripraviť vopred spojovací reťazec s unix: // alebo tcp: // v závislosti od typu pripojenia.

Ak pôjdeme o krok ďalej, môžeme skončiť s pokročilejšou konfiguráciou pomocou DefaultDockerClientConfig trieda:

DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withRegistryEmail ("[chránený e-mailom]") .withRegistryPassword ("baeldung") .withRegistryUsername ("baeldung") .withDockerCertPert / „/home/baeldung/.docker/") .withDockerTlsVerify ("1") .withDockerHost ("tcp: //docker.baeldung.com: 2376") .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

Rovnaký prístup môžeme vykonať aj pomocou metódy Vlastnosti:

Vlastnosti vlastnosti = nové Vlastnosti (); properties.setProperty ("registry.email", "[chránený e-mailom]"); 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 (vlastnosti) .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

Ďalšou voľbou, pokiaľ nenakonfigurujeme nastavenia motora v zdrojovom kóde, je nastavenie zodpovedajúcich premenných prostredia, aby sme mohli brať do úvahy iba predvolenú inštanciu DockerClient v projekte:

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

4. Správa kontajnerov

API nám umožňuje rôzne možnosti správy kontajnerov. Pozrime sa na každého z nich.

4.1. Zoznam kontajnerov

Teraz, keď máme nadviazané pripojenie, môžeme uviesť všetky bežiace kontajnery umiestnené na hostiteľovi Dockeru:

Zoznam kontajnerov = dockerClient.listContainersCmd (). Exec ();

Za predpokladu, že zobrazovanie bežiacich kontajnerov sa vám nebude pozdávať, môžeme využiť ponúkané možnosti na dopytovanie kontajnerov.

V takom prípade zobrazíme kontajnery so stavom „ukončené“:

Zoznam kontajnerov = dockerClient.listContainersCmd () .withShowSize (true) .withShowAll (true) .withStatusFilter ("ukončený"). Exec ()

Je to ekvivalent:

$ docker ps -a -s -f status = ukončený # alebo $ docker kontajner ls -a -s -f status = ukončený

4.2. Vytvorte kontajner

Vytvorenie nádoby sa podáva s createContainerCmd metóda. Môžeme deklarovať zložitejšiu deklaráciu použitímdostupné metódy počnúc „s ” predpona.

Predpokladajme, že máme a dockervytvoriť príkaz definujúci hostiteľsky závislý kontajner MongoDB interne načúvajúci na porte 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

Rovnaký kontajner spolu s jeho konfiguráciami dokážeme bootstrapovať:

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

4.3. Štart, zastavenie a zabitie kontajnera

Po vytvorení kontajnera ho môžeme spustiť, zastaviť a zabiť podľa mena alebo id:

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

4.4. Skontrolujte kontajner

The inspectContainerCmd metóda vyžaduje a String argument označujúci názov alebo ID kontajnera. Pomocou tejto metódy môžeme priamo sledovať metadáta kontajnera:

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

4.5. Vytvorte snímku kontajnera

Podobne ako v docker spáchať Pomocou príkazu môžeme vytvoriť nový obrázok commitCmd metóda.

V našom príklade je scenár taký, predtým prevádzkujeme kontajner alpine: 3.6, ktorého id je „3464bb547f88“ a nainštalovaný git navyše.

Teraz chceme z kontajnera vytvoriť novú snímku obrázka:

Reťazec snapshotId = dockerClient.commitCmd ("3464bb547f88") .withAuthor ("Baeldung <[email protected]>")) .withEnv ("SNAPSHOT_YEAR = 2018") .withMessage ("pridať podporu git") .withCmd ("git", " verzia ") .withRepository (" alpská ") .withTag (" 3.6.git "). exec ();

Odkedy je náš nový obrázok dodávaný s git zostáva na hostiteľovi, môžeme ho vyhľadať na hostiteľovi Dockeru:

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

5. Správa obrázkov

Existuje niekoľko použiteľných príkazov, ktoré dostávame na správu obrazových operácií.

5.1. Zoznam obrázkov

Ak chcete uviesť zoznam všetkých dostupných obrázkov vrátane visiacich obrázkov na hostiteľovi Docker, musíme použiť súbor listImagesCmd metóda:

Zoznam obrázkov = dockerClient.listImagesCmd (). Exec ();

Ak máme na našom hostiteľovi Docker hostiteľa dva obrázky, mali by sme získať Obrázok ich objekty za behu. Obrázky, ktoré hľadáme, sú:

$ docker image ls --format "tabuľka {{.Repository}} {{.Tag}}" REPOSITÁRNA ZNAČKA alpine 3.6 mongo 3.6

Okrem toho, aby sme videli prechodné obrázky, musíme o ne výslovne požiadať:

Zoznam obrázkov = dockerClient.listImagesCmd () .withShowAll (true) .exec ();

Ak sa zobrazuje iba visiace obrázky, použije sa ikona withDanglingFilter metóda musí byť zvážená:

Zoznam obrázkov = dockerClient.listImagesCmd () .withDanglingFilter (true) .exec ();

5.2. Vytvorte obrázok

Zamerajme sa na spôsob vytvárania obrazu pomocou API. The buildImageCmd metóda vytvára Docker obrázky z Dockerfile. V našom projekte už máme jeden Dockerfile, ktorý dáva alpský obraz s nainštalovaným git:

FROM alpine: 3.6 RUN apk --update add git openssh && \ rm -rf / var / lib / apt / lists / * && \ rm / var / cache / apk / * ENTRYPOINT ["git"] CMD ["--pomoc "]

Nový obrázok bude zostavený bez použitia medzipamäte a pred začatím procesu budovania sa v každom prípade motor Docker pokúsi stiahnuť novšiu verziu vysokohorský: 3.6. Ak všetko dobre dopadne, mali by sme sa nakoniec pozrieť na obrázok s daným menom,vysokohorský: git:

Reťazec imageId = dockerClient.buildImageCmd () .withDockerfile (nový súbor ("cesta / do / Dockerfile")) .withPull (true) .withNoCache (true) .withTag ("alpine: git") .exec (nový BuildImageResultCallback ()) .awaitImageId ();

5.3. Skontrolujte obrázok

Nízku úroveň informácií o obrázku môžeme skontrolovať vďaka inspectImageCmd metóda:

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

5.4. Označte obrázok

Pridanie značky k nášmu obrázku je celkom jednoduché pomocou dockerznačka príkaz, takže API nie je výnimkou. Rovnaký zámer môžeme uskutočniť s tagImageCmd metóda tiež. Ak chcete označiť obrázok Dockera identifikátorom 161714540c41 do baeldung / alpského úložiska s git:

Reťazec imageId = "161714540c41"; Úložisko reťazcov = "baeldung / alpine"; Reťazec tag = "git"; dockerClient.tagImageCmd (imageId, úložisko, značka) .exec ();

Uviedli by sme zoznam novovytvoreného obrázka a je tu:

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

5.5. Zatlačte obrázok

Pred odoslaním obrázka do služby registra musí byť klient dokovacej stanice nakonfigurovaný na spoluprácu so službou, pretože práca s registrami musí byť vopred overená.

Pretože predpokladáme, že klient bol nakonfigurovaný s Docker Hub, môžeme stlačiť baeldung / alpský obrázok na účet DockerHub:

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

Musíme dodržať dĺžku trvania procesu. V príklade čakáme 90 sekúnd.

5.6. Vytiahnite obrázok

Na sťahovanie obrázkov z registratúrnych služieb používame pullImageCmd metóda. Okrem toho, ak sa obraz získava zo súkromného registra, klient musí poznať naše poverenie, inak proces skončí zlyhaním. Rovnako ako pri ťahaní obrázka, určujeme spätné volanie spolu s pevnou periódou na ťahanie obrázka:

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

Ak chcete skontrolovať, či uvedený obrázok existuje na hostiteľovi Dockeru po jeho vytiahnutí:

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

5.7. Odstrániť obrázok

Ďalšou jednoduchou funkciou medzi ostatnými je removeImageCmd metóda. Môžeme odstrániť obrázok s jeho krátkym alebo dlhým ID:

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

5.8. Hľadajte v registri

Na hľadanie obrázkov z Docker Hubu je klient dodávaný s searchImagesCmd metóda prijímajúca hodnotu typu String, ktorá označuje výraz. Tu skúmame obrázky súvisiace s menom obsahujúcim „Java ' v Docker Hub:

Zoznam položiek = dockerClient.searchImagesCmd ("Java"). Exec ();

Výstup vráti prvých 25 súvisiacich obrázkov v zozname Vyhľadávacia položka predmety.

6. Správa hlasitosti

Ak je potrebné, aby projekty Java interagovali s Dockerom kvôli objemom, mali by sme vziať do úvahy aj túto časť. Stručne sa pozrieme na základné techniky objemov poskytované Docker Java API.

6.1. Zoznam zväzkov

Všetky dostupné zväzky vrátane menovaných a nepomenovaných sú uvedené v zozname:

ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd (). Exec (); Zoznam objemov = volumeResponse.getVolumes ();

6.2. Skontrolujte zväzok

The inspectVolumeCmd metóda je forma na zobrazenie podrobných informácií o zväzku. Objem skontrolujeme zadaním jeho krátkeho čísla:

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

6.3. Vytvorte zväzok

API slúži na vytvorenie zväzku dvoma rôznymi možnosťami. Non-arg createVolumeCmd metóda vytvorí zväzok, kde je názov daný Dockerom:

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

Namiesto použitia predvoleného správania sa volala pomocná metóda withName umožňuje nám nastaviť názov zväzku:

CreateVolumeResponse namedVolume = dockerClient.createVolumeCmd (). WithName ("myNamedVolume"). Exec ();

6.4. Odstráňte zväzok

Z hostiteľa Dockera môžeme zväzok intuitívne vymazať pomocou removeVolumeCmd metóda. Je dôležité poznamenať, že nemôžeme vymazať zväzok, ktorý sa práve používa z kontajnera. Odstránime objem, myNamedVolume, zo zoznamu zväzkov:

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

7. Správa siete

Naša posledná časť je o správe sieťových úloh pomocou API.

7.1. Zoznam sietí

Zoznam sieťových jednotiek môžeme zobraziť jednou z konvenčných metód API, počnúc od zoznam:

Zoznam sietí = dockerClient.listNetworksCmd (). Exec ();

7.2. Vytvorte sieť

Ekvivalent k dokovacia sieť vytvoriť velenie sa vykonáva s createNetworkCmd metóda. Ak máme tridsať účastníkov alebo vlastný sieťový ovládač, withDriver metóda ich dokáže prijať okrem vstavaných ovládačov. V našom prípade vytvorme mostnú sieť, ktorá sa volá baeldung:

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

Okrem toho vytvorenie sieťovej jednotky s predvoleným nastavením problém nevyrieši, môžeme použiť ďalšie pomocné metódy na vytvorenie rozšírenej siete. Teda prepísať predvolenú podsieť vlastnou hodnotou:

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

Rovnaký príkaz môžeme spustiť s príkazom docker príkaz je:

$ docker network create \ --subnet = 172.36.0.0 / 16 \ --ip-range = 172.36.5.0 / 24 \ baeldung

7.3. Skontrolujte sieť

Zobrazenie podrobností o nízkej úrovni siete je tiež obsiahnuté v API:

Network network = dockerClient.inspectNetworkCmd (). WithNetworkId ("baeldung"). Exec ();

7.4. Odstrániť sieť

Sieťovú jednotku s jej menom alebo ID môžeme bezpečne odstrániť pomocou removeNetworkCmd metóda:

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

8. Záver

V tomto rozsiahlom tutoriáli sme preskúmali rôzne rozmanité funkcie servera Klient Java Docker APIspolu s niekoľkými implementačnými prístupmi pre scenáre nasadenia a správy.

Všetky príklady ilustrované v tomto článku nájdete na GitHub.


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