🐳 Docker Compose Up или Start и Down или Stop: в чем разница

by itisgood

Для новичка в docker-compose такие термины, как docker-compose up, start, down и stop, могут быть совершенно непонятными.

Эта статья объясняет разницу с подробными примерами.

Если вы новичок в Docker Compose и изучаете его по различным руководствам, вы можете столкнуться с такими терминами, как docker-compose up, docker-compose up -d, docker-compose start, docker-compose down или даже docker-compose stop.

Этих терминов достаточно, чтобы запутать новичка в docker, потому что многие из этих команд docker-compose ведут себя очень похоже.

На самом деле, поначалу может быть особенно трудно сразу отличить docker-compose up от docker-compose start.

Разве запуск контейнера через Docker Compose не то же самое, что выполнение команды up?

Не совсем!

Давайте рассмотрим все это более подробно.

Различия между командами Docker Compose up, up -d, stop, start, down и down -v

Что делают эти команды:

  • Команда Docker Compose up развертывает сервисы веб-приложений и создает свежие новые контейнеры из образа docker вместе с настройкой сетей, томов и всех конфигураций, указанных в файле Docker Compose. Когда вы указываете -d, это означает, что вы просите команду запустить ее в отделенном режиме, чтобы она работала в фоновом режиме, предоставляя вам контроль над терминалом (об этом будет рассказано ниже на нескольких примерах).
  • Команда Docker Compose stop останавливает все сервисы, связанные с конфигурацией Docker Compose. Она НЕ удаляет ни контейнеры, ни связанные с ними внутренние тома или сети.
  • Команда Docker Compose start запустит все остановленные сервисы, которые были указаны в остановленной конфигурации, основанной на том же файле Docker Compose.
  • Команда Docker Compose down останавливает все сервисы, связанные с конфигурацией Docker Compose. В отличие от stop, она также удаляет любые контейнеры и внутренние сети, связанные с сервисами. Но НЕ внутренние указанные тома. Для этого необходимо дополнительно указать флаг -v после команды down.

Это похоже на команду Docker run и start верно?

🐳 Как использовать команду Docker run

Достаточно теории, давайте теперь рассмотрим несколько практических примеров.

Понимание разницы на практическом примере

Убедитесь, что у вас уже установлен Docker и Docker Compose.

docker-compose up
Pulling ghost (ghost:4.20.3)...
4.20.3: Pulling from library/ghost
b380bbd43752: Pull complete
8d36a6ce056a: Pull complete
f75fe68b8e22: Pull complete
44f6d143e12f: Pull complete
0ebe8063dedd: Pull complete
f984e0e37c5a: Pull complete
ce2320facea8: Pull complete
898c3dbc1716: Pull complete
45c37559f24a: Pull complete
Digest: sha256:b332684117bfa05329298712ad0ffcfc4a83ce6314332e073978f46be3c05e81
Status: Downloaded newer image for ghost:4.20.3
Creating ghost_ghost_1 ... done
Attaching to ghost_ghost_1
ghost_1  | [2021-10-26 07:02:05] INFO Ghost is running in production...
ghost_1  | [2021-10-26 07:02:05] INFO Your site is now available on https://ghost.domain.com/
ghost_1  | [2021-10-26 07:02:05] INFO Ctrl+C to shut down
ghost_1  | [2021-10-26 07:02:05] INFO Ghost server started in 0.369s
ghost_1  | [2021-10-26 07:02:06] WARN Database state requires initialisation.
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: posts
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: posts_meta
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: users
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: oauth
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: posts_authors
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: roles
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: roles_users
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: permissions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: permissions_users
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: permissions_roles
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: settings
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: tags
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: posts_tags
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: invites
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: brute
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: sessions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: integrations
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: webhooks
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: api_keys
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: mobiledoc_revisions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: products
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: offers
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: benefits
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: products_benefits
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_products
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_payment_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_login_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_email_change_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_status_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_product_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_paid_subscription_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: labels
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_labels
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_stripe_customers
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_stripe_customers_subscriptions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: offer_redemptions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: members_subscribe_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: stripe_products
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: stripe_prices
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: actions
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: emails
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: email_batches
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: email_recipients
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: tokens
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: snippets
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: temp_member_analytic_events
ghost_1  | [2021-10-26 07:02:06] INFO Creating table: custom_theme_settings
ghost_1  | [2021-10-26 07:02:06] INFO Model: Product
ghost_1  | [2021-10-26 07:02:06] INFO Model: Tag
ghost_1  | [2021-10-26 07:02:06] INFO Model: Role
ghost_1  | [2021-10-26 07:02:06] INFO Model: Permission
ghost_1  | [2021-10-26 07:02:07] INFO Model: User
ghost_1  | [2021-10-26 07:02:07] INFO Model: Post
ghost_1  | [2021-10-26 07:02:08] INFO Model: Integration
ghost_1  | [2021-10-26 07:02:08] INFO Relation: Role to Permission
ghost_1  | [2021-10-26 07:02:08] INFO Relation: Post to Tag
ghost_1  | [2021-10-26 07:02:08] INFO Relation: User to Role
ghost_1  | [2021-10-26 07:02:08] INFO Database is in a ready state.
ghost_1  | [2021-10-26 07:02:08] INFO Ghost database ready in 3.309s
ghost_1  | [2021-10-26 07:02:09] INFO Ghost booted in 4.457s
ghost_1  | [2021-10-26 07:02:09] INFO Adding offloaded job to the queue
ghost_1  | [2021-10-26 07:02:09] INFO Scheduling job update-check at 49 27 22 * * *. Next run on: Tue Oct 26 2021 22:27:49 GMT+0000 (Coordinated Universal Time)
ghost_1  | [2021-10-26 07:02:51] INFO "GET /favicon.ico" 200 7ms
ghost_1  | [2021-10-26 07:02:51] INFO "GET /" 200 605ms
ghost_1  | [2021-10-26 07:02:51] INFO "GET /assets/built/screen.css?v=dde6c321bb" 200 5ms
ghost_1  | [2021-10-26 07:02:51] INFO "GET /assets/built/casper.js?v=dde6c321bb" 200 3ms
ghost_1  | [2021-10-26 07:02:52] INFO "GET /members/api/member/" 204 1ms
ghost_1  | [2021-10-26 07:02:52] INFO "GET /members/api/site/" 200 14ms
ghost_1  | [2021-10-26 07:02:52] INFO "GET /favicon.ico" 200 2ms

Итак, что мы видим?

Без опции -d вы запускаете свой конфиг, но это происходит в режиме verbose, без возврата к подсказке терминала.

Очень полезно, не так ли?

Но что если выйти из консоли с помощью Ctrl+Z?

Процесс останется запущенным в фоновом режиме, и вы можете проверить это с помощью команды docker ps:

$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS          PORTS                                                                      NAMES
563a45d049cf   ghost:4.20.3                             "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes    2368/tcp                                                                   ghost_ghost_1

Но что произойдет с контейнером, если вместо этого использовать Ctrl+C?

Процесс сразу же будет убит.

 docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS          PORTS                                                                      NAMES

Когда вы используете опцию -d, ее действие очень похоже на Ctrl+Z: она отсоединяется от консоли и продолжает запускать контейнер в фоновом режиме, а также выводит новое имя контейнера (в данном случае ghost_ghost_1).

Теперь, вместо использования docker-compose down, давайте воспользуемся docker-compose stop:

docker-compose stop

Теперь проверим наши запущенные контейнеры.

Ожидаемо, их не должно быть:

docker-compose ps
    Name                   Command               State    Ports
---------------------------------------------------------------
ghost_ghost_1   docker-entrypoint.sh node  ...   Exit 0 

Обратите внимание, что я не использовал docker ps.

Вместо этого я запустил docker-compose ps, потому что хотел показать вам другой способ проверки состояния Exit 0.

Это означает, что контейнер остановился.

Давайте перепроверим это с помощью docker ps -a.

Флаг -a также будет искать остановленные контейнеры:

$ docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED         STATUS                     PORTS                                                                      NAMES
44d09e778a91   ghost:4.20.3                             "docker-entrypoint.s…"   8 minutes ago   Exited (0) 7 minutes ago                                                                              ghost_ghost_1

Что же такое docker-compose start?

Docker Compose Start имеет смысл только тогда, когда вы не удалили ни один контейнер с помощью docker-compose down (что я еще не сделал в этой командной строке).

В общем, разница в том, что он запускает контейнеры, которые были остановлены, но не удалены.

Итак, для начала давайте используем start вместо up и посмотрим, что произойдет:

$ docker-compose start
Starting ghost ... done

Теперь остановленный контейнер запускается снова:

t$ docker-compose ps
    Name                   Command               State    Ports  
-----------------------------------------------------------------
ghost_ghost_1   docker-entrypoint.sh node  ...   Up      2368/tcp

Вот так.

Теперь статус up, а не Exit 0.

Вы также можете перепроверить с помощью docker ps:

$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED          STATUS              PORTS                                                                      NAMES
44d09e778a91   ghost:4.20.3                             "docker-entrypoint.s…"   22 minutes ago   Up About a minute   2368/tcp                                                                   ghost_ghost_1

Теперь давайте снова выполним команду stop.

$ docker-compose stop
Stopping ghost_ghost_1 ... done

Теперь вы знаете, в каком состоянии находится контейнер.

Вы можете использовать команду up или start, чтобы снова запустить его.

Обратите внимание, что вы также можете запустить down в этом состоянии без повторного запуска служб:

$ docker-compose down
Removing ghost_ghost_1 ... done
Network net is external, skipping

Теперь контейнер удален.

Если бы в файле Docker Compose были указаны внутренние сети, они также были бы удалены.

Поскольку сеть net является внешней, она пропущена при удалении.

Если бы вы дополнительно указали флаг -v:

$ docker-compose down -v
Stopping ghost_ghost_1 ... done
Removing ghost_ghost_1 ... done
Network net is external, skipping
Volume ghost is external, skipping

Всегда будьте вдвойне осторожны со своими данными!

Бонусный совет: Обратите внимание, что поскольку я использую внешний том (созданный ранее с помощью “docker volume create volume-name”), использование “-v” не удаляет его. Он предназначен только для томов, созданных из ваших спецификаций Docker Compose. Но, напротив, “docker volume prune” удалит внешний том, даже если он используется контейнером!

Также на этом этапе нельзя использовать команду start.

Она работает только для остановленных конфигураций:

$ docker-compose start
Starting ghost ... failed
ERROR: No containers to start

В этом случае необходимо снова использовать docker-compose up или docker-compose up -d.

docker-compose up -d
Creating ghost_ghost_1 ... done

Заключение

Надеюсь, эта статья помогла вам лучше понять, что такое up vs up -d vs start, а также stop vs down и down -v для Docker Compose.

см. также:

 

You may also like

Leave a Comment