Как запустить контейнер Docker в качестве сервера

Я хотел бы запустить док-контейнер, в котором размещается простое веб-приложение, однако я не понимаю, как спроектировать/запустить образ в качестве сервера. Например:

docker run -d -p 80:80 ubuntu:14.04 /bin/bash

Это запустит и немедленно выключит контейнер. Вместо этого мы можем запустить его интерактивно:

docker run -i -p 80:80 ubuntu:14.04 /bin/bash

Это работает, но теперь мне нужно держать открытой интерактивную оболочку для каждого запущенного контейнера? Я бы предпочел просто запустить его и работать в фоновом режиме. Хак будет использовать команду, которая никогда не возвращается:

docker run -d -p 80:80 {image} tail -F /var/log/kern.log

Но теперь я больше не могу подключиться к оболочке, чтобы проверить, что происходит, если приложение капризничает.

Есть ли способ запустить контейнер в фоновом режиме (как мы сделали бы для виртуальной машины), чтобы можно было подключить/отключить оболочку от хоста? Или я полностью упускаю суть?


person Jeroen    schedule 11.07.2014    source источник
comment
Вы можете смонтировать папку с вашего хост-компьютера в /var/log, чтобы иметь легкий доступ к журналам контейнера: docker run -d -p 80:80 -v /tmp/log:/var/log {image} /foregroundapp   -  person jchysk    schedule 13.07.2014


Ответы (3)


Последний аргумент docker run — это команда для запуска внутри контейнера. Когда вы запускаете docker run -d -p 80:80 ubuntu:14.04 /bin/bash, вы запускаете bash в контейнере и ничего более. На самом деле вы хотите запустить свое веб-приложение в контейнере и поддерживать этот контейнер в рабочем состоянии, поэтому вам следует выполнить docker run -d -p 80:80 ubuntu:14.04 /path/to/yourapp.

Но ваше приложение, вероятно, зависит от некоторой конфигурации для запуска. Если он считывает свою конфигурацию из переменных среды, вы можете использовать аргументы -e key=value с docker run. Если вашему приложению требуется файл конфигурации, вам, вероятно, следует сначала использовать Dockerfile для настройки конфигурации.

Эта статья представляет собой хороший полный пример запуска приложения узла в контейнер.

person Ben Whaley    schedule 11.07.2014
comment
Думаю проблема в том, что мое приложение уже деамонизировано (в контейнере используется стандартный apache2 от ubuntu). - person Jeroen; 12.07.2014
comment
Ах, так что вам просто нужно запустить apache на переднем плане в качестве вашей команды. - person Ben Whaley; 12.07.2014
comment
Что ж, у меня настроены все переменные среды, и я уверен, что мое приложение будет работать так, как вы описали. Однако какой смысл в файле докеров, если мне нужно вручную запустить приложение при запуске контейнера докеров. Я хочу поместить все шаги в файл докера, и только то, что должен сделать пользователь моего образа, - это запустить его. - person Stan Sokolov; 10.11.2016

Пользователи Docker склонны считать контейнер полноценной виртуальной машиной, в то время как концепция дизайна Docker больше ориентирована на оптимальную контейнеризацию, а не на имитацию виртуальной машины внутри контейнера.

Оба варианта верны, однако с некоторыми деталями реализации не так просто ознакомиться в начале. Я пытаюсь обобщить некоторые различия в реализации так, чтобы их было легче понять.

  1. SSH

SSH был бы самым простым способом войти внутрь виртуальной машины (или контейнера) Linux, однако во многих докеризованных шаблонах не установлен сервер ssh. Я считаю, что это связано с оптимизацией и безопасностью контейнера.

  1. докер прикрепить

docker attach может быть удобен, если работает как готовый. Однако на момент написания он нестабилен - https://github.com/docker/docker/issues/8521. Может быть связано с настройкой SSH, но не уверен, когда это будет полностью исправлено.

  1. рекомендуемые практики докера (nsenter и т. д.)

Некоторые альтернативы (или в каком-то смысле лучшие практики), рекомендованные Docker по адресу https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker./

Эта практика в основном выделяет изменяемые элементы из контейнера и сопоставляет их с некоторыми местами в хосте докера, чтобы ими можно было манипулировать извне контейнера и/или сохранять. Это может быть хорошей практикой в ​​производственной среде, но не сейчас, когда больше проектов, связанных с докером, сосредоточено вокруг среды разработки и промежуточной среды.

  1. командная строка баш

Облако «docker exec -it {container id} bash» будет очень удобным и практичным инструментом для доступа к машине.

  1. Некоторые основы

    • "docker run" creates a new container so previous changes will not be saved.
    • «docker start» запустит существующий контейнер, поэтому предыдущие изменения все еще будут в контейнере, однако вам нужно найти правильный идентификатор контейнера среди множества с одинаковым идентификатором изображения. Необходимо «фиксировать докер», чтобы подавить версии, если это необходимо.
    • Ctrl-C остановит контейнер при выходе. Вы захотите добавить «&» в конце, чтобы контейнер мог работать в фоновом режиме и давал вам подсказку при нажатии клавиши ввода.
person Community    schedule 28.05.2015

На исходный вопрос вы можете добавить какой-нибудь файл, как вы упомянули, чтобы процесс продолжался.

Чтобы добраться до оболочки, вместо «прикрепить» у вас есть два варианта:

  1. docker exec -it <container_id> /bin/bash

Or

  1. запустите демон ssh в контейнере, сопоставьте порт ssh, а затем ssh в контейнер.
person Guruprasad GV    schedule 05.03.2016
comment
это не то, чем я хочу заниматься. Конечно, я могу войти в контейнер и запустить свой сервер... однако это не моя цель. Контейнер должен запускаться с работающим моим сервером без каких-либо дополнительных действий. Я не хочу входить в контейнер каждый раз, когда он запускается, и запускать свой сервер. Это должно быть автоматизировано. - person Stan Sokolov; 10.11.2016
comment
@StanSokolov выглядит так, будто ты не понял. Сервер запускается с контейнером в качестве демона. Позже, если вы захотите войти в оболочку, у вас есть два вышеуказанных варианта. - person Guruprasad GV; 13.11.2016