如何将Nginx容器连接到我的React容器?

时间:2020-10-03 21:17:40

标签: docker nginx docker-compose

我在这里尝试阅读了其他stackoverflow问题,但是我丢失了一些东西,或者没有一个对我有用。

上下文

我在运行Ubuntu的DigitalOcean服务器上设置了两个docker容器。

root_frontend_1 running on ports 0.0.0.0:3000->3000/tcp root_nginxcustom_1 running on ports 0.0.0.0:80->80/tcp

如果我连接到http://127.0.0.1,则会得到默认的Nginx index.html主页。如果我http://127.0.0.1:3000得到我的应用程序。

我要完成的工作是在访问http://127.0.0.1时获得我的react应用。遵循此处关于StackOverflow的文档和建议,我有以下内容:

docker-compose.yml在我的DigitalOcean服务器的根目录中。

version: "3"
services:
  nginxcustom:
    image: nginx
    hostname: nginxcustom
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/root/nginxcustom/conf/custom.conf
    tty: true

  backend:
    build: https://github.com/Twitter-Clone/twitter-clone-api.git
    ports:
      - "8000:8000"
    tty: true

  frontend:
    build: https://github.com/dougmellon/react-api.git
    ports:
      - "3000:3000"
    stdin_open: true
    tty: true

nginxcustom/conf/custom.conf

server {
 listen 80;
 server_name http://127.0.0.1;

  location / {
    proxy_pass http://root_frontend_1:3000; # this one here
    proxy_redirect off;
  }
}

当我运行docker-compose up时,它会生成,但是当我访问服务器的IP时,它仍显示默认的nginx html文件。

问题

我在这里做错什么,如何获取它,以便主URL指向我的react容器?

感谢您的宝贵时间,如果有什么我需要补充的内容,请随时询问。

2 个答案:

答案 0 :(得分:1)

TL; DR;

nginx服务应该proxy_pass到服务名称(customnginx),而不是容器名称(root_frontend_1),并且应该装载nginx配置到容器内的正确位置。

提示 :可以在docker-compose.yml中为设置container_name的服务设置容器名称,但请注意您不能--scale使用固定的container_name服务。

提示 :容器名称(root_frontend_1是使用compose project name which defaults to using the current directory name if not set生成的。

提示 nginx图像与默认/etc/nginx/nginx.conf打包在一起,它将include {{ 1}}。如果您想检查默认配置文件或将它们用作自己的配置基础,则可以docker cp从容器中取出默认配置文件:

/etc/nginx/conf.d/default.conf

通过docker create --name nginx nginx docker cp nginx:/etc/nginx/conf.d/default.conf default.conf docker cp nginx:/etc/nginx/nginx.conf nginx.conf docker container rm nginx 服务we don't need to bind the hosts port to the containernginx代理连接,服务frontend的定义可以替换为ports的定义,以防止与{ {3}}(取决于expose,您可能还希望阻止直接连接):

backend

再进一步,我们可以为{ version: "3" services: ... frontend: build: https://github.com/dougmellon/react-api.git expose: - "3000" stdin_open: true tty: true 服务,然后为frontend配置proxy_pass

upstream

...然后在容器内upstream frontend { server frontend:3000 max_fails=3; } server { listen 80; server_name http://159.89.135.61; location / { proxy_pass http://frontend/; } } 顶部http://159.89.135.61:3000定制default.conf

default.conf

...,最后是version: "3" services: nginxcustom: image: nginx hostname: nginxcustom ports: - "80:80" volumes: - ./default.conf:/etc/nginx/conf.d/default.conf tty: true 我们的--scale服务(将删除容器的服务反弹,以确保对配置所做的更改生效):

frontend

docker-compose stop nginxcustom \ && docker-compose rm -f \ && docker-compose up -d --scale frontend=3 会将服务名称解析为3个docker容器的IP,frontend将以(默认)轮询的方式代理连接。

提示 :您不能nginx具有--scale映射的服务,只能将单个容器绑定到端口。

提示 :如果您已更新配置并可以连接到负载平衡服务,那么您都可以创建DNS记录来将主机名解析为您的公共IP地址,然后更新您的ports的{​​{3}}。

提示 :用于安全upstream,其中bind-mountserver_nameI maintain specs for building a nginx docker image预烤。 / p>

答案 1 :(得分:0)

在Docker中,当多个服务需要相互通信时,您可以在url中使用服务名称(在docker-composer.yml中设置,而不是ip(它是从网络的可用池中分配的,默认默认情况下),由于docker由网络管理,它将自动解析为正确的容器ip。

对您来说,它应该是http:// frontend:3000