Я пытаюсь получить проект 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"]
Мы можем увидеть Dockerfile
? Убедитесь, что в вашем Dockerfile есть строка EXPOSE 80
@JabariDash Директива EXPOSE в данном случае не имеет значения - он перенаправил порт в командной строке. Я думаю, что журналы докеров определенно будут интереснее.
@Shadow Это честно. Я не знал, что порт переадресовывает команду, как будто он действительно открывает порт. Хорошо знать. В таком случае вы, вероятно, правы. Приложение каким-то образом не работает.
как мне проверить логи докеров ... @Shadow
Если я хочу поместить экспозицию в файл докера вместо того, чтобы вводить порт в команде запуска, куда бы я поместил его ... @JabariDash
@OmarJandali docker logs <container_id>
(в вашем примере docker logs 01cc817
должен подойти) или, что еще более лениво, отбросьте -d
и запустите его встроенным.
где я могу найти URL-адрес / имя сервера докеров @Shadow, чтобы увидеть URL-адрес в моем веб-браузере
когда я запускаю 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
Похоже на проблему с буферизацией потока ... Попробуйте CMD ["python" "-u" "manage.py"
и т. д. Это должно отключить его.
Когда вы создали контейнер, вы опубликовали порты. Ваш контейнер будет доступен через порт 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.
Тогда у вас есть ответ. Ваш CMD неверен. Вы, наверное, хотели написать CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Я создал и запустил новый образ своего проекта с добавлением, которое вы предложили, и когда я попытался его запустить, я получил следующее: 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
Ага, в команде допустил опечатку. Исправлено сейчас. Также не позволяйте тому факту, что django работает в докере, отвлекает вас - он по-прежнему будет вести себя так же, как если бы вы запускали его вне докера.
Ничего из этого не имеет значения, пока процесс не заработает (но ваша команда была правильной в первый раз с -p8000:80
)
Итак, теперь он запущен. как я могу узнать, работает ли он в моем браузере: 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-адресе
Адрес вашего докер-сервера.
так что я должен подтолкнуть его, чтобы докер его, а затем вставить ссылку .... @Shadow
где мне найти URL-адрес докер-сервера
django-admin.py startproject djangoapp
cd djangoapp/
cat <<EOF > requirements.txt
Django
psycopg2
EOF
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
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
Exited (1) 11 seconds ago
- вам может потребоваться проверить журналы докеров, поскольку это выглядит (по крайней мере, для меня), что что-то помешало правильному запуску django. Вероятно, порты были освобождены после выхода из процесса django.