Вы должны думать о контейнере Docker как о пакете вокруг одного работающего демона. Идеальный контейнер Docker запускает один процесс и только один процесс. В частности, Systemd настолько тяжеловесен и инвазивен, что его трудно запустить в контейнере Docker; если вам нужно несколько процессов в контейнере, то для вас может работать более легкая система инициализации, такая как supervisord, но это, как правило, исключение больше, чем стандартная упаковка.
Docker имеет официальное руководство по созданию и запуску пользовательских образов , которое стоит прочитать; это довольно типичный пример использования Docker. В частности, рекомендуется написать Dockerfile, в котором описано, как создать образ и включить его в систему контроля версий. Контейнеры должны избегать постоянных данных, если они могут (хранение всего во внешней базе данных идеально); если вы меняете изображение, вам нужно удалить и воссоздать все контейнеры на его основе. Если локальные данные неизбежны, то либо тома Docker, либо связывание монтирует , что позволит вам хранить данные "вне" контейнера.
Хотя в Docker есть несколько других способов создания контейнеров и изображений, ни один из них не является настолько воспроизводимым. Вам следует избегать команд import
, export
и commit
; и вы должны использовать save
и load
, только если вы не можете использовать или настроить реестр Docker и вынуждены перемещать образы между системами через файл tar.
По вашим конкретным вопросам:
Q1. Я подозреваю, что лучшая причина, по которой пути создания изображений, отличные от docker build
, не позволяют легко указывать такие вещи, как CMD
, это просто деталь реализации: если вы посмотрите на docker history
изображения, вы увидите CMD
становится его собственным слоем. Не беспокойтесь об этом и используйте Dockerfile.
Q2. Значение по умолчанию CMD
, любые установленные переменные ENV
и другие связанные метаданные хранятся в изображении вместе с деревом файловой системы. (После запуска контейнера у него появляется обычное дерево процессов Unix с начальным процессом pid 1.)
Q3. Вы не «запускаете систему в контейнере». Обычно запускайте один процесс или службу в контейнере и независимо управляйте их жизненными циклами.