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

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

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

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

  1. прикрепление докеров

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

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

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

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

  1. bash Командная строка

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

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

    • "docker run" создает новый контейнер, поэтому предыдущие изменения не будут сохранены.
    • "docker start" запустит существующий контейнер, поэтому предыдущие изменения все равно будут находиться в контейнере, однако вам нужно найти правильный идентификатор контейнера среди многих с одинаковым идентификатором изображения. Необходимость "фиксации докеров" для подавления версий при желании.
    • Ctrl-C остановит контейнер при выходе. Вы хотите добавить "&" в конце, чтобы контейнер мог запускать фон и выдавал подсказку при нажатии клавиши ввода.

Ответ 3

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

Чтобы достичь оболочки, вместо "attach" у вас есть две возможности:

  • docker exec -it <container_id> /bin/bash

или

  1. запустить демон ssh в контейнере, отобразить порт ssh, а затем ssh в контейнер.