我已经创建了一个默认的blazor服务器应用程序,现在我想通过docker容器部署。
我的当前设置:
server {
root /var/www/mydomain/html;
index index.html index.htm index.nginx-debian.html;
server_name mydomain.net app.mydomain.net;
location / {
# try_files $uri $uri/ =404;
proxy_pass http://172.18.0.23:443/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/app.mydomain.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/app.mydomain.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = app.mydomain.net) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name mydomain.net app.mydomain.net;
return 404; # managed by Certbot
}
然后,我在服务器上安装了Docker,上传了容器,并做了一些额外的设置,以确保我的容器有正确的IP根据我的Nginx配置文件:
sudo docker network create --subnet=172.18.0.0/16 mysubnet
然后我运行我的容器如下:
sudo docker run --hostname=ef93afb9ef97 --env=ASPNETCORE_URLS=https://+:443 --env=DOTNET_USE_POLLING_FILE_WATCHER=1 --env=ASPNETCORE_LOGGING__CONSOLE__DISABLECOLORS=true --env=ASPNETCORE_ENVIRONMENT=Development --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin --env=DOTNET_RUNNING_IN_CONTAINER=true --env=DOTNET_VERSION=7.0.4 --env=ASPNET_VERSION=7.0.4 --workdir=/app --net mysubnet --ip 172.18.0.23 --restart=no --runtime=runc -t -d blazortestapp:dev
注我删除了端口80,因为这会导致错误(VS生成的默认运行命令建议我们如下所示):
--env=ASPNETCORE_URLS=https://+:443;http://+:80
现在,当我ping我的ip www.example.com时127.8.0.23,我得到了一个答案,但是当我尝试访问我的示例应用程序时,我得到了一个
502错误网关
这里的陷阱是什么?是Nginx配置文件、Docker运行命令还是两者都有?
更新我删除了Docker subnet
部件,并按如下方式连接端口:
sudo docker run [...] -p 8080:80 -p 8081:443 [...]
我还把地址设成了
proxy_pass https://127.0.0.1:8081/;
但我还是收到了严重的网关错误。
1条答案
按热度按时间vs91vp4v1#
不要尝试对容器使用永久IP!!!
使用
-p <host_port>:<application_port>
运行你的容器。你的主机将侦听<host_port>并发送所有到此端口的请求到使用的容器应用<application_port>。然后将nginx配置更改为Nginx将发送请求到本地主机,本地主机的端口用于将请求发送到容器。
或者您可以使用docker-compose并设置两个服务:你的应用程序和nginx。都在容器中。而且它们可以通过服务名相互通信,而不需要IP。