Подтвердить что ты не робот

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;"
4b9b3361

Ответ 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 в режиме переднего плана.