Nginx és docker-gen futtatása külön konténerben

Borítókép címmel és hálózati csatlakozó képével PowerPoint-tal generálva.

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

[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.

git clone https://github.com/itsziget/tutorial-docker-vhosts.git

A letöltés után belépünk a mappába

cd tutorial-docker-vhosts

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:

git checkout -b step-05-dev step-04

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

git tag
## 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:

python3 -m venv venv

Majd pedig aktiválnunk is kell ezt az environment-et:

source venv/bin/activate

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.

echo "docker-compose==1.28.5" > requirements.txt

Ezután pedig a "pip" paranccsal fogjuk telepíteni a "requirements.txt" használatával a Docker Compose-t

pip install -r requirements.txt

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.

services:
 # ...
  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.

services:
  # ...
  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:

volumes:
 # ...
  nginx-config:

Amit pedig fel fogunk csatolni az "nginx-proxy" service-ben a /etc/nginx/conf.d mappába.

services:
  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:

services:
 # ...
  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

services:
 # ...
  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:

services:
  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:

docker run --rm -it --entrypoint ""  jwilder/nginx-proxy:0.9.0 nginx -v

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.

services:
 # ...
  docker-gen
:
    build
:
      context
: .
  # ...

A teljes compose fájl az alábbi:

version: "3.9"

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

FROM jwilder/docker-gen:0.7.6

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.

COPY --from=jwilder/nginx-proxy:0.9.0 \
     /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.

RUN echo "pkill -HUP nginx" > /notify.sh \
 && 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.

CMD [ \
    "-notify", "/notify.sh", \
    "-watch", \
    "/etc/docker-gen/templates/nginx.tmpl", \
    "/etc/nginx/conf.d/default.conf" \
  ]

A teljes Dockerfile a következő:

FROM jwilder/docker-gen:0.7.6

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.

docker-compose up -d --build

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:

503-as HTTP kód NginX 1.19-ben

Most viszont indítsuk el az alapértelmezett szolgáltatást:

cd ../default
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.

cd ../fileshare
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... :)

Kategóriák: 
Megosztás/Mentés