Obraz to jedno z podstawowych pojęć Dockera. Zrozumienie go stanowi punkt wyjścia do pracy z kontenerami. W tym wpisie zostało zdefiniowanie pojęcie obrazu oraz przedstawiono podstawowe operacje jakie można wykonać na obrazie.
Ten wpis jest częścią serii wpisów o Dockerze. Jeżeli jakieś pojęcie jest używane bez wyjaśnienia to prawdopodobnie zostało wprowadzone w jednym z wcześniejszych wpisów.
* Zachęcamy również do zapoznania się z odświeżonymi w grudniu 2021 i styczniu 2022 artykułami nt. Dockera, które znajdziecie pod tym wpisem.
Wstęp
Obraz jest ujednoliconą kolekcją warstw UFS (Union File System). Każda warstwa jest wynikiem wykonania pewnej czynności podczas tworzenia obrazu, np. instalacji pakietu, skopiowania danych, ustawienia zmiennej środowiskowej. Warstwy obrazu są dostępne tylko do odczytu (Rys. 1).
Obraz stanowi podstawę do stworzenia kontenera. Nawiązując do programowania obiektowego relację pomiędzy obrazem i kontenerem można porównać do relacji pomiędzy klasą i jej instancją.
Pobieranie
Podstawowym źródłem obrazów jest repozytorium obrazów Dockera: docker hub. W repozytorium znajduje się wiele oficjalnych obrazów, np. ubuntu, postgres, redis, node oraz nieoficjalne obrazy stworzone przez użytkowników Dockera.
Obraz z repozytorium Dockera można pobrać za pomocą polecenia:
docker pull [nazwa obrazu]
Wszystkie nazwy obrazów zbudowane są w formacie: [nazwa repozytorium]:[tag]
. Składowa [tag]
pozwala zidentyfikować konkretną wersję obrazu w repozytorium, np. 15.04
, stable
. Składowa [tag]
jest opcjonalna i w przypadku jej braku zostanie pobrana najnowsza wersja obrazu z repozytorium, która domyślnie jest oznaczana tagiem latest
. Nazwy obrazów nieoficjalnych są dodatkowo poprzedzone nazwą użytkownika, do którego należy repozytorium: [nazwa użytkownika]/[repozytorium]:[tag]
.
docker pull ubuntu:15.10
Jeżeli obraz został już wcześniej pobrany wtedy Docker wykryje to i w razie potrzeby zaktualizuje go pobierając najnowsze warstwy. Jeżeli obraz nie istnieje lokalnie wtedy Docker pobierze wszystkie jego warstwy.
b3309467c75a: Pulling fs layer
3d46f652aa89: Pulling fs layer
b90ed059f9d0: Pulling fs layer
a427f0b2488f: Pulling fs layer
Wyświetlanie
Wszystkie lokalnie dostępne obrazy można wyświetlić za pomocą polecenia:
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 15.10 5eb72b199374 4 weeks ago 131.4 MB
redis latest 0643f0c7d17d 4 weeks ago 109.2 MB
postgres latest b305a133422a 4 weeks ago 265.1 MB
Historia
Każdy obraz Dockera powstaje w wyniku wykonania szeregu poleceń. Każde z tych poleceń tworzy osobną warstwę obrazu. Listę wszystkich warstw składających się na obraz można wyświetlić za pomocą polcenia:
docker history [id lub nazwa obrazu]
Zapoznanie się z tym poleceniem może pomóc lepiej zrozumieć warstwową naturę obrazów i kontenerów Dockera. Poniżej znajduje się skrócony wykaz warstw obrazu postgres
. Widać po nim, że każda warstwa jest wynikiem wykonania jakiegoś polecenia, np. instalacji pakietu, stworzenia zmiennej środowiskowej, stworzenia katalogu.
IMAGE CREATED CREATED BY SIZE
[...]
11f38e247778 4 weeks ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0 B
f114dda4521b 4 weeks ago /bin/sh -c ENV LANG=en_US.utf8 0 B
c27cdb916a4a 4 weeks ago /bin/sh -c apt-get update && apt-get install 19.47 MB
[...]
Polecenia tworzące warstwy obrazu można też przejrzeć czytając kod źródłowym obrazu. Plik z kodem źródłowym jest nazywany „Dockerfile”. Pliki źródłowe wszystkich obrazów znajdujących się w repozytorium Dockera są publicznie dostępne. Omówienie składni plików źródłowych obrazów jest tematem na osobny wpis i na tym etapie dobrze jest podejść do nich czysto poglądowo.
Usuwanie
Obraz można usunąć za pomocą polecenia:
docker rmi [nazwa lub id obrazu]
Docker nie dostarcza pojedynczego polecenia usuwającego wszystkie obrazy. Efekt ten można osiągnąć poprzez złożenie dwóch standardowych poleceń: znanego już docker rmi
oraz docker images -q
, które zwraca listę identyfikatorów wszystkich obrazów.
docker rmi $(docker images -q)
* Zaktualizowane w 2021 i 2022 artykuły nt. Dockera
- Docker dla programistów: co to jest?
- Docker dla programistów – budowa pierwszego środowiska. Część I
- Docker dla programistów – budowa środowiska rozwojowego. Część II
- Docker dla programistów – dystrybucja aplikacji
Zostaw komentarz