Контейнер / образ Docker запущен, но нет номера порта

Я пытаюсь получить проект django, который я создал для запуска в докере, и создать образ и контейнер для моего проекта, чтобы я мог отправить его в свой профиль dockerhub.

Теперь у меня все настроено, и я создал исходный образ своего проекта. Однако, когда я запускаю его, я не получаю номер порта, прикрепленный к контейнеру. Мне это нужно, чтобы проверить, действительно ли работает контейнер.

Вот что у меня есть:

Successfully built a047506ef54b
Successfully tagged test_1:latest
(MySplit) omars-mbp:mysplit omarjandali$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
test_1                        latest              a047506ef54b        14 seconds ago      810MB

(MySplit) omars-mbp:mysplit omarjandali$ docker run --name testing_first -d -p 8000:80 test_1
01cc8173abfae1b11fc165be3d900ee0efd380dadd686c6b1cf4ea5363d269fb

(MySplit) omars-mbp:mysplit omarjandali$ docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
01cc8173abfa        test_1              "python manage.py ru…"   13 seconds ago      Exited (1) 11 seconds ago                       testing_first
(MySplit) omars-mbp:mysplit omarjandali$ Successfully built a047506ef54b

Вы можете видеть, что номера порта нет, поэтому я не знаю, как получить доступ к контейнеру через локальный компьютер в моем веб-браузере.

dockerfile:

FROM python:3
WORKDIR tab/
COPY requirements.txt ./

RUN pip install -r requirements.txt
COPY . .
CMD ["python", "manage.py", "runserver", "0.0.0.0"]
Exited (1) 11 seconds ago - вам может потребоваться проверить журналы докеров, поскольку это выглядит (по крайней мере, для меня), что что-то помешало правильному запуску django. Вероятно, порты были освобождены после выхода из процесса django.
Shadow 02.05.2018 05:02

Мы можем увидеть Dockerfile? Убедитесь, что в вашем Dockerfile есть строка EXPOSE 80

Jabari Dash 02.05.2018 05:03

@JabariDash Директива EXPOSE в данном случае не имеет значения - он перенаправил порт в командной строке. Я думаю, что журналы докеров определенно будут интереснее.

Shadow 02.05.2018 05:05

@Shadow Это честно. Я не знал, что порт переадресовывает команду, как будто он действительно открывает порт. Хорошо знать. В таком случае вы, вероятно, правы. Приложение каким-то образом не работает.

Jabari Dash 02.05.2018 05:06

как мне проверить логи докеров ... @Shadow

Omar Jandali 02.05.2018 05:07

Если я хочу поместить экспозицию в файл докера вместо того, чтобы вводить порт в команде запуска, куда бы я поместил его ... @JabariDash

Omar Jandali 02.05.2018 05:09

@OmarJandali docker logs <container_id> (в вашем примере docker logs 01cc817 должен подойти) или, что еще более лениво, отбросьте -d и запустите его встроенным.

Shadow 02.05.2018 05:14

где я могу найти URL-адрес / имя сервера докеров @Shadow, чтобы увидеть URL-адрес в моем веб-браузере

Omar Jandali 02.05.2018 05:52

когда я запускаю docker run -p 8000:80 test_3, он не должен давать мне какой-то URL-адрес с расширением для запущенного docker conatiner .. он ничего не делает. он просто дает мне пустую строку без чего-либо ... он обычно отображает следующий System check identified no issues (0 silenced). May 02, 2018 - 03:55:30 Django version 2.0.2, using settings 'mysplit.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C. Я не понимаю, что здесь @Shadow

Omar Jandali 02.05.2018 05:55

Похоже на проблему с буферизацией потока ... Попробуйте CMD ["python" "-u" "manage.py" и т. д. Это должно отключить его.

Shadow 02.05.2018 08:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
10
6 451
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Когда вы создали контейнер, вы опубликовали порты. Ваш контейнер будет доступен через порт 8000, если он будет успешно построен. Однако, как указал Тень, ваш контейнер завершился с ошибкой. Вот почему вы должны добавить флаг -a в свою команду docker container ls. docker container ls показывает только запущенные контейнеры без флага -a.

Я рекомендую отказаться от флага отсоединения -d, чтобы узнать, что вызывает ошибку. Затем создайте новый контейнер после того, как вы успешно запустили тот, над которым работаете. Или просто выполните следующие команды, как только исправите проблему. docker stop testing_first, затем docker container rm testing_first, наконец, запустите ту же команду, что и раньше. docker run --name testing_first -d -p 8000:80 test_1

У меня возникли аналогичные проблемы с первыми экземплярами докеров, которые я пытался запустить.

Ответ принят как подходящий

Эта строчка из вопроса помогает выявить проблему;

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
01cc8173abfa        test_1              "python manage.py ru…"   13 seconds ago      Exited (1) 11 seconds ago                       testing_first

Exited (1) (из столбца STATUS) означает, что основной процесс уже завершился с кодом состояния 1 - обычно это означает ошибку. Это освободило бы порты, поскольку контейнер докеров прекращает работу, когда основной процесс завершается по любой причине.

Вам необходимо просмотреть журналы, чтобы определить причину.

docker logs 01cc покажет журналы контейнера докеров, идентификатор которого начинается с 01cc. Вы должны обнаружить, что чтение этих материалов поможет вам на вашем пути. Знание этой команды очень поможет вам в устранении странностей в докере, независимо от того, запущен ли контейнер или остановлен.

Альтернативный «быстрый» способ - отбросить -d в вашей команде запуска. Это заставит ваш контейнер работать встроенным, а не как демон.

Получил следующее: CommandError: "0.0.0.0" is not a valid port number or address:port pair.

Omar Jandali 02.05.2018 05:22

Тогда у вас есть ответ. Ваш CMD неверен. Вы, наверное, хотели написать CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Shadow 02.05.2018 05:22

Я создал и запустил новый образ своего проекта с добавлением, которое вы предложили, и когда я попытался его запустить, я получил следующее: Run a command in a new container (MySplit) omars-mbp:mysplit omarjandali$ docker run test_2 usage: manage.py runserver [-h] [--version] [-v {0,1,2,3}] [--settings SETTINGS] [--pythonpath PYTHONPATH] [--traceback] [--no-color] [--ipv6] [--nothreading] [--noreload] [--nostatic] [--insecure] [addrport] manage.py runserver: error: unrecognized arguments: 8000

Omar Jandali 02.05.2018 05:28

Ага, в команде допустил опечатку. Исправлено сейчас. Также не позволяйте тому факту, что django работает в докере, отвлекает вас - он по-прежнему будет вести себя так же, как если бы вы запускали его вне докера.

Shadow 02.05.2018 05:29

Ничего из этого не имеет значения, пока процесс не заработает (но ваша команда была правильной в первый раз с -p8000:80)

Shadow 02.05.2018 05:31

Итак, теперь он запущен. как я могу узнать, работает ли он в моем браузере: ONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7932e349bb95 test_3 "python manage.py ru…" 3 seconds ago Up 5 seconds 0.0.0.0:8000->80/tcp eager_babbage показывает порт, но что я должен указать в URL-адресе

Omar Jandali 02.05.2018 05:33

Адрес вашего докер-сервера.

Shadow 02.05.2018 05:36

так что я должен подтолкнуть его, чтобы докер его, а затем вставить ссылку .... @Shadow

Omar Jandali 02.05.2018 05:37

где мне найти URL-адрес докер-сервера

Omar Jandali 02.05.2018 05:44

Создан проект семян Dockerise django

django-admin.py startproject djangoapp

Нужен файл requirements.txt с описанием зависимостей Python

cd djangoapp/

Выполните следующую команду для создания файлов, необходимых для докеризации

cat <<EOF > requirements.txt
Django
psycopg2
EOF

Dockerfile

cat <<EOF > Dockerfile

FROM python:3.6
ENV PYTHONUNBUFFERED 1
RUN mkdir /app
WORKDIR /app
ADD requirements.txt /app/
RUN pip install -r requirements.txt
ADD . /app/

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
EOF

docker-compose.yml

cat <<EOF > docker-compose.yml

version: "3.2"    
services:
  web:
    image: djangoapp
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "8000:8000"
EOF

Запустите приложение с

docker-compose up -d

Другие вопросы по теме