Как запустить контейнер докера в качестве сервера
Я хотел бы запустить контейнер докеров, на котором размещено простое веб-приложение, однако я не понимаю, как создавать/запускать изображение в качестве сервера. Например:
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
Но теперь я больше не могу подключиться к оболочке, чтобы проверить, что происходит, если приложение действует.
Есть ли способ запустить контейнер в фоновом режиме (как мы это сделаем для vm), таким образом, который позволяет прикреплять/отсоединять оболочку от хоста? Или я полностью не хватаю точку?
Ответы
Ответ 1
Последний аргумент 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
, чтобы сначала настроить конфигурацию.
Эта статья дает хороший полный пример запуска приложения node в контейнере.
Ответ 2
Пользователи docker склонны считать контейнер полной VM, в то время как концепция дизайна докеров больше ориентирована на оптимальную контейнерную обработку, а не на имитацию VM внутри контейнера.
Оба правильные, однако некоторые детали реализации нелегко познакомиться в начале. Я пытаюсь обобщить некоторые различия в реализации таким образом, который легче понять.
SSH был бы самым прямым способом войти в виртуальную машину Linux (или контейнер), однако многие докционированные шаблоны не имеют установленного ssh-сервера. Я считаю, что это связано с оптимизацией и соображениями безопасности для контейнера.
- прикрепление докеров
Прикрепление докеры может быть удобно, если вы работаете как готовое. Однако с точки зрения написания это нестабильно - https://github.com/docker/docker/issues/8521. Может быть связан с настройкой SSH, но не уверен, когда он полностью исправлен.
- рекомендуемые практики докеров (nsenter и т.д.)
Некоторые альтернативы (или лучшие практики в некотором смысле), рекомендованные Докером по адресу https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
Эта практика в основном отделяет измененные элементы от контейнера и сопоставляет их в некоторых местах на докер-хосте, чтобы их можно было манипулировать вне контейнера и/или сохраняться. Может быть хорошей практикой в производственной среде, но не сейчас, когда больше проектов, связанных с докерами, находятся вокруг среды разработки и промежуточной среды.
- bash Командная строка
"docker exec -it {container id} bash" облако - очень удобный и практичный инструмент для входа в машину.
-
Некоторые основы
- "docker run" создает новый контейнер, поэтому предыдущие изменения не будут сохранены.
- "docker start" запустит существующий контейнер, поэтому предыдущие изменения все равно будут находиться в контейнере, однако вам нужно найти правильный идентификатор контейнера среди многих с одинаковым идентификатором изображения. Необходимость "фиксации докеров" для подавления версий при желании.
- Ctrl-C остановит контейнер при выходе. Вы хотите добавить "&" в конце, чтобы контейнер мог запускать фон и выдавал подсказку при нажатии клавиши ввода.
Ответ 3
В исходный вопрос вы можете связать некоторый файл, как вы упомянули, для продолжения процесса.
Чтобы достичь оболочки, вместо "attach" у вас есть две возможности:
-
docker exec -it <container_id> /bin/bash
или
- запустить демон ssh в контейнере, отобразить порт ssh, а затем ssh в контейнер.