Pokretanje Spring Boot aplikacije u remote Docker kontejneru jednim klikom
O Docker-u
Docker je napisan u programskom jeziku Go, što je jedan od razloga zašto je Go poslednjih godina sve popularniji. O Docker-u treba da razumete 3 važna koncepta:
- image: slika, datoteka koja se koristi za kreiranje kontejnera; ako ste ikada instalirali Windows, lako ćete razumeti značenje reči „slika" — ja sam u mladosti nemalički puta rezao Windows slike na disk i reinstalirao sistem.
- container: kontejner, instanca slike koja se može pokrenuti, unutar koje radi kompletan operativni sistem i može raditi sve što i vaš trenutni operativni sistem.
- Dockerfile: šablon za izgradnju slike, opisuje korake izgradnje slike.
Odnos među njima je sledeći: pomoću Dockerfile-a gradi se slika, zatim se pomoću slike pravi kontejner, a unutar kontejnera mogu da se izvršavaju programi. Takođe, iz jedne slike može se kreirati više kontejnera, i oni su međusobno izolovani.
Za nas developere, Docker omogućava sledeće:
- pisanje koda lokalno
- korišćenje Docker-a za slanje programa u testno okruženje
- nakon otkrivanja bug-a, popravka u razvojnom okruženju i ponovni deploy u testno okruženje radi testiranja
- nakon završenog testiranja, slanje u produkciju
U ovom procesu Docker pruža doslednost između razvojnog, testnog i produkcionog okruženja — kad bolje razmislite, zar to nije prilično zastrašujuće...
Od sada, kada mi developeri kažemo „pa kod mene lokalno sve radi", više nećemo moći da prebacujemo krivicu, haha.
Java programerima bi trebalo da je dobro poznat ovaj Docker slogan:
Build once, Run anywhere (izgradi jednom, pokreni bilo gde)
Docker koristi CS arhitekturu — klijent komunicira sa Docker daemon procesom, koji je zadužen za izgradnju, pokretanje i distribuciju Docker kontejnera.

Docker-ovi scenariji primene su veoma raznovrsni, na primer:
- automatsko pakovanje i deploy aplikacija
- kreiranje laganog, privatnog PaaS okruženja
- automatizovano testiranje i kontinualna integracija/deploy
- deploy i skaliranje web aplikacija, baza podataka i backend servera
- kreiranje bezbednih sandbox okruženja
- lagana desktop virtualizacija
Instalacija Docker-a
Docker Engine (motor) mora biti instaliran na 64-bitnom Linux serveru (32-bitna verzija nije podržana), i zahteva određene preduslove (za CentOS sistem):
PS: Linux zajednica više ne održava CentOS 8, zbog čega yum izvor mora da se zameni; planiram kasnije preći na Anolis ili Alinux sistem.
- mora biti CentOS verzija 7 ili 8; starije verzije nisu podržane
- centos-extras repozitorijum mora biti omogućen (obično jeste; ako nije, mora se ručno omogućiti)
- preporučuje se korišćenje overlay2 (pogledajte link za detalje) storage driver-a
Moj cloud server ima instaliran CentOS sistem, pa ću ovde koristiti CentOS kao demo okruženje. Lično više volim RPM (Red-Hat Package Manager) instalacioni paket — jednostavno i efikasno.
Prvi korak, instalirajte yum-utils alat.
yum install -y yum-utilsDrugi korak, pomoću yum-config-manager alata iz yum-utils-a konfigurišite Docker instalacioni repozitorijum.
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repoTreći korak, instalirajte Docker Engine (uključujući Docker Engine, containerd i Docker Compose).
yum install docker-ce docker-ce-cli containerd.io docker-compose-pluginČetvrti korak, pokrenite Docker.
systemctl start dockerPeti korak, proverite da li je Docker pravilno instaliran.
docker run hello-worldAko se pojavi sledeća poruka, to znači da je Docker uspešno instaliran!

Ovo je zvanični način instalacije koji pruža Docker, pomalo komplikovan — zapravo možemo koristiti jednostavniji pristup.
# Prvo instalirajte Docker
yum -y install docker
# Zatim pokrenite Docker servis
service docker start
# Testirajte da li je instalacija uspela
docker -vDocker nudi desktop verzije i za Windows i za macOS sisteme; možete preuzeti instalacioni paket sa zvaničnog sajta.
Docker adresa za preuzimanje: https://docs.docker.com/get-docker/
Ovde ću uzeti macOS kao primer; za M1 čip možete izabrati Apple Chip. Nakon preuzimanja, instalacija je potpuno trivijalna.

Interfejs nakon uspešne instalacije i pokretanja izgleda ovako:

Prema uputstvu, u terminal unesite komandu docker run -d -p 80:80 docker/getting-started:

Vratite se u Docker desktop i videćete Docker tutorijal koji je upravo pokrenut preko porta 80 unutar Docker-a.

Kliknite na ikonicu „open in browser" da otvorite dokumentaciju tutorijala u pregledaču.

Windows korisnici takođe mogu instalirati putem chocolatey komandnog alata koji sam ranije preporučio.

(Što se tiče Windows instalacije — kad sledeći put dobijem Xiaomi laptop, instaliraću sistem i dopuniti ovaj deo.)
Omogućavanje Docker remote pristupa
Da bismo deploy-ovali lokalnu aplikaciju na Docker server, moramo omogućiti Docker remote pristup.
Prvi korak, otvorite Docker konfiguracionu datoteku sledećom komandom.
vim /usr/lib/systemd/system/docker.serviceDrugi korak, pod service čvorom izmenite ExecStart svojstvo dodavanjem -H tcp://0.0.0.0:2375

Ovim se efektivno otvara port 2375 spolja; ako ste instalirali aaPanel (BaoTa panel), ne zaboravite da dozvolite taj port na stranici za bezbednost, a i firewall cloud servera mora propustiti taj port.

Nakon konfiguracije, restartujte Docker.
systemctl daemon-reload
systemctl restart dockerU adresnu traku pregledača unesite http://ip:2375/version da biste proverili da li radi.

Nakon toga, u IntelliJ IDEA-i možete konfigurisati Docker-ov TCP socket; ako se pojavi „connection successful", znači da je veza uspostavljena.

Deploy Spring Boot aplikacije pomoću Docker-a
Prvi korak, napravite jednostavan Spring Boot projekat.

Veoma jednostavan web projekat sa samo jednim kontrolerom; kod je sledeći:
@RequestMapping
@RestController
public class DockerController {
@RequestMapping("/")
public String hello() {
return "Docker, kažem ti, Chenmo Wang Er je budala";
}
}@RequestMapping i @RestController anotacije smo već predstavili u prethodnim poglavljima; one ukazuju na to da je ovo SpringMVC projekat. Putanja / znači da je dovoljno u adresnu traku pregledača uneti localhost:8080 da bismo poslali zahtev, a odgovor je „Docker, kažem ti, Chenmo Wang Er je budala".
Nakon pokretanja servisa, možete proveriti pomoću IntelliJ IDEA HTTP Client-a.

OK, projekat je normalno dostupan.
Drugi korak, napravite Dockerfile — datoteku Docker slike za Spring Boot projekat.
U korenskom direktorijumu projekta napravite Dockerfile datoteku, kao na slici ispod.

Sadržaj je sledeći:
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]FROM openjdk:8-jdk-alpine: označava korišćenje JDK8 kao osnovne slike.ARG JAR_FILE=target/*.jar: označava definisanje build parametra imenom JAR_FILE vrednostitarget/*.jar.COPY ${JAR_FILE} app.jar: označava kopiranje jar datoteke iz target direktorijuma u novu app.jar datoteku unutar slike.ENTRYPOINT ["java","-jar","/app.jar"]: označava pokretanjeapp.jarpomoćujava -jar; ENTRYPOINT konfiguriše komandu koja se izvršava pri pokretanju kontejnera — prvi argument je komanda, a zatim slede pojedinačni argumenti.
Treći korak, u pom.xml datoteku dodajte Maven Docker plugin.
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<dockerHost>http://ip:2375</dockerHost>
<imageName>itwanger/${project.artifactId}</imageName>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<forceTags>true</forceTags>
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>- Pod
executionsčvorom dodajte docker:build, što znači da će se prilikom izvršavanja mvn:package pakovanja izgraditi i Docker slika. - Pod
configurationčvorom dodajte adresu Docker hosta, ime slike, verziju slike, direktorijum datoteke slike, kao i lokaciju i ime jar paketa konfigurisanog pod resources čvorom.
Nakon što je konfiguracija završena, sledi pakovanje projekta — možete direktno kliknuti na package u Maven panelu da započnete pakovanje.

Prvo pakovanje zahteva preuzimanje nekoliko osnovnih slika; nakon uspešnog pakovanja, u Docker-u možete pregledati sveže izgrađenu sliku komandom docker images.

Zatim možemo pokrenuti kontejner od te slike:
docker run -d --name itwanger -p 8080:8080 itwanger/springboot-docker:0.0.1-SNAPSHOT-d: pokretanje kontejnera u pozadini i vraćanje ID-a kontejnera;--name: dodeljivanje imena itwanger kontejneru;-p: navođenje mapiranja portova u formatu port domaćina:port kontejnera
Zatim u pregledaču pristupite portu 8080 i videćete da naša aplikacija uspešno radi na Docker-u.

Kada se docker run koristi za kreiranje kontejnera, standardne pozadinske operacije koje Docker izvršava obuhvataju:
- proveru da li navedena slika postoji lokalno; ako ne, preuzimanje iz repozitorijuma
- kreiranje i pokretanje kontejnera pomoću slike
- dodelu fajl sistema i montiranje sloja za čitanje-pisanje preko sloja slike koji je samo za čitanje
- premošćavanje virtuelnog interfejsa u kontejner preko bridge interfejsa konfigurisanog na domaćinu
- dodelu IP adrese kontejneru iz skupa adresa
- izvršavanje korisnički zadate aplikacije
- nakon završetka izvršavanja, kontejner se zaustavlja
Direktna veza IntelliJ IDEA-e sa Docker-om
Nova verzija IntelliJ IDEA-e već uključuje Docker podrazumevano, pa možemo otvoriti Docker kroz services panel i raditi direktno.

Izvorni kod:
- Codingmore: https://github.com/itwanger/coding-more
- codingmore-docker: https://github.com/itwanger/codingmore-learning
