程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在同一个 docker 容器中运行 nginx 和 gunicorn大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在同一个 docker 容器中运行 nginx 和 gunicorn?

开发过程中遇到如何在同一个 docker 容器中运行 nginx 和 gunicorn的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在同一个 docker 容器中运行 nginx 和 gunicorn的解决方法建议,希望对你解决如何在同一个 docker 容器中运行 nginx 和 gunicorn有所启发或帮助;

我正在尝试使用 gunicorn 和 Nginx 部署一个 python Flask 应用程序。我正在尝试在同一个容器中同时运行 gunicorn(wsgi) 和 Nginx。但是我的 Nginx 没有启动。通过登录容器,我可以启动 Nginx。 下面是我的 dockerfile


RUN apt-get clean && apt-get -y update

RUN apt-get -y install \
    Nginx \
    python3-dev \
    curl \
    vim \
    build-essential \
    procps

workdir /app

copY requirements.txt /app/requirements.txt
copY Nginx-conf  /etc/Nginx/sites-available/default
RUN pip install -r requirements.txt --src /usr/local/src

copY . .

EXPOSE 8000
EXPOSE 80
CMD ["bash","server.sh"]

server.sh 文件看起来像


# turn on bash's job control
set -m

gunicorn  --bind  :8000  --workers 3 wsgi:app
service Nginx start or /etc/init.d/Nginx

gunicorn 是通过 server.sh 启动的,但是 Nginx 没有启动。

我的目标是以后在 kubernetes 中运行这些容器。 i) 我应该在单独的 pod 中同时运行 Nginx 和 gunicorn 还是 ii) 在具有单独容器的同一个 pod 中运行它或 iii) 在同一个 pod 中的同一个容器中运行

解决方法

关于选择如何在 Pod 之间拆分容器,这实际上取决于用例。如果他们互相交谈但执行不同的任务,我会选择两个容器和一个 Pod。

此外,关于您的 server.sh 文件,gunicorn 启动但 nginx 不启动的原因是 gunicorn 默认不以守护程序模式运行。如果您运行 gunicorn --Help,您会看到:

  -D,--daemon          Daemonize the Gunicorn process. [false]

我仍然认为最好将容器分开,但如果您想让它正常工作,请将其更改为:

# turn on bash's job control
set -m

gunicorn  --bind  :8000  --workers 3 wsgi:app -D
service nginx start or /etc/init.d/nginx
,

回答您关于 Kubernetes 的问题:

这取决于你想做什么。

同一个 Pod 中的容器共享同一个 network namespace,这意味着同一个 Pod 中的 2 个容器可以通过联系 localhost 相互通信。这意味着您的包裹永远不会被发送出去,并且始终可以进行通信。

如果您将它们拆分为单独的 Pod,您将需要创建一个 service object 并让它们通过该 service 对象进行通信。将它们放在两个 Pod 中可以让您单独放大和缩小它们,总体而言,您可以有更多选项来单独配置它们,例如通过设置不同类型的安全机制。

您选择哪个选项取决于您的架构和您想要完成的任务。 在同一个 Pod 中拥有两个容器通常只有在遵循“Sidecar”模式时才会完成,这基本上意味着有一个“主”容器在做工作,而 Pod 中的其他容器只是辅助“主”容器而没有自己存在的任何理由。

,

我的目标是以后在 kubernetes 中运行这些容器。我是否应该在单独的 pod 中同时运行 nginx 和 gunicorn

是的,这个。设置起来非常简单(虑到“直接”有几十行的 YAML 文件):为 GUnicorn 后端编写一个部署和一个匹配(ClusterIP 类型)服务,然后编写一个单独的部署和匹配(NodePort-或 LoadBalancer -typE) Nginx 代理服务。在 Nginx 配置中,使用 proxy_pass 指令,指向 Gunicorn 服务的名称作为后端主机名。

这样做有几个好处。如果 Python 服务因任何原因失败,您也不必重新启动 Nginx 代理。如果您处理的负载足以扩展应用程序,您可以根据负载运行最少数量的轻量级 Nginx 代理(可能是 3 个用于冗余)以及更多数量的后端。如果您更新应用程序,Kubernetes 会为您删除并重新创建部署管理的 Pod,同样,为代理和后端使用单独的部署意味着如果仅应用程序代码发生更改,您就不必重新启动代理。>

所以,要解决问题的第一部分:

我正在尝试使用 gunicorn 和 nginx 部署一个 python Flask 应用程序。

在普通 Docker 中,出于类似的原因,您可以运行两个独立的容器。您可以在 Docker Compose 中管理它,它具有更简单的 YAML 文件布局;它看起来像

version: '3.8'
services:
  BACkend:
    build: . # Dockerfile just installs GUnicorn,CMD starts it
  proxy:
    image: nginx
    volumes:
      - ./nginx-conf:/etc/nginx/conf.d # could build a custom image too
        # configuration specifies `proxy_pass http://BACkend:8000`
    ports:
      - '8888:80'

这避免了尝试让多个进程在同一个容器中运行的所有麻烦。您可以简化您显示的 Dockerfile:

# Dockerfile
FROM python:3.9
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive
    apt-get install --no-install-recommends --assume-yes \
    python3-dev \
    build-essential
# (don't install irrelevant packages like vim or procps)
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
# (don't need a sHell script wrapper)
CMD gunicorn --bind :8000 --workers 3 wsgi:app

大佬总结

以上是大佬教程为你收集整理的如何在同一个 docker 容器中运行 nginx 和 gunicorn全部内容,希望文章能够帮你解决如何在同一个 docker 容器中运行 nginx 和 gunicorn所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。