docker konténer másként működik, mint az eredeti weboldal [megoldva]

Fórumok

Sziasztok!

Van egy régi weboldalam, CentOS 6 és php 5.3 alatt remekül működik. Mivel hamarosan eljár az OS felett az idő, gondoltam időben elkezdem a migrációt. Csináltam egy teszt szervert CentOS 7-el, a rajta lévő php 5.4-el viszont nem megy a weboldal. Találtam 5.3-as repót, azzal frankó minden.

(amikor nekifutottam, még nem volt CentOS 8, miután kijött azzal is megnéztem, a sokkal frissebb php verzió nem nekem kedvez, de a CentOS 8 lesz a host, azon futnának a konténereim)

Csináltam egy dockerfájlt, amibe pontosan ugyanazokat a lépéseket vettem fel, mint a teszt szerveren, első ránézésre minden klappol, de ha bármilyen módosítást csinálok a konténerben futó weboldalon, akkor egy semmit mondó hibaüzenetet kapok, és a módosítás nem történik meg, mintha az oldal read-only módban működik, miközben az adatbázis írható.

Ez van a dockerfile-ban:

FROM centos:7

COPY src/php-53.repo /etc/yum.repos.d/php-53.repo

RUN yum update -y
RUN yum install -y httpd yum-plugin-versionlock

COPY src/versionlock.list /etc/yum/pluginconf.d/versionlock.list

RUN yum install -y php php-bcmath php-cli php-common php-gd php-intl php-mbstring php-mysql php-pdo php-process php-xml

RUN yum clean all && rm -rf /var/cache/yum/x86_64/7/*

COPY src/php.ini /etc/php.ini
COPY src/httpd.conf /etc/httpd/conf/httpd.conf

EXPOSE 80

CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

 

Így futtatom a konténert:

docker run -d -p 8080:80 --name kontenerem -v /srv/weboldal:/var/www/html kontener:latest

A konténer logokban konkrétan nincs semmi. Kipróbáltam legalább 15-20 php és apache konténert a docker hubról, egyik sem vált be, a legtöbb rosszabb volt, mint a sajátom.

Én még kezdő vagyok a docker világában, pár hete kezdtem el vele foglalkozni, szóval örömmel veszek minden tanácsot, segítséget! Köszönöm!

 

______________________________________________________________________________

Ezt kellett beszúrnom a megoldáshoz az apache reverse proxyn: ProxyPreserveHost On

Hozzászólások

Elsőre host oldali jogosultság problémának tűnik, mintha a dockernek nem lenne írási joga a weboldal tartalmához (selinux vagy hiányzó rw osztott könyvtár opció miatt).

a kontenerben futo cuccok garantaltan nem a host uid/gid mappingjet hasznaljak.

`docker exec -it kontener_neve /bin/valamilyen_shell` es ott meg tudod nezni, hogy miatokvan. image faragaskor kezihajtanyban szoktamvolt installalni mindenfelet a kontenerbe be, hogy lehessen debuggolni a gondokat. a docker log, khm, nem szoszatyar. :DDD

Ehhez mázli kell. Ha a host-on felveszel 1-2 user-t, máris elcsúszik.

Amikor megunom a host könyvtár mount-olás okozta jogosultsági gondokat, volume-ot adok neki, az mindig működik. Persze odafigyeléssel meg meg sok debuggal ki lehet fésülni, de akkor már kevesebb meló és sok szempontból egészségesebb megoldás a volume. Pl security

Gondolom nem leszek népszerű az ötlettel, de: túl nagy munka lenne át/újraírni? nem olyan halálosan nagy kaland a php verzióugrás.. csak mert ha a szmötyit becsomagold attól még szmötyi marad :(.

Az apache-od biztosan figyel a 80as porton?

a listen address-e

  • wildcard
  • vagy a container épp aktuális ip-je?

/*nem célszerű a hostra közvetlenk kirakni a szolgáltatást, erre docker network & valami reverse -t szokás használni pl 

 - https://containo.us/traefik/

 - nginx

 - haproxy

etc*/

Én egyáltalán nem értek a php kódhoz, ezt a weboldalt örököltem, próbálom életben tartani. A tulajdonosa egy BAZ megyei pici falu Önkormányzata, szívességből adminisztrálom a szervert, ők nem tudnak egy fejlesztő céget ezzel megbízni.

Az apache biztosan a 80-ason figyel, localhostra bindeltem, és van egy apache rev proxy is elé téve.

Az is megfordult a fejemben, hogy hagyom a fenébe, és tiszta lappal összedobok egy új wordpress alapú weboldalt nekik, amihez feltehetőleg hosszú évekig lesz frissítés.

Hűha, ez így elég erős! De végre nem egy politikával, népszaporulattal, használati szokásokkal foglalkozó post. :)

A CentOS6-nak az idén fog lejárni a támogatása, de az a PHP már öt és fél éve nem támogatott! Ezt azért nem árt szem előtt tartani.
Azzal, hogy a SELinux-ot is lekapcsolod... szerintem eldobod az utolsó hajszálnyi esélyed a túlélésre.

De ha ezt most figyelmen kívül hagyjuk, akkor: 

Csináltam egy dockerfájlt, amibe pontosan ugyanazokat a lépéseket vettem fel, mint a teszt szerveren

  • Ha OS konténert akarsz építeni VM helyett (most egy kicsit olyan), akkor azt javaslom, hogy használj inkább LXC/LXD-t,
  • Ha APP konténert szeretnél csinálni, akkor ezt a pár soros Dockerfile-t alaposan dolgozd még át... Én már a FROM miatt eldobnám a merge request-ed, de ha eltekintünk minden javaslattól, akkor is fölösleges layer-eket csinálsz. (A yum clean-ed konkrétan nagyobbá és nem kisebbé fogja tenni az image-ed.) https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

Nem világos számomra, hogy milyen repo-t használsz a PHP-hoz, de ilyen legacy dolgoknál Remi-é jó választás lehet, mert van olyan elvetemült/elhivatott, hogy visszafelé is patch-elt egy csomó hibát:
https://rpms.remirepo.net/

Kipróbáltam legalább 15-20 php és apache konténert a docker hubról

A Docker nem sandbox, szerintem nem is biztonságos. Vigyázz vele, hogy csak olyat futtass a gépeden, amit legalább nagyjából átlátsz/értesz. Amit csak lehet, azt csatold read-only módban.

Én még kezdő vagyok a docker világában

A konténerek világában. A Docker csak egy lehetőség és szerintem nem a legjobb.
Mi a host OS-ed? Ha valami RHEL-alapú (SELinux-ból tippelek csak), akkor hagyd a buta Docker-t és használj Podman-t. ;)

"If I had six hours to chop down a tree, I'd spend the first four hours sharpening the axe."

Szerkesztve: 2020. 02. 29., szo – 10:50

-v /srv/weboldal:/var/www/html:z

Mi volna, ha a docker run volume végéhez hozzáadnál egy :z-t? Bár ez SELinux esetén lehet fontos, ha írni is szeretnéd.

Kipróbáltam, hogy ha direktben csatlakozom a konténerhez, akkor rendben működik a weboldal, tehát szűkül a kör, jobb híján a rev.proxym konfigja lehet a szar:

<VirtualHost *:80>
  ServerName example.com
  DocumentRoot /srv/dockervhost/
  ErrorLog logs/error.log
  TransferLog logs/access.log
  LogLevel warn

  ProxyPass        /  http://127.0.0.1:1080/
  ProxyPassReverse /  http://127.0.0.1:1080/

  <Directory "/srv/dockervhost/">
    AllowOverride All
    Require all granted
    Options Indexes
  </Directory>

</VirtualHost>

Itt tartok most...

Nincs ugyanaz a mappa volumeban beadva másik kontnernek is?

Nemrég tapasztaltam, hogy (windows alatti linux konténereknél) ha több konténer is ugyanazt a mappát kapja meg mint volume, akkor nem mennek át a módosítások.

Konkrétan a host fájlrendszerében lementettem amit kellett, közben a konténeren belül ha szerkesztővel belenéztem a fájlba, akkor nem ment át semmi. Amikor a két konténer nem osztozott pontosan ugyanazon a mappán, megszűnt a probléma. (az oké, ha egy almappát kap meg a másik)

Lehet, hogy nem a fenti eset okozta nálam a gondot, majd az idő megmondja, azért egy próbát tehetsz te is, ha esetleg nálad is van átfedés a volume-k között.