Dockerized nginx не запускается
Я пробовал следовать некоторым учебным пособиям и документации по докетированию моего веб-сервера, но мне не удается запустить службу через команду запуска docker.
Это мой файл Docker:
FROM ubuntu:trusty
#Update and install stuff
RUN apt-get update
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx
#Add files
ADD src/main/resources/ /usr/share/nginx/html
EXPOSE 80
CMD service nginx start
Я создаю свое изображение:
docker build -t myImage .
И когда я запустил его:
docker run -p 81:80 myImage
он просто останавливается:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90e54a254efa pms-gui:latest /bin/sh -c service n 3 seconds ago Exit 0 prickly_bohr
Я ожидаю, что это будет работать с портом 81- > 80, но это не так. Выполнение
docker start 90e
похоже, ничего не делает.
Я также попытался ввести его напрямую
docker run -t -i -p 81:80 myImage /bin/bash
и отсюда я могу начать службу
service nginx start
и с другой вкладки я вижу, что он работает по назначению (также в моем браузере):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
408237a5e10b myImage:latest /bin/bash 12 seconds ago Up 11 seconds 0.0.0.0:81->80/tcp mad_turing
Итак, я предполагаю, что это то, что я делаю неправильно с моим Dockerfile? Может ли кто-нибудь помочь мне в этом, я совершенно новый для Докера. Спасибо!
РЕШЕНИЕ: На основе ответа от Ivant я нашел другой способ запустить nginx на переднем плане. Мой Dockerfile CMD теперь выглядит следующим образом:
CMD /usr/sbin/nginx -g "daemon off;"
Ответы
Ответ 1
Контейнер Docker выполняется до тех пор, пока выполняется команда, указанная с помощью CMD
, ENTRTYPOINT
или через командную строку. В вашем случае команда service
заканчивается сразу, и весь контейнер выключается.
Один из способов исправить это - запустить nginx непосредственно из командной строки (убедитесь, что вы не запускаете его как демон).
Другой вариант - создать небольшой script, который запустит службу, а затем будет спать вечно. Что-то вроде:
#!/bin/bash
service nginx start
while true; do sleep 1d; done
и запустите это вместо прямого запуска команды service
.
Третьим вариантом было бы использовать что-то вроде runit или аналогичной программы вместо обычной службы.
Ответ 2
На данный момент официальное изображение nginx использует это для запуска nginx (см. Dockerfile):
CMD ["nginx", "-g", "daemon off;"]
В моем случае этого было достаточно, чтобы начать правильно. Есть онлайн-учебники, предлагающие более неудобные способы достижения этого, но приведенное выше кажется довольно чистым.
Ответ 3
Использование docker-compose:
Чтобы выполнить рекомендуемое решение, добавьте docker-compose.yml:
command: nginx -g "daemon off"
Я также обнаружил, что могу просто добавить nginx.conf:
daemon off;
... и продолжаем использовать в docker-compose.yml:
command: service nginx start
... хотя это сделает файл конфигурации менее портативным внешним докером.
Ответ 4
Docker - очень хороший индекс официальных и пользовательских образов. Когда вы хотите что-то сделать, есть вероятность, что кто-то уже это сделал;)
Просто найдите "nginx" на index.docker.io, вы увидите, что есть официальное изображение nginx: https://registry.hub.docker.com/_/nginx/
Здесь у вас есть полное руководство, чтобы помочь вам запустить веб-сервер.
Не забудьте взглянуть на другие пользователи nginx, чтобы увидеть варианты:)
Идея состоит в том, чтобы запустить nginx в режиме переднего плана.