Vodič za Dockere za Javu

1. Pregled

U ovom ćemo članku pogledati još jedan dobro uspostavljeni API specifičan za platformu - Java API klijent za Docker.

U cijelom članku razumijemo način povezivanja s pokrenutim Docker demonom i vrstu važnih funkcija koje API nudi programerima Java.

2. Ovisnost Mavena

Prvo, moramo dodati glavnu ovisnost u našu pom.xml datoteka:

 com.github.docker-java docker-java 3.0.14 

U vrijeme pisanja članka, najnovija verzija API-ja je 3.0.14. Svako izdanje može se pogledati sa stranice izdanja GitHub ili iz spremišta Maven.

3. Korištenje Docker klijenta

DockerClient je mjesto na kojem možemo uspostaviti vezu između Dockerovog motora / demona i naše aplikacije.

Prema zadanim postavkama, Docker demonu može biti dostupan samo na unix: ///var/run/docker.sock datoteka. Možemo lokalno komunicirati s Docker engine koji sluša na Unix utičnici, ako nije drugačije konfigurirano.

Ovdje se primjenjujemo na DockerClientBuilder klase za stvaranje veze prihvaćanjem zadanih postavki:

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

Slično tome, vezu možemo otvoriti u dva koraka:

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

Budući da se motori mogu osloniti na druge karakteristike, klijent se također može konfigurirati s različitim uvjetima.

Na primjer, graditelj prihvaća URL poslužitelja, tj. možemo ažurirati vrijednost veze ako je motor dostupan na priključku 2375:

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

Imajte na umu da moramo prethoditi niz veze s unix: // ili tcp: // ovisno o vrsti veze.

Ako odemo korak dalje, možemo završiti s naprednijom konfiguracijom pomoću DefaultDockerClientConfig razred:

DefaultDockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder () .withRegistryEmail ("[e-pošta zaštićena]". "/home/baeldung/.docker/") .withDockerTlsVerify ("1") .withDockerHost ("tcp: //docker.baeldung.com: 2376") .build (); DockerClient dockerClient = DockerClientBuilder.getInstance (config) .build ();

Isto tako, možemo provesti isti pristup koristeći se Svojstva:

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

Drugi izbor ako ne konfiguriramo postavke motora u izvornom kodu je postavljanje odgovarajućih varijabli okruženja tako da možemo razmotriti samo zadanu instanciju DockerClient u projektu:

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

4. Upravljanje kontejnerom

API nam omogućuje razne izbore o upravljanju spremnicima. Pogledajmo svakog od njih.

4.1. Popis kontejnera

Sad kad imamo uspostavljenu vezu, možemo navesti sve pokrenute spremnike smještene na Docker hostu:

Popis kontejnera = dockerClient.listContainersCmd (). Exec ();

Pod uvjetom da prikazivanje tekućih spremnika ne privlači potrebu, možemo iskoristiti ponuđene opcije za postavljanje upita za spremnike.

U ovom slučaju prikazujemo spremnike sa statusom "izašao":

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

To je ekvivalent:

$ docker ps -a -s -f status = exited # ili $ docker spremnik ls -a -s -f status = exited

4.2. Stvorite spremnik

Stvaranje spremnika poslužuje se s createContainerCmd metoda. Možemo proglasiti složeniju deklaraciju koristećidostupne metode koje počinju s „s" prefiks.

Pretpostavimo da imamo a lučki radnikstvoriti naredba koja definira ovisno o hostu spremnik MongoDB koji interno osluškuje na portu 27017:

$ docker stvori --ime 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

U mogućnosti smo programski pokrenuti isti spremnik zajedno s njegovim konfiguracijama:

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

4.3. Pokrenite, zaustavite i ubijte kontejner

Kada stvorimo spremnik, možemo ga pokrenuti, zaustaviti i ubiti imenom ili ID-om:

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

4.4. Pregledajte kontejner

The inspectContainerCmd metoda traje a Niz argument koji označava ime ili id ​​spremnika. Pomoću ove metode možemo izravno promatrati metapodatke spremnika:

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

4.5. Snimka spremnika

Slično kao docker počiniti naredbu, možemo stvoriti novu sliku pomoću počinitiCmd metoda.

U našem primjeru scenarij je, prethodno smo pokrenuli spremnik alpine: 3.6 čiji je id "3464bb547f88" i instaliran git povrh toga.

Sada želimo stvoriti novu snimku slike iz spremnika:

Niz snapshotId = dockerClient.commitCmd ("3464bb547f88") .withAuthor ("Baeldung <[email protected]>") .withEnv ("SNAPSHOT_YEAR = 2018") .withMessage ("dodaj git podršku") .withCmd ("git", "git", "git", " verzija ") .withRepository (" alpine ") .withTag (" 3.6.git "). exec ();

Budući da je naša nova slika u paketu git ostaje na hostu, možemo ga pretraživati ​​na Docker hostu:

$ docker slika ls alpine --format "tablica {{.Repozitorij}} {{.Tag}}" "REPOSITORY TAG alpine 3.6.git

5. Upravljanje slikama

Postoji nekoliko primjenjivih naredbi koje smo dobili za upravljanje operacijama slike.

5.1. Popis slika

Da bismo popisali sve dostupne slike, uključujući viseće slike na Docker hostu, moramo se prijaviti na listImagesCmd metoda:

Popis slika = dockerClient.listImagesCmd (). Exec ();

Ako imamo dvije slike na našem Docker Hostu, trebali bismo dobiti Slika njihovi objekti u toku. Slike koje tražimo su:

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

Pored toga, da bismo vidjeli srednje slike, moramo to izričito zatražiti:

Popis slika = dockerClient.listImagesCmd () .withShowAll (true) .exec ();

Ako je slučaj samo prikazivanje visećih slika, withDanglingFilter mora se uzeti u obzir metoda

Popis slika = dockerClient.listImagesCmd () .withDanglingFilter (true) .exec ();

5.2. Izgradite sliku

Usredotočimo se na način izgradnje slike pomoću API-ja. The buildImageCmd metoda gradi Dockerove slike iz Dockerfilea. U našem projektu već imamo jedan Dockerfile koji daje alpsku sliku s instaliranim git-om:

IZ alpine: 3.6 RUN apk --update dodaj git openssh && \ rm -rf / var / lib / apt / liste / * && \ rm / var / cache / apk / * ENTRYPOINT ["git"] CMD ["--help "]

Nova slika bit će izgrađena bez upotrebe predmemorije i prije pokretanja postupka gradnje, u svakom će slučaju Docker engine pokušati povući noviju verziju alpski: 3.6. Ako sve bude u redu, na kraju bismo trebali vidjeti sliku s danim imenom,alpski: git:

Niz imageId = dockerClient.buildImageCmd () .withDockerfile (nova datoteka ("put / do / Dockerfile") .withPull (true) .withNoCache (true) .withTag ("alpine: git") .exec (new BuildImageResultCallback () .awaitImageId ();

5.3. Pregledajte sliku

Informacije o slici na niskoj razini možemo pregledati zahvaljujući inspectImageCmd metoda:

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

5.4. Označi sliku

Dodavanje oznake na našu sliku vrlo je jednostavno pomoću lučki radnikoznačiti naredba, tako da API nije iznimka. Možemo provesti istu namjeru s tagImageCmd metoda također. Da biste označili Dockerovu sliku ID-om 161714540c41 u baeldung / alpsko spremište s gitom:

Niz imageId = "161714540c41"; Spremište nizova = "baeldung / alpine"; Oznaka niza = "git"; dockerClient.tagImageCmd (imageId, spremište, oznaka) .exec ();

Naveli bismo novostvorenu sliku i tu je:

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

5.5. Pritisnite sliku

Prije slanja slike na uslugu registra, klijent dockera mora biti konfiguriran za suradnju sa uslugom, jer rad s registrima mora biti prethodno provjeren.

Budući da pretpostavljamo da je klijent konfiguriran s Docker Hub-om, možemo pritisnuti baeldung / alpski slika na baeldung DockerHub račun:

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

Moramo se pridržavati trajanja postupka. U primjeru, čekamo 90 sekundi.

5.6. Povucite sliku

Da bismo preuzeli slike iz usluga registra, koristimo pullImageCmd metoda. Osim toga, ako se slika izvlači iz privatnog registra, klijent mora znati našu vjerodajnicu, inače postupak završava neuspjehom. Isto kao i povlačenje slike, mi određujemo povratni poziv zajedno s fiksnim razdobljem za povlačenje slike:

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

Da biste provjerili postoji li spomenuta slika na Dockerovom računalu nakon povlačenja:

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

5.7. Uklonite sliku

Još jedna jednostavna funkcija među ostalim je removeImageCmd metoda. Možemo ukloniti sliku s njezinim kratkim ili dugim ID-om:

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

5.8. Pretražite u registru

Za pretraživanje slike iz Docker Hub-a klijent dolazi s searchImagesCmd metoda koja uzima vrijednost String koja označava pojam. Ovdje istražujemo slike povezane s imenom koje sadrži "Java' u Docker Hub-u:

Stavke na popisu = dockerClient.searchImagesCmd ("Java"). Exec ();

Izlaz vraća prvih 25 povezanih slika na popisu SearchItem predmeta.

6. Upravljanje glasnoćom

Ako Java projekti trebaju komunicirati s Dockerom zbog volumena, trebali bismo uzeti u obzir i ovaj odjeljak. Ukratko, razmatramo temeljne tehnike volumena koje pruža Docker Java API.

6.1. Popis svezaka

Svi dostupni volumeni, uključujući imenovane i neimenovane, navedeni su sa:

ListVolumesResponse volumesResponse = dockerClient.listVolumesCmd (). Exec (); Popis svezaka = volumesResponse.getVolumes ();

6.2. Pregledajte svezak

The inspectVolumeCmd metoda je obrazac za prikaz detaljnih informacija o svesku. Provjeravamo volumen navodeći njegov kratki id:

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

6.3. Stvorite svezak

API nudi dvije različite opcije za stvaranje volumena. Ne-arg createVolumeCmd metoda stvara volumen gdje ime daje Docker:

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

Umjesto korištenja zadanog ponašanja, pomoćna metoda je pozvala sName omogućuje nam postavljanje naziva na volumen:

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

6.4. Uklonite glasnoću

Možemo intuitivno izbrisati volumen s domaćina Dockera pomoću removeVolumeCmd metoda. Važno je napomenuti da volumen ne možemo izbrisati ako se koristi iz spremnika. Uklanjamo glasnoću, myNamedVolume, s popisa svezaka:

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

7. Upravljanje mrežom

Naš posljednji odjeljak govori o upravljanju mrežnim zadacima s API-jem.

7.1. Popis mreža

Popis mrežnih jedinica možemo prikazati jednom od konvencionalnih API metoda koje počinju sa popis:

Popis mreža = dockerClient.listNetworksCmd (). Exec ();

7.2. Stvorite mrežu

Ekvivalent docker mreža stvoriti zapovjedništvo se provodi s createNetworkCmd metoda. Ako imamo trideset članova ili prilagođeni mrežni upravljački program, withDriver metoda ih može prihvatiti osim ugrađenih upravljačkih programa. U našem slučaju, stvorimo mrežu mostova čije je ime baeldung:

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

Nadalje, stvaranje mrežne jedinice sa zadanim postavkama ne rješava problem, možemo se prijaviti za druge pomoćne metode za izgradnju napredne mreže. Tako, kako bi nadjačao zadanu podmrežu prilagođenom vrijednošću:

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

Ista naredba koju možemo pokrenuti s lučki radnik naredba je:

$ docker mreža stvori \ --subnet = 172.36.0.0 / 16 \ --ip-range = 172.36.5.0 / 24 \ baeldung

7.3. Pregledajte mrežu

Prikazivanje detalja mreže na niskoj razini također je obuhvaćeno API-jem:

Mrežna mreža = dockerClient.inspectNetworkCmd (). WithNetworkId ("baeldung"). Exec ();

7.4. Uklonite mrežu

Mrežnu jedinicu s njezinim imenom ili ID-om možemo sigurno ukloniti pomoću removeNetworkCmd metoda:

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

8. Zaključak

U ovom opsežnom vodiču istražili smo razne raznolike funkcionalnosti Klijent API-ja Java Docker, zajedno s nekoliko pristupa provedbi za scenarije uvođenja i upravljanja.

Svi primjeri ilustrirani u ovom članku mogu se naći na GitHubu.