[英]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.