繁体   English   中英

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

[英]How to access Django Docker app in a Virtual Machine?

目前,我正在尝试访问我在 Azure 虚拟机中创建的简单 Django 应用程序。 由于应用程序还很简单,我只想访问“安装成功!恭喜!” 通过访问http://VM_IP:PORT/从我的本地机器页面。 我能够做到这一点,但是当我尝试 Dockerize 项目并从我的本地机器访问构建的图像时,它不起作用

我已经在 Azure 门户中进行了一些设置,以便虚拟机能够侦听特定端口; 在这种情况下是 8080(所以http://VM_IP:8080/ )。 我对 Docker 很陌生,所以我假设我为该项目创建的 Dockerfile 中缺少一些东西。

文件

RUN mkdir /app
WORKDIR /app

# Add current directory code to working directory
ADD . /app/

# set default environment variables
ENV PYTHONUNBUFFERED 1
ENV LANG C.UTF-8
ENV DEBIAN_FRONTEND=noninteractive

# set project environment variables
# grab these via Python's os.environ# these are 100% optional here
ENV PORT=8080
# Install system dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
        tzdata \
        python3-setuptools \
        python3-pip \        python3-dev \
        python3-venv \
        git \
        && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# install environment dependencies
RUN pip3 install --upgrade pip
RUN pip3 install pipenv

# Install project dependencies
RUN pipenv install --skip-lock --system --dev

EXPOSE 8888
CMD gunicorn simple_project.wsgi:application --bind 0.0.0.0:$PORT

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

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

一些背景:

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

EXPOSE 指令实际上并不发布端口。 它充当构建镜像的人和运行容器的人之间的一种文档,关于打算发布哪些端口。

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

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

TL;DR:您可能只需要在 VM 上创建和运行容器时发布端口: docker run -p {vm_host_port}:{container_port} {image_name} 请注意,不能为现有容器添加或更改端口映射; 您必须销毁容器并重新创建它。


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


希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM