A múlt alkalommal megmutattam, hogyan lehet úgy Docker konténerekkel konfigurálni weboldalakat, hogy előttük van egy NginX proxy, ami a különböző domainekre érkező kéréseket továbbítja különböző konténerek felé. Ezt viszont eddig egy darab konténerrel oldottuk meg, ami tartalmazta egyszerre a "docker-gen
"-t, ami generálta a konfigurációs fájlt és az NginX szervert is. A "docker-gen
"-nek viszont fel kell csatoltunk a Docker socket fájlt, hogy el tudja érni a Docker API-t, amiből le tud kérni információkat, hogy le tudja generálni a konfigurációs fájlt. Ilyenkor viszont, ha valaki mégis csak be tud jutni az NginX szerveren keresztül a konténerbe, akkor gyakorlatilag minden Docker konténerünkhöz hozzáfér. Ezt elkerülendő szét fogjuk választani a "docke-gen
"-t az NginX szervertől két külön konténerbe, és ezek után már csak a "docker-gen
" fogja tudni elérni a Docker API-t.
Tartalomjegyzék
- Korábbi kód letöltése és Docker Compose telepítés
- A docker-compose fájl módosítása
- Dockerfile és egyedi docker-gen image build
- Ellenőrzés a böngészőben
- Végszó
Korábbi kód letöltése és Docker Compose telepítés
[Tartalom]
A korábban elkészült kódot felmásoltam GitHub-ra, és innen fogjuk most letölteni, hogy tiszta lappal induljunk egy újabb projektben.
A letöltés után belépünk a mappába
Majd pedig át kell váltanunk a megfelelő verzióra, hiszen mire ezt a videót nézed, addigra lehet, hogy már újabb verziók is léteznek. Ehhez tehát a következő parancsot kell lefuttatni:
A git checkout -b
után megadjuk azt a branch nevet, amit szeretnénk létrehozni az újabb fejlesztéshez és a "step-04
" tag-re fogunk hivatkozni. Meg lehet nézni, hogy jelenleg milyen tag-jeink vannak
## output:
# step-01
# step-02
# step-03
# step-04
Összesen 4 tag és ebből az utolsót választottuk. Ezután pedig létre kell hozni a python environment-ünket is:
Majd pedig aktiválnunk is kell ezt az environment-et:
Az aktiválás után pedig telepíteni fogjuk a Docker Compose-t, amihez létre fogunk hozni egy "requirements.txt
" fájlt, és ebbe fogjuk beleirányítani a a "docker-compose" nevét és egyenlőség jelek után a verziószámát.
Ezután pedig a "pip" paranccsal fogjuk telepíteni a "requirements.txt
" használatával a Docker Compose-t
A docker-compose fájl módosítása
[Tartalom]
Az eddig definiált "nginx-proxy
" service mellett most létre kell hoznunk egy "docker-gen
" nevű service-t is, ahova át kell másolnunk bizonyos konfiguációkat, másokat pedig át kell mozgatnunk. Ilyen lesz a Docker socketnek a felcsatolása is, amire már csak a "docker-gen
"-nek van szüksége, a proxy-nak nincs.
# ...
docker-gen:
volumes:
- type: bind
source: /var/run/docker.sock
target: /tmp/docker.sock
A következő pedig a DEFAULT_HOST
változónak a definiállása, amit szintén csak a "docker-gen
"-nek kell látnia.
# ...
docker-gen:
volumes:
- type: bind
source: /var/run/docker.sock
target: /tmp/docker.sock
environment:
DEFAULT_HOST: default
Mivel viszont most két külön konténerünk van, létre kell hoznunk egy olyan volume-ot is, amire a "docker-gen
" le tudja generálni a konfigurációs fájlt és erről a volume-ról be tudja tölteni az NginX. Tehát egy "nginx-config" nevű volume-ot hozunk létre:
# ...
nginx-config:
Amit pedig fel fogunk csatolni az "nginx-proxy
" service-ben a /etc/nginx/conf.d
mappába.
nginx-proxy:
# ...
volumes:
- type: volume
source: nginx-config
target: /etc/nginx/conf.d
# ...
A "docker-gen
"-nek viszont minden volme-ot látnia kell, mivel vannak olyan feltételek a generálás közben, amiknél néznie kell, hogy egyes fájlok léteznek-e vagy sem. Tehát az összes volume-ot fel fogjuk csatolni a "docker-gen
"-hez is:
# ...
docker-gen:
# ...
volumes:
- type: volume
source: nginx-dhparam
target: /etc/nginx/dhparam
- type: volume
source: nginx-certs
target: /etc/nginx/certs
- type: volume
source: nginx-config
target: /etc/nginx/conf.d
- type: bind
source: /var/run/docker.sock
target: /tmp/docker.sock
# ...
Arról is volt szó, hogy a "docker-gen
"-nek látnia kell az NginX processzt, mivel értesítenie kell arról, hogy újra lehet tölteni a konfigurációt. Emiatt pedig be fogjuk tenni a "docker-gen
"-t az NginX proxy-nak a processz névterébe. Ezt a "pid" kulcsszóval tudjuk megtenni, ami után a "service:" után megadjuk a service-nek a nevét, esetünkben az "nginx-proxy
"-t
# ...
docker-gen:
# ...
pid: service:nginx-proxy
# ...
Gondoskodnunk kell még az image-eknek a változtatásáról is. Az NginX proxy-nál például már nem használjuk Jason Wildernek nginx-proxy
image-ét, hanem váltani fogunk egy hivatalos NginX image-re. Ez pedig nekünk az NginX 1.19-es lesz:
nginx-proxy:
image: nginx:1.19
# ...
De kérdés, hogy miért ezt választjuk. Érdemes megnézni azt, hogy jelenleg az NginX proxy image-ünkben milyen verziójú NginX fut és annak megfelelően érdemes megválasztani az új image-ünket is. Ha korábban kompatibilis volt az NginX proxy image-ünkben a docker-gen
-nel az NginX, akkor valószínűleg érdemes egy ilyen verziót választanunk. A verziót az alábbi paranccsal tudjuk lekérni:
A docker-gen
-nél viszont nem fogunk közvetlenül a compose fájlban definiálni image-et, hanem hanem megadjuk, hogy most egy saját Dockerfile-ból szeretnénk build-elni saját image-et.
# ...
docker-gen:
build:
context: .
# ...
A teljes compose fájl az alábbi:
networks:
default:
external: true
name: proxy-web
volumes:
nginx-dhparam:
nginx-certs:
nginx-config:
services:
nginx-proxy:
image: nginx:1.19
ports:
- "80:80"
volumes:
- type: volume
source: nginx-config
target: /etc/nginx/conf.d
- type: volume
source: nginx-dhparam
target: /etc/nginx/dhparam
- type: volume
source: nginx-certs
target: /etc/nginx/certs
docker-gen:
build:
context: .
volumes:
- type: volume
source: nginx-config
target: /etc/nginx/conf.d
- type: volume
source: nginx-dhparam
target: /etc/nginx/dhparam
- type: volume
source: nginx-certs
target: /etc/nginx/certs
- type: bind
source: /var/run/docker.sock
target: /tmp/docker.sock
environment:
DEFAULT_HOST: default
pid: service:nginx-proxy
Dockerfile és egyedi docker-gen image build
[Tartalom]
Az ősimage-ünk a docker-gen
-nek a 0.7.6-os verziója lesz.
Dockerfile
Ezek után be kell szereznünk az NginX template-et is, amiből le tudja generálni a konfigurációs fájlt, de jó hír, hogy nem kell manuálisan kimásolnunk, vagy letöltenünk valahonnan, hanem közvetlenül tudjuk az NginX proxy image-ből másolni ugyanúgy a COPY
paranccsal, ahogy korábban is másoltunk a hosztról, csak most a --from
paraméterrel meg fogjuk adni azt is, hogy milyen image-ből szeretnénk kimásolni ezt a fájlt. Ezután a másik két paraméter már ismerős lesz. Megadjuk, hogy honnan hova szeretnénk másolni, csak itt a "honnan" az image-re fog vonatkozni.
/app/nginx.tmpl \
/etc/docker-gen/templates/nginx.tmpl
Mivel a docker-gen
egy általános program és nem csak az NginX-nek tud konfigurációs fájlt generálni, nekünk kell arról kis gondoskodni, hogy hogyan kell értesíteni az NginX-et arról, hogy egy új konfigurációs fájlunk van. Ehhez egy notify.sh
fájlt fogunk létrehozni, aminek adunk futtatási jogot is és ebbe fogjuk beleirányítani a "pkill -HUP nginx
parancsot.
&& chmod +x /notify.sh
Végül pedig megadjuk a parancsot, aminek le kell futnia akkor, amikor a konténer elindul és itt fogunk majd hivatkozni a "notify.sh
"-ra.
"-notify", "/notify.sh", \
"-watch", \
"/etc/docker-gen/templates/nginx.tmpl", \
"/etc/nginx/conf.d/default.conf" \
]
A teljes Dockerfile a következő:
COPY --from=jwilder/nginx-proxy:0.9.0 \
/app/nginx.tmpl \
/etc/docker-gen/templates/nginx.tmpl
RUN echo "pkill -HUP nginx" > /notify.sh \
&& chmod +x /notify.sh
CMD [ \
"-notify", "/notify.sh", \
"-watch", \
"/etc/docker-gen/templates/nginx.tmpl", \
"/etc/nginx/conf.d/default.conf" \
]
Ellenőrzés a böngészőben
[Tartalom]
Ha ezzel végeztünk, már meg is lehet nézni, hogy működik-e a proxy-nk, tehát lépjünk is be a proxy mappába és build-eljük le az új image-et, majd pedig nézzük meg a böngészőben is, hogy működik-e minden.
Mivel még nem fut az alapértelmezett weboldalunk sem, ezért egy hibaüzenetet fogunk kapni a 127.0.0.1
IP címet a böngészőbe beírva:
Most viszont indítsuk el az alapértelmezett szolgáltatást:
docker-compose up -d
Ezután már működni fog az alapértelmezett weboldalunk, de még el kell indítanunk a feltöltő és letöltő konténereit is.
docker-compose up -d
Ha ismét megnézzük a böngészőt, már működni fog a feltöltőnk és a letöltőnk is a 127.0.0.1.nip.io
és downloads.127.0.0.1.nip.io
címeken.
Végszó
[Tartalom]
Mostantól a Docker socket fájlunk biztonságban van és mindenki csak ahhoz fér hozzá, amire valóban szüksége van. Az NginX függetlenül frissíthető minden más konténertől, de persze arra figyelni kell, hogy a használt verzió a docker-gen által generált konfigurációval kompatibilis legyen.
Az elkészült kódot megtalálod a GitHub-on step-05 tag-gel.
Ha úgy érzed, hasznos volt a cikk számodra, kérlek, jelezd egy like-kal. Ha nem szeretnél lemaradni az újdonságokról, kövesd a weboldalt Facebookon vagy iratkozz fel a Youtube csatornára. Volna ötleted, amit megosztanál másokkal? Hibát találtál a cikkben vagy a videóban? Kommentben bátran jelezhetsz bármilyen észrevételt, de vigyázz, hálám örökre üldözni fog... :)