Автоматически запускать службы в контейнере 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