Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在虚拟机中访问Django Docker应用程序?_Django_Docker_Azure Virtual Machine - Fatal编程技术网

如何在虚拟机中访问Django Docker应用程序?

如何在虚拟机中访问Django Docker应用程序?,django,docker,azure-virtual-machine,Django,Docker,Azure Virtual Machine,目前,我正在尝试访问一个简单的Django应用程序,它是我在Azure虚拟机中创建的。由于应用程序仍然很简单,我只想通过访问http://VM_IP:PORT/。我能够做到这一点,但当我尝试将项目归档并从本地机器访问构建的映像时,它无法工作 我已经在Azure门户中进行了一些设置,以便虚拟机能够侦听特定端口;在本例中为8080(因此http://VM_IP:8080/)。我是Docker的新手,所以我假设我为项目创建的Dockerfile中缺少了一些东西 Dockerfile 运行mkdir/a

目前,我正在尝试访问一个简单的Django应用程序,它是我在Azure虚拟机中创建的。由于应用程序仍然很简单,我只想通过访问
http://VM_IP:PORT/
。我能够做到这一点,但当我尝试将项目归档并从本地机器访问构建的映像时,它无法工作

我已经在Azure门户中进行了一些设置,以便虚拟机能够侦听特定端口;在本例中为8080(因此
http://VM_IP:8080/
)。我是Docker的新手,所以我假设我为项目创建的Dockerfile中缺少了一些东西

Dockerfile

运行mkdir/app
WORKDIR/app
#将当前目录代码添加到工作目录
加上/应用程序/
#设置默认环境变量
环境蟒蛇缓冲1
环境语言C.UTF-8
环境DEBIAN_前端=非交互
#设置项目环境变量
#通过Python的os.environ获取这些,这里这些是100%可选的
环境端口=8080
#安装系统依赖项
运行apt-get-update&&apt-get-install-y--不建议安装\
tzdata\
python3安装工具\
python3-pip\python3-dev\
蟒蛇静脉\
吉特\
&& \
善待清洁&&\
rm-rf/var/lib/apt/lists/*
#安装环境依赖项
运行pip3安装--升级pip
运行pip3安装pipenv
#安装项目依赖项
运行pipenv安装--跳过锁定--系统--开发
暴露8888
CMD gunicorn simple_project.wsgi:application--bind 0.0.0.0:$PORT

我不知道发生了什么事。如果有人能指出我遗漏了什么,我将不胜感激?提前感谢。

我怀疑问题可能是您将
EXPOSE
构建时指令与
publish
运行时标志混淆了。如果没有后者,主机将无法访问VM上的任何容器

一些背景:

EXPOSE
指令被认为是最好的文档;它对容器网络没有影响
。从:

EXPOSE指令实际上并不发布端口。它作为构建映像的人员和运行容器的人员之间的一种文档类型,用于发布哪些端口

乍一看似乎有点奇怪,但这是有充分理由的:映像本身没有声明主机端口映射的权限-这取决于容器运行时和操作它的人(您!)

方法是将
--publish
-p
标志传递给
docker run
命令,允许您定义容器网络中打开的端口与主机上的端口之间的映射。例如,如果我想运行一个可以在本地主机上的8080端口访问的
nginx
容器,我会运行:
docker-run--rm-d-p8080:80nginx
。然后可以在主机上的
localhost:8080
上访问正在运行的容器。当然,您也可以使用它将容器端口从一个主机公开到另一个主机如果没有此选项,Dockerfile中的任何网络配置都将在容器网络的上下文中执行,主机基本上无法访问。

TL;DR:当您在虚拟机上创建并运行容器时,您可能只需要发布端口:
docker run-p{VM\u host\u port}:{container\u port}{image\u name}
。请注意,不能为现有容器添加或更改端口映射;您必须销毁容器并重新创建它


旁注:虽然
docker run
快速简便,但随着项目的增长,以及您添加环境变量、附加卷、定义容器间依赖关系等,它会很快变得难以管理。本机支持的另一种选择是
docker compose
,它允许您在YAML中声明性地定义容器(或多个容器)的运行时配置-基本上从Dockerfile停止的地方开始。一旦设置好,您就可以运行
docker compose up
,而不必键入冗长的
docker
命令,并且在忘记包含标志时浪费时间进行调试。就像我们使用
Dockerfile
s对如何构建我们的图像进行声明性、版本控制的描述一样,我喜欢将docker compose视为一种创建声明性、版本控制的描述的方法,用于描述如何运行和编排映像



希望这有帮助

您使用的基本图像是什么?我在这里看不到语句中的
。当您访问
http://VM_IP:8080/
?您是否能够成功构建并运行它?您如何运行容器?谢谢!这真的很有帮助;特别是
docker-run-p{vm\u-host\u-port}:{container\u-port}{image\u-name}