Из моей статьи об автоматизации развертывания Docker :
Изображения Docker против Контейнеров
В Dockerland есть изображения и есть контейнеры . Два тесно связаны, но различны. Для меня, понимание этой дихотомии очень сильно прояснило Докера.
Что такое изображение?
Изображение - это инертный, неизменный файл, который по сути является снимком контейнера. Образы создаются командой build , и они будут создавать контейнер при запуске с run . Изображения хранятся в реестре Docker, например registry.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
Некоторые вещи, на которые стоит обратить внимание:
- ИД ИЗОБРАЖЕНИЯ - это первые 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 и хранилище. Про них легко забыть.
Дополнительную информацию об изображениях можно найти в документации и глоссарии 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 ID, CONTAINER ID является истинным идентификатором контейнера. Он имеет ту же форму, но идентифицирует другой тип объекта.
docker ps
только выводит запущенные контейнеры. Вы можете просмотреть все контейнеры ( запущенные или остановленные ) с помощью docker ps -a
.
- Имена могут быть использованы для идентификации запущенного контейнера через
--name
флаг.
Как избежать накопления изображения и контейнера
Одним из моих ранних разочарований в Docker было, казалось бы, постоянное накопление нетегированных изображений и остановленных контейнеров . В некоторых случаях такое накопление приводило к тому, что использование жестких дисков максимально увеличивало скорость работы моего ноутбука или останавливало конвейер автоматической сборки. Поговорим о «контейнерах везде»!
Мы можем удалить все непомеченные изображения в сочетании docker rmi
с последним dangling=true
запросом:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker не сможет удалить изображения, которые находятся за существующими контейнерами, поэтому вам, возможно, придется удалить остановленные контейнеры с docker rm
первым:
docker rm `docker ps --no-trunc -aq`
Это известные болевые точки с Docker и могут быть рассмотрены в будущих версиях. Тем не менее, при четком понимании изображений и контейнеров, таких ситуаций можно избежать с помощью нескольких практик:
- Всегда удаляйте ненужный, остановленный контейнер с
docker rm [CONTAINER_ID]
.
- Всегда удаляйте изображение за бесполезным, остановленным контейнером с
docker rmi [IMAGE_ID]
.