/ február 14, 2018/ docker/ 0 comments

A docker-ben a lemezképek csak olvasható rétegekként vannak tárolva. Amikor elindítunk egy konténert, a docker fog egy ilyen csak olvasható réteget és fölérak egy írhatót. Ha módosítunk egy fájlt, ebben a legfelső rétegben fog csak módosulni. Ha letöröljük a konténert és újra elindítjuk, minden felsőbb réteg eltűnik, így visszatérünk a kezdeti állapothoz. Ezt tudja a Union fájlrendszer.

Ahhoz, hogy a módosított adatok megmaradjanak, illetve hogy adatot tudjunk megosztani konténerek között, köteteket kell használni. A kötetek a gazdagépen található egyszerű könyvtárak és fájlok. Semmi közük a fentebb említett Union fájlrendszerhez.

Lemezkép indításkor a -v kapcsolóval adható meg. Például: -v /data. Ekkor a konténerünk /data könyvtára a gazdagép /var/lib/docker/volumes/[konténer azonosító]/_data könyvtárának fog megfelelni. Ez a docker inspect paranccsal látható is. Ugyanezt érhetjük el ha a -v helyett a dockerfile-ba írunk egy VOLUME /data sort. A köteteket a docker volume paranccsal is vizsgálhatjuk. A –volumes-from kapcsolóval egy másik konténer is elérheti egy konténer kötetét.

Régebben még “adatkonténereket” használtunk az adatok megosztására. Most már csak elnevezzük a kötetet a docker volume create –name paranccsal.

Azt gondolhatnánk, hogy a követekző működni fog:

FROM debian:wheezy
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data

De nem. A VOLUME sor után a köteten már nem tudunk módosítani. Ez fog működni:

FROM debian:wheezy
RUN useradd foo
RUN mkdir /data && touch /data/x
RUN chown -R foo:foo /data
VOLUME /data

A docker okosan átmásol minden fájlt a kötetre és beállítja a jogosultságokat. (Akkor nem csinálja meg, ha megadjuk a gazdagépen is a könyvtárat). Ha nem tudjuk megadni egy RUN paranccsal a jogosultságokat, adjuk meg a CMD vagy ENTRYPOINT szkriptekben.

Amikor docker rm-el törlünk konténereket, ott maradnak árva kötetek a rendszerben. Kivéve ha a -v paranccsal törlünk, vagy a -rm paranccsal futtatjuk és másik konténer nem hivatkozik rá. Azok a kötetek ahol megadtuk a host könyvtárat is, sosem törlődnek maguktól. A kötetek kilistázhatók a docker volume ls paranccsal. A nem használt kötetek így törölhetők:

docker volume rm $(docker volume ls -q)

 

Leave a Comment