Что мне делать, если показ портов в Dockerfile не вступает в силу? - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть следующий Dockerfile для запуска сервера Nginx, но я не могу заставить Docker открыть порт 80 через мой хост-компьютер, чтобы я мог получить к нему внешний доступ:

FROM ubuntu:latest
EXPOSE 80
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y dist-upgrade
RUN apt-get -y install nginx 
CMD service nginx start

Если я запускаюСледуя команде после создания образа, docker run -p 80:80 -d nginxserver, я могу получить правильные глобальные настройки для вступления в силу, однако мой недавно созданный контейнер Docker не работает постоянно и завершается через короткую секунду.

Если я попытаюсь docker run -it /bin/bash -d nignxserver, это позволит моему контейнеру Docker работать, однако я не смогу подключиться к серверу Nginx за пределами хост-машины.

Если я попытаюсь docker run -p 80:80 -it /bin/bash -d nignxserver, произойдет сбой со следующим сообщением об ошибке:

docker: Ответ об ошибке от демона: Ошибка создания среды выполнения OCI: container_linux.go: 348: запуск процесса контейнера вызвал "exec: \" - it \ ": исполняемый файл не найден в $ PATH": неизвестно.

Какое здесь правильное решение?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Вам нужно запустить с --privileged для прослушивания портов менее 1024.

Кроме того, service nginx start существуют немедленно (это покрыто Дэвидом Лабиринтом)

Вы должны вместо этого использовать CMD nginx

0 голосов
/ 18 декабря 2018

Лучшее решение - просто использовать стандартное изображение nginx , если вы вообще не собираетесь настраивать изображение.

Если вы пишете собственное изображение,Вы должны широко предполагать, что команды типа service просто не работают.CMD изображения, которое вы показываете (при условии, что оно успешно), пытается запустить nginx в качестве фоновой службы;после запуска в фоновом режиме основной процесс контейнера завершается и контейнер завершается.CMD, как правило, должен запускать один процесс, который контейнер запускает на переднем плане .

С точки зрения ваших различных вращений docker run параметры всегда располагаются в одном и том же порядке:

docker run \
  -d -p 80:80 \           # docker-specific options
  nginxserver \           # the image name
  nginx -g 'daemon off;'  # the command to run and its options

Если вы укажете альтернативную команду (например, /bin/bash), которая будет запускать вместо основного процесса контейнера, и если контейнер обычно запускает сетевой сервер, вы получите оболочкувместо./bin/bash - это команда, а не аргумент -it;такая же разбивка будет

docker run \
  --rm -i -t \            # docker-specific options
  nginxserver \           # the image name
  /bin/bash               # the command to run and its options 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...