Автоматически запускать службы в контейнере Docker

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

docker ps

Я делаю docker attach container_id и запускаю службу apache2.

Затем с главной консоли я передаю контейнер изображению.

После выхода из контейнера, если я попытаюсь запустить контейнер или попытаюсь запустить один новый контейнер из зафиксированного изображения, служба всегда будет остановлена.

Как создать или перезапустить один контейнер с запущенными службами, например apache?

Ответ 1

EDIT: Я много узнал о Docker с тех пор, как я опубликовал этот ответ. "Автоматическое запуск сервисов в контейнерах Docker" не является хорошим примером использования Docker. Вместо этого используйте что-то вроде fleet, Kubernetes или даже Monit/SystemD/Upstart/Init.d/Cron для автоматического запуска служб, которые выполняются внутри контейнеров Docker.

ОРИГИНАЛЬНЫЙ ОТВЕТ: Если вы запускаете контейнер с помощью команды /bin/bash, вы можете выполнить это следующим образом: fooobar.com/questions/155978/...

Итак, если вы запускаете контейнер с docker run -i -t IMAGE /bin/bash, и если вы хотите автоматически запускать apache2 при запуске контейнера, отредактируйте /etc/bash.bashrc в контейнере и добавьте /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf (или что бы вы сделали с командой запуска apache2) к новой строке в конце файла.

Сохраните изменения изображения и перезапустите его с помощью docker run -i -t IMAGE /bin/bash, и вы найдете apache2, который будет запущен при подключении.

Ответ 2

В качестве опции вы могли бы использовать диспетчер процессов, например Supervisord, для запуска нескольких процессов. Кто-то выполнил это с помощью sshd и mongodb: https://github.com/justone/docker-mongodb

Ответ 3

Думаю, ты не можешь. Что вы можете сделать, так это создать образ с помощью Dockerfile и определить CMD в этом, который будет запущен при запуске контейнера. См. Документацию по строителю для основ (https://docs.docker.com/reference/builder/) и см. Автоматическое выполнение службы в docker container для получения информации о поддержании работы вашего сервиса.

Вам не нужно автоматизировать это с помощью файла Docker. Вы также можете создать изображение с помощью ручной фиксации, как и вы, и запустить ее в командной строке. Затем вы предоставляете команду, которую он должен выполнить (это именно то, что делает Dockerfile CMD). Вы также можете переопределить CMD Dockerfiles таким образом: будет выполнен только последний CMD, который является командой командной строки, если вы запустите контейнер, используя один. Примером может служить основная команда docker run -i -t base /bin/bash из документации. Если ваша команда слишком длинная, вы можете создать удобство script, конечно.

Ответ 4

По дизайну контейнеры запускаются в отключенном режиме, когда корневой процесс используется для запуска контейнера. Вам нужно запустить службу Apache в режиме FOREGROUND.

docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND

Ссылка: https://docs.docker.com/engine/reference/run/#detached-vs-foreground