【问题标题】:Deploying with docker使用 docker 部署
【发布时间】:2021-08-19 06:54:02
【问题描述】:

我是使用 docker 部署的新手。实际上,我在 docker 容器内的计算机上运行我的 django 应用程序,它在端口 localhost:8080 上成功运行。然后我将代码拉到远程服务器并启动 docker-compose up,应用程序也在那里成功运行。我想问的是,如何借助服务器的ip地址查看应用程序?例如,如果 ip 地址是 123.45.67.89,我认为应用程序应该在 123.45.67.89:8080 中运行,但它不会在那里运行。如何访问远程服务器容器中运行的应用程序?

附:我没用过nginx,应该用吗?

docker-compose.yml

【问题讨论】:

  • 如果您分享您如何启动 docker 容器、端口映射等,将会有所帮助。如果 docker 容器已正确配置,它应该可以按照您的描述工作,除非有防火墙规则阻止它。
  • @Stefano 我添加了 docker-compose.yml 的图像
  • PNG 文件不可运行且难以阅读。请编辑问题以将 YAML 文件的文本(不是图像)直接包含在问题中(不在链接后面)。
  • (您应该不需要单独将代码拉到远程服务器;它应该已经包含在图像中。)

标签: django docker deployment docker-compose remote-server


【解决方案1】:

这个问题的答案很大程度上取决于您在哪里托管生产应用程序,以及它为您提供的现成服务类型。

一般来说,生产服务器通常在容器化应用程序前面有一些反向代理或应用程序负载平衡器。

由于您是从 docker 开始的,并且我假设这是一个个人或小型应用程序,因此我可以推荐以下内容:

  1. 如果您在托管服务提供商方面比较灵活,请尝试Digital Ocean。它们对开发人员非常友好,并且具有成本效益,至少在一定规模之前是这样。
  2. 使用自动docker nginx-proxy。该工具可让您在 docker-compose.yml 文件中添加几行代码,并神奇地获得已配置的 nginx 代理,而无需了解有关 nginx 的任何信息。

我正在使用这种方法将多个个人网站部署到单个低成本服务器。

docker-compose.yml 的示例可能如下所示:

services:
  nginx:
    image: nginxproxy/nginx-proxy
    ports: ["${PORT:-80}:80"]
    restart: always
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      DEFAULT_HOST: www.yoursite.com

  app:
    depends_on: [nginx]
    restart: always
    image: your/image
    environment:
      VIRTUAL_HOST: myapp.localhost,www.yoursite.com

这基本上告诉 nginx-proxy 在http://myapp.localhosthttp://www.yoursite.com 上为您的应用程序提供服务。

当然,您需要将您的域 DNS 指向您的数字海洋 IP。

【讨论】:

    【解决方案2】:

    从技术上讲,它应该按照您的方式工作,但可能端口 8080 未对外界开放。

    您可以在 docker-compose.yml 文件中更改端口映射:

    ports:
        - "80":"8080"
    

    然后您可以从 123.45.67.89 访问您的应用,无需指定任何端口,因为 80 是默认端口。如果它不起作用,请仔细检查 IP 地址和您的防火墙规则。

    但是,使用 Nginx 几乎总是一个好主意,因为您使用的本地 Web 服务器还没有准备好生产(功能和安全方面)。我不会在这里解释如何实现 Nginx,因为它有点跑题了,而且有很多可用的资源,但是当你在远程服务器上部署时,你应该认真考虑它。

    【讨论】: