Docker容器/镜像正在运行,但没有端口号

8

我正在尝试将我构建的Django项目运行在Docker上,并为我的项目创建一个镜像和容器,以便我可以将它推送到我的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

你可以看到没有端口号,所以我不知道如何通过本地机器上的web浏览器访问容器。
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"]

退出(1)11秒钟前 - 你可能需要检查Docker日志,因为这看起来(至少对我来说)似乎有些东西阻止了Django的正常启动。当Django进程退出时,端口可能已被释放。 - Shadow
1
@JabariDash 在这种情况下,EXPOSE指令实际上并不重要 - 他已经在命令行上转发了端口。我认为docker日志肯定会更有趣。 - Shadow
1
@Shadow 听起来很合理。我不知道在命令中使用端口转发会实际暴露端口,这很好知道。在这种情况下,你可能是正确的。应用程序某些方面出现问题了。 - user5063151
我在哪里可以找到Docker服务器的URL/名称?@Shadow,以便在我的Web浏览器上查看该URL。 - Omar Jandali
当我运行 docker run -p 8000:80 test_3 时,它不应该给我一个带有正在运行的 Docker 容器的扩展名的某种类型的 URL 吗?但它什么也没有做。它只是给了我一条空白的线路,没有任何东西……通常会显示以下内容: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
显示剩余5条评论
3个回答

3

这道题中的这一行帮助揭示了问题;

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)(在状态列中)表示主进程已经以代码 1 的状态退出 - 通常意味着发生了错误。当任何原因导致主进程结束时,docker 容器停止运行,这将释放端口。 您需要查看日志来诊断原因docker logs 01cc 将显示具有以 01cc 开头的 ID 的 docker 容器的日志。 您应该发现阅读这些内容将帮助您了解问题所在。无论容器正在运行还是停止,知道此命令都将极大地帮助您调试 docker 中的奇怪问题。
另一种“快速”的方法是在运行命令中删除 -d。 这将使您的容器内联运行而不是作为守护程序运行。

1
那么你已经得到了答案。你的 CMD 命令是错误的。你可能想要写成 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] - Shadow
我创建并运行了一个包含你所建议的添加的新项目镜像,但是当我尝试运行时,出现以下问题: 在新容器中运行命令 (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
您的Docker服务器地址。 - Shadow
所以我必须将它推送到Docker上,然后放入链接中... @Shadow - Omar Jandali
我在哪里找到Docker服务器的URL? - Omar Jandali
显示剩余4条评论

2

创建Docker化的Django种子项目

django-admin.py startproject djangoapp

需要一个requirements.txt文件列出Python依赖项

cd djangoapp/

运行以下命令创建Docker化所需的文件

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

2
当您创建容器时,发布了端口。如果成功构建,则可以通过端口8000访问您的容器。但是,正如Shadow指出的那样,您的容器退出并出现错误。这就是为什么您必须在docker container ls命令中添加-a标志的原因。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 我也遇到过类似的问题,当我尝试运行第一个docker实例时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接