Z mojego artykułu na temat automatyzacji wdrożeń dokerów :
Obrazy dokerów kontra kontenery
W Dockerland są obrazy i pojemniki . Oba są ściśle powiązane, ale odrębne. Dla mnie zrozumienie tej dychotomii ogromnie wyjaśniło Dockerowi.
Co to jest obraz?
Obraz jest obojętnym, niezmiennym plikiem, który jest zasadniczo migawką kontenera. Obrazy są tworzone za pomocą komendy build i po uruchomieniu z runem utworzą kontener . Obrazy są przechowywane w rejestrze Docker, takim jak register.hub.docker.com . Ponieważ mogą one stać się dość duże, obrazy są zaprojektowane tak, aby składały się z warstw innych obrazów, co pozwala na przesłanie minimalnej ilości danych podczas przesyłania obrazów przez sieć.
Lokalne obrazy można wyświetlić, uruchamiając docker images
:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Kilka rzeczy do zapamiętania:
- IMAGE ID to pierwsze 12 znaków prawdziwego identyfikatora obrazu. Możesz utworzyć wiele tagów danego obrazu, ale ich identyfikatory będą takie same (jak wyżej).
- WIRTUALNY ROZMIAR jest wirtualny, ponieważ sumuje rozmiary wszystkich różnych leżących poniżej warstw. Oznacza to, że suma wszystkich wartości w tej kolumnie jest prawdopodobnie znacznie większa niż miejsce na dysku używane przez wszystkie te obrazy.
- Wartość w kolumnie REPOSITORY pochodzi z
-t
flagi docker build
polecenia lub z docker tag
-ing istniejącego obrazu. Możesz oznaczać obrazy za pomocą nomenklatury, która ma dla ciebie sens, ale wiedz, że doker użyje tego znacznika jako lokalizacji rejestru w docker push
lub docker pull
.
- Pełna forma tagu to
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. W przypadku ubuntu
powyższego wnioskuje się, że REGISTRYHOST registry.hub.docker.com
. Więc jeśli planujesz przechowywać obraz wywoływany my-application
w rejestrze w docker.example.com
, powinieneś oznaczyć ten obraz docker.example.com/my-application
.
- Kolumna TAG jest tylko częścią [: TAG] pełnego tagu. To niefortunna terminologia.
latest
Tag nie jest magiczne, to po prostu domyślny tag jeśli nie określisz znacznik.
- Nieoznaczone zdjęcia można rozpoznać tylko na podstawie ich identyfikatorów. Te dostanie
<none>
TAG i repozytorium. Łatwo o nich zapomnieć.
Więcej informacji na temat obrazów można znaleźć w dokumentacji i glosariuszu Docker .
Co to jest pojemnik?
Aby użyć metafory programowania, jeśli obraz jest klasą, to kontener jest instancją klasy - obiektem wykonawczym. Mamy nadzieję, że kontenery używają Dockera; są lekkimi i przenośnymi obudowami środowiska, w którym można uruchamiać aplikacje.
Przeglądaj lokalne działające kontenery za pomocą docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Tutaj uruchamiam dokowaną wersję rejestru rejestru, dzięki czemu mam prywatne miejsce do przechowywania moich zdjęć. Znów kilka rzeczy do zapamiętania:
- Podobnie jak IMAGE ID, CONTAINER ID jest prawdziwym identyfikatorem kontenera. Ma tę samą formę, ale identyfikuje inny rodzaj obiektu.
docker ps
wyświetla tylko działające kontenery. Możesz wyświetlić wszystkie kontenery ( uruchomione lub zatrzymane ) za pomocą docker ps -a
.
- NAZWY mogą być użyte do identyfikacji uruchomionego kontenera za pomocą
--name
flagi.
Jak uniknąć gromadzenia obrazu i kontenera
Jedną z moich wczesnych frustracji związanych z Dockerem było pozornie ciągłe gromadzenie się nieoznaczonych obrazów i zatrzymanych pojemników . W kilku przypadkach takie nagromadzenie powodowało, że maksymalne dyski twarde spowalniały mój laptop lub wstrzymywały proces automatycznego budowania. Mów o „wszędzie kontenerach”!
Możemy usunąć wszystkie nieoznaczone obrazy, łącząc się docker rmi
z ostatnim dangling=true
zapytaniem:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker nie będzie w stanie usunąć obrazów znajdujących się za istniejącymi kontenerami, więc może być konieczne usunięcie docker rm
najpierw zatrzymanych kontenerów :
docker rm `docker ps --no-trunc -aq`
Są to znane dolegliwości związane z Dockerem i mogą zostać uwzględnione w przyszłych wydaniach. Jednak dzięki jasnemu zrozumieniu obrazów i pojemników można uniknąć tych sytuacji za pomocą kilku praktyk:
- Zawsze usuwaj bezużyteczny, zatrzymany pojemnik za pomocą
docker rm [CONTAINER_ID]
.
- Zawsze usuwaj obraz za bezużyteczny, zatrzymany pojemnik
docker rmi [IMAGE_ID]
.