簡體   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