З моєї статті про автоматизацію розгортання Docker :
Docker Images vs. Containers
У Докерленді є зображення, є контейнери . Два тісно пов'язані, але чіткі. Для мене розуміння цієї дихотомії надзвичайно прояснило Докера.
Що таке зображення?
Зображення - це інертний, незмінний файл, який по суті є знімком контейнера. Зображення створюються за допомогою команди збірки , і вони будуть створювати контейнер при запуску із запуску . Зображення зберігаються в реєстрі Docker, таких як register.hub.docker.com . Оскільки вони можуть стати досить великими, зображення розроблені таким чином, щоб вони складалися з шарів інших зображень, що дозволяє надсилати мінімальну кількість даних при передачі зображень по мережі.
Локальні зображення можна перерахувати, виконавши 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
Деякі речі, які слід зазначити:
- IMAGE ID - це перші 12 символів справжнього ідентифікатора для зображення. Ви можете створити багато тегів даного зображення, але їх ідентифікатори будуть однаковими (як вище).
- ВІРТУАЛЬНИЙ РОЗМІР є віртуальним, оскільки він додає розміри всіх різних підстилаючих шарів. Це означає, що сума всіх значень у цьому стовпчику, ймовірно, набагато більша, ніж дисковий простір, який використовується для всіх цих зображень.
- Значення в стовпці REPOSITORY походить від
-t
прапора docker build
команди або від docker tag
-ing наявного зображення. Ви можете тегувати зображення за допомогою номенклатури, яка має сенс для вас, але знайте, що докер використовуватиме тег як місце реєстру в docker push
або docker pull
.
- Повна форма тегу така
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Для ubuntu
вищевикладеного, REGISTRYHOST вважається рівним registry.hub.docker.com
. Отже, якщо ви плануєте зберігати ваше зображення, викликане my-application
в реєстрі, на docker.example.com
, ви повинні позначити це зображення docker.example.com/my-application
.
- Стовпець TAG - це лише [: TAG] частина повного тегу. Це прикро термінологія.
latest
Тег не чарівна, це просто тег за замовчуванням , якщо ви не вкажете тег.
- Ви можете мати марковані зображення, які можна впізнати лише за їх ідентифікаторами IMAGE. Вони отримають
<none>
TAG та REPOSITORY. Про них легко забути.
Більш детальна інформація про зображення доступна в документації та словнику Docker .
Що таке контейнер?
Для використання метафори програмування, якщо зображення є класом, контейнер - це екземпляр класу - об'єкт виконання. Маємо надію, що контейнери використовуєте Docker; вони легкі та портативні інкапсуляції середовища, в якому можна запускати програми.
Переглядайте локальні запущені контейнери за допомогою 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
Тут я запускаю докерізовану версію реєстру докерів, щоб у мене було приватне місце для зберігання зображень. І знову:
- Як ідентифікатор IMAGE, ідентифікатор CONTAINER є істинним ідентифікатором контейнера. Він має однакову форму, але він ідентифікує різний вид об’єкта.
docker ps
виводить тільки запущені контейнери. Ви можете переглядати всі контейнери ( запущені або зупинені ) за допомогою docker ps -a
.
- NAMES можна використовувати для ідентифікації запущеного контейнера через
--name
прапор.
Як уникнути нарощування зображень та контейнерів
Одним із моїх ранніх розчарувань у Докера було, здавалося б, постійне нарощування нетазованих зображень та зупинених контейнерів . За декілька випадків цього накопичення призвело до того, що змішані жорсткі диски сповільнили мій ноутбук або зупинили автоматизований конвеєр побудови. Говоріть про "контейнери скрізь"!
Ми можемо видалити всі немальовані зображення, поєднавши docker rmi
з останнім dangling=true
запитом:
docker images -q --filter "dangling=true" | xargs docker rmi
Докер не зможе видалити зображення, які стоять за існуючими контейнерами, тому вам, можливо, доведеться спочатку видалити зупинені контейнери docker rm
:
docker rm `docker ps --no-trunc -aq`
Це відомі больові точки з Докером, і вони можуть бути вирішені в майбутніх випусках. Однак, маючи чітке розуміння зображень та контейнерів, цих ситуацій можна уникнути за допомогою кількох практик:
- Завжди виймайте непотрібну, зупинену ємність
docker rm [CONTAINER_ID]
.
- Завжди знімайте зображення за непотрібним, зупиненим контейнером
docker rmi [IMAGE_ID]
.