我在这里尝试阅读了其他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容器?
感谢您的宝贵时间,如果有什么我需要补充的内容,请随时询问。
答案 0 :(得分:1)
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 container的nginx
代理连接,服务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-mount和server_name
与I maintain specs for building a nginx
docker image
预烤。 / p>
答案 1 :(得分:0)
在Docker中,当多个服务需要相互通信时,您可以在url中使用服务名称(在docker-composer.yml中设置,而不是ip(它是从网络的可用池中分配的,默认默认情况下),由于docker由网络管理,它将自动解析为正确的容器ip。
对您来说,它应该是http:// frontend:3000