Kako kreirati prilagođene Dockerfile slike korak po korak

    ,
  • Dockerfile automatizira izgradnju prilagođenih Docker slika.
  • Instrukcije kao što su FROM, RUN, COPY i CMD omogućavaju vam da definirate svaki sloj slike.
  • Uz Docker Compose možete integrirati svoje prilagođene slike u okruženja s više kontejnera.
  • Objavljivanje slika u Docker Hub-u olakšava saradnju i implementaciju među timovima.

Prilagođena slika Dockerfile

Pri radu sa kontejnerima doker, korištenje clip arta može biti dobra polazna tačka. Međutim, u skoro svakom projektu dođe trenutak kada vam je potrebna veća kontrola, specifične postavke ili jednostavno uključivanje vlastite konfiguracije. Ovo je mjesto gdje je prilagođene slike Dockerfilea.

U ovom članku nudimo vam a detaljan vodič, jasan i sveobuhvatan tako da možete naučiti kako kreirati vlastite prilagođene Docker slike. Od osnovnih koncepata poput onoga što je Dockerfile i kako radi do naprednih tehnika kao što je optimizacija Dockerfilea, korištenje varijabli, keširanja i upravljanja dnevnikom.

Šta je Dockerfile i zašto vam je potreban?

Dockerfile je jednostavno običan tekstualni fajl koji sadrži uputstva tako da Docker zna kako da napravi sliku. Svaka instrukcija u Dockerfile-u ukazuje na određeni korak, a Docker ga tumači kao sloj u konačnoj slici koja se generira.

Slike u Docker-u se sastoje od nepromjenjivi slojevi. Dockerfiles definiraju korak po korak kako ovi slojevi trebaju biti kreirani, od odabira osnovne slike do kopiranja datoteka, instaliranja paketa ili konfiguriranja usluga. Budući da su ponovljivi, Dockerfiles dozvoljavaju Potpuno automatizirajte generiranje prilagođenih okruženja na jednostavan način.

Ovaj pristup ima više prednosti: ponovljivost, jednostavnost dijeljenja, bolje održavanje i sigurnost. Uz to, korištenje Dockerfilea vam omogućava da izbjegnete ručno konfiguriranje konfiguracija svaki put kada pokrenete kontejner. Sve je automatizovano i dokumentovano.

dockerfile

Kako Dockerfile radi: osnove

Za kreiranje prilagođenih Dockerfile slika, prva stvar je definirati od koje osnovne slike ćemo početi. Ovo se radi sa direktivom OD. Na primjer:

FROM ubuntu:20.04

Odatle su uključena dodatna uputstva koja vam omogućavaju da napravite i prilagodite sliku:

  • KOPIJA: kopirajte datoteke sa vašeg lokalnog stroja u sistem datoteka kontejnera.
  • RUN: izvršava naredbe unutar slike za izgradnju (npr. instaliranje paketa).
  • CMD: definira koja će naredba biti izvršena po defaultu prilikom pokretanja kontejnera iz te slike.
  • ULAZNA TAČKA: postavlja glavni proces kontejnera, sličan CMD-u, ali više kontroliran.
  • ENV: postavlja varijable okruženja unutar kontejnera.
  • KORISNIK i RADNI DIR: označava koji korisnik će izvršiti naredbe i koji će biti radni direktorij.

Praktični primjer Dockerfile-a mogao bi biti sljedeći:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y sudo nano curl nmap
COPY script.sh /usr/local/bin/script.sh
RUN chmod +x /usr/local/bin/script.sh
ENV direcIP=127.0.0.1
CMD ["/usr/local/bin/script.sh"]

Ovaj primjer instalira potrebne alate i konfiguriše prilagođenu skriptu za analizu sa IP-om kao promenljivom, omogućavajući joj da se lako menja prilikom pokretanja kontejnera.

Organizacija građevinskog konteksta

Kada Docker napravi sliku, to čini iz direktorija poznatog kao konstrukcijski kontekst. Ovaj direktorij bi trebao sadržavati:

  • datoteku dockerfile.
  • Sve datoteke koje želite kopirati u kontejner (izvorni kod, skripte, konfiguracije…).
  • Datoteka .dockerignore kako biste izbjegli uključivanje nepotrebnih datoteka.

Na primjer, ako gradite sliku pomoću Python aplikacije, vaš kontekst izrade trebao bi uključivati:

  • dockerfile
  • app.py
  • Zahtevi.txt

Ovo je od vitalnog značaja kako bi Docker mogao pravilno kopirati potrebne elemente u kontejner tokom procesa izgradnje.

docker

Sastavite prilagođenu sliku

Kada pripremite svoj Dockerfile i kontekst, možete napraviti sliku pomoću naredbe:

docker build -t nombreimagen:versión .

Na primjer:

docker build -t miimagenpython:1.0 .

Tačka na kraju («.») označava da je kontekst izgradnje trenutni direktorij. Kada završite, Docker će vam pokazati ID slike i možete je pogledati pomoću:

docker images

Testirajte i pokrenite svoju prilagođenu sliku

Pokretanje kontejnera iz vaše nove slike je jednostavno kao:

docker run --name miapp -it miimagenpython:1.0

Ako ste ga ispravno konfigurirali (na primjer sa Flask ili nginx), možete mu pristupiti iz pretraživača sve dok ste portove pravilno mapirali:

docker run -p 4000:4000 miimagenpython:1.0

docker

Korištenje varijabli okruženja (ENV)

Direktiva ENV omogućava vam da postavite zadane vrijednosti, ali ih također možete nadjačati u vrijeme izvođenja. Praktični primjer bi bio postavljanje IP adrese za skeniranje pomoću nmap-a:

ENV direcIP=127.0.0.1

A zatim pokrenite kontejner ovako:

docker run -e direcIP=192.168.1.1 miimagen

Ovo omogućava raznovrsnije i višekratne slike bez potrebe za njihovim stalnim modifikacijama.

Zadani izvršni fajlovi: CMD i ENTRYPOINT

Postoje dva načina da odredite šta će se pokrenuti prema zadanim postavkama kada se kontejner pokrene: CMD y ENTRYPOINT. Razlika između njih dvoje je u tome CMD se može prepisati lako sa terminala, dok ENTRYPOINT pretvara kontejner u neku vrstu “zatvorenog” izvršnog fajla.

Dobra praksa je da koristite ENTRYPOINT za pokretanje skripti za pokretanje i CMD kao zadane postavke. na primjer:

ENTRYPOINT ["/start.sh"]
CMD ["defaultvalue"]

Na ovaj način možete proslijediti određene argumente bez mijenjanja logike uključene skripte.

Dockerfile najbolje prakse i optimizacija

Evo nekoliko ključnih preporuka prilikom kreiranja prilagođenih Dockerfile slika:

  • Koristite svijetle osnovne slike kao što je Alpine kad god je to moguće (zauzimaju manje prostora i brži su).
  • Grupe RUN instrukcije u jednom bloku kako bi se minimizirao broj slojeva.
  • Izbjegavajte interaktivne upute (kao što su upiti za potvrdu). Uvijek koristite -y o --no-prompt u objektima.
  • Izbrišite privremene datoteke nakon upotrebe.
  • Koristite .dockerignore kao što biste uradili sa .gitignore da ne uključujete nepotrebne fajlove.

Primjena ovih smjernica poboljšava performanse slike i smanjuje sigurnosne rizike.

Kontrola keša u toku izgradnje

Docker koristi inteligentni sistem keširanja kako bi izbjegao ponavljanje koraka koji se nisu promijenili. Time se ubrzavaju rekonstrukcije. Ako uredite svoje prilagođene slike Dockerfile-a, one će se obnoviti samo iz linije koja je promijenjena.

Ako želite prisiliti potpunu obnovu, možete koristiti:

docker build --no-cache -t nombreimagen .

Ovo osigurava da će sve biti urađeno od nule, što je korisno kada mijenjate vanjske datoteke koje nije detektirao mehanizam za keširanje.

Docker Hub

Dijeljenje slika: Docker Hub i registri

Nakon što provjerite svoju prilagođenu sliku, možete je otpremiti u spremište (npr Docker čvorište) da ga podijelite. Protok bi bio:

  1. Prijavite se za Docker Hub i kreirajte spremište.
  2. Povežite svog klijenta na Docker Hub con docker login.
  3. Označite sliku sa vašim korisničkim imenom:
docker tag miimagen username/miimagen:1.0
  1. Otpremite sliku sa:
docker push username/miimagen:1.0

Jednom kada to učinite, Svako će moći preuzeti i koristiti vašu prilagođenu sliku koristeći:

docker pull username/miimagen:1.0

Integracija sa Docker Compose

U složenijim projektima uobičajeno je da je potrebno nekoliko kontejnera (web, baza podataka, balansator opterećenja itd.). U tu svrhu se koristi docker-compose.yml, gdje možete definirati servise za pokretanje.

Primjer upotrebe s vašom vlastitom slikom bi bio:

version: '3'
services:
  web:
    image: username/miimagen:1.0
    ports:
      - "4000:4000"
  redis:
    image: redis

Prema tome, Docker-compose može implementirati usluge iz prilagođenih slika i kombinirati ih. sa ostalim standardima na dosljedan način.

Prilikom lansiranja docker-compose up, svi definisani servisi su pokrenuti, što je idealno za kompletna razvojna okruženja.

Sa svim ovim alatima i tehnikama, možete kreirati robusna, prilagođena i efikasna okruženja za sve svoje projekte. Više nećete biti ograničeni na generičke slike i sve možete prilagoditi svojim potrebama.