是否可以在 NGINX 和 Docker 容器之间共享端口?
Is it possible to share ports between NGINX and Docker Container?
我有 Ubuntu 18:04/NGINX VPS 我有一堆 Laravel 项目块,全部使用 ssl (certbot)。
我想通过 Docker Compose 部署 Nextcloud VPS:
version: "3"
services:
proxy:
image: jwilder/nginx-proxy:alpine
labels:
# labels needed by lets encrypt to identify container to generate certs in
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
container_name: nextcloud-proxy
networks:
- nextcloud_network
ports:
- 80:80
- 443:443
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- ./proxy/certs:/etc/nginx/certs:ro
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion:v1.12.1
container_name: nextcloud-letsencrypt
depends_on:
- proxy
networks:
- nextcloud_network
volumes:
- ./proxy/certs:/etc/nginx/certs:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
db:
image: mariadb:10.5.1
container_name: nextcloud-mariadb
networks:
- nextcloud_network
volumes:
- ./db:/var/lib/mysql
- ./dbdumps:/var/dbdumps
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD=... # set me
- MYSQL_PASSWORD=... # set me
- MYSQL_DATABASE=... # set me
- MYSQL_USER=... # set me
restart: unless-stopped
redis:
container_name: nextcloud-redis
image: redis:5.0.8
restart: unless-stopped
networks:
- nextcloud_network
volumes:
- ./redis/data:/data
command: ["redis-server", "--appendonly yes"]
app:
image: nextcloud:18.0.2
container_name: nextcloud-app
networks:
- nextcloud_network
depends_on:
- letsencrypt
- proxy
- redis
- db
volumes:
- ./nextcloud:/var/www/html
- ./app/config:/var/www/html/config
- ./app/custom_apps:/var/www/html/custom_apps
- ./app/data:/var/www/html/data
- ./app/themes:/var/www/html/themes
- /etc/localtime:/etc/localtime:ro
environment:
- VIRTUAL_HOST=YOURDOMAINHERE # set me
- LETSENCRYPT_HOST=YOURDOMAINHERE # set me
- LETSENCRYPT_EMAIL=you@example.com # set me
restart: unless-stopped
networks:
nextcloud_network:
driver: bridge
当我 运行 我得到:
ERROR: for 3f210d699b80_nextcloud-proxy Cannot start service proxy: driver failed programming
external connectivity on endpoint nextcloud-proxy
(2d76e425c94abb95da70a7d903bf8830d4e9192a512e17db1b39f76da85c7b97): Error starting userland proxy:
listen tcp 0.0.0.0:443: bind: address already in use
ERROR: for proxy Cannot start service proxy: driver failed programming external connectivity on
endpoint nextcloud-proxy (2d76e425c94abb95da70a7d903bf8830d4e9192a512e17db1b39f76da85c7b97): Error
starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
ERROR: Encountered errors while bringing up the project.
因为这个端口已经被占用了。
如果我在 VPS 和 运行 上停止 NGINX docker-compose up -d ,一切正常,可以通过 URL.[= 访问 Nextcloud 服务14=]
我尝试将外部端口更改为
- 8080:80
- 4444:443
并重建它。然后我没有看到上面的错误,但一切都搞砸了 - url 指向错误的域...
是否可以通过某种方式调整代理容器设置来解决此问题?
2 项服务无法侦听您找到的同一端口。您的 laravel 应用程序已经在侦听端口 80/443,因此当启动您的 nextcloud 容器时,它将无法绑定到这些端口。
您必须让 jwilder/nginx-proxy:alpine
充当 nextcloud 容器和 laravel 服务器的代理。这可以通过您的 nginx 配置完成并将其安装到您的容器(您似乎正在使用 ./proxy/ 目录):
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
尽管如此,如果您的 VPS 能够拥有 2 个 IP 地址,那么您可以将 laravel 应用程序绑定到一个接口,将您的 nextcloud 代理绑定到另一个接口,这也将解决您的问题问题。第一种方法是更好的做法,因为它允许您更好地扩展服务器而无需添加另一个 IP 地址 per-application.
https://docs.docker.com/config/containers/container-networking/
我有 Ubuntu 18:04/NGINX VPS 我有一堆 Laravel 项目块,全部使用 ssl (certbot)。
我想通过 Docker Compose 部署 Nextcloud VPS:
version: "3"
services:
proxy:
image: jwilder/nginx-proxy:alpine
labels:
# labels needed by lets encrypt to identify container to generate certs in
- "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
container_name: nextcloud-proxy
networks:
- nextcloud_network
ports:
- 80:80
- 443:443
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- ./proxy/certs:/etc/nginx/certs:ro
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
restart: unless-stopped
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion:v1.12.1
container_name: nextcloud-letsencrypt
depends_on:
- proxy
networks:
- nextcloud_network
volumes:
- ./proxy/certs:/etc/nginx/certs:rw
- ./proxy/vhost.d:/etc/nginx/vhost.d:rw
- ./proxy/html:/usr/share/nginx/html:rw
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: unless-stopped
db:
image: mariadb:10.5.1
container_name: nextcloud-mariadb
networks:
- nextcloud_network
volumes:
- ./db:/var/lib/mysql
- ./dbdumps:/var/dbdumps
- /etc/localtime:/etc/localtime:ro
environment:
- MYSQL_ROOT_PASSWORD=... # set me
- MYSQL_PASSWORD=... # set me
- MYSQL_DATABASE=... # set me
- MYSQL_USER=... # set me
restart: unless-stopped
redis:
container_name: nextcloud-redis
image: redis:5.0.8
restart: unless-stopped
networks:
- nextcloud_network
volumes:
- ./redis/data:/data
command: ["redis-server", "--appendonly yes"]
app:
image: nextcloud:18.0.2
container_name: nextcloud-app
networks:
- nextcloud_network
depends_on:
- letsencrypt
- proxy
- redis
- db
volumes:
- ./nextcloud:/var/www/html
- ./app/config:/var/www/html/config
- ./app/custom_apps:/var/www/html/custom_apps
- ./app/data:/var/www/html/data
- ./app/themes:/var/www/html/themes
- /etc/localtime:/etc/localtime:ro
environment:
- VIRTUAL_HOST=YOURDOMAINHERE # set me
- LETSENCRYPT_HOST=YOURDOMAINHERE # set me
- LETSENCRYPT_EMAIL=you@example.com # set me
restart: unless-stopped
networks:
nextcloud_network:
driver: bridge
当我 运行 我得到:
ERROR: for 3f210d699b80_nextcloud-proxy Cannot start service proxy: driver failed programming
external connectivity on endpoint nextcloud-proxy
(2d76e425c94abb95da70a7d903bf8830d4e9192a512e17db1b39f76da85c7b97): Error starting userland proxy:
listen tcp 0.0.0.0:443: bind: address already in use
ERROR: for proxy Cannot start service proxy: driver failed programming external connectivity on
endpoint nextcloud-proxy (2d76e425c94abb95da70a7d903bf8830d4e9192a512e17db1b39f76da85c7b97): Error
starting userland proxy: listen tcp 0.0.0.0:443: bind: address already in use
ERROR: Encountered errors while bringing up the project.
因为这个端口已经被占用了。
如果我在 VPS 和 运行 上停止 NGINX docker-compose up -d ,一切正常,可以通过 URL.[= 访问 Nextcloud 服务14=]
我尝试将外部端口更改为
- 8080:80
- 4444:443
并重建它。然后我没有看到上面的错误,但一切都搞砸了 - url 指向错误的域...
是否可以通过某种方式调整代理容器设置来解决此问题?
2 项服务无法侦听您找到的同一端口。您的 laravel 应用程序已经在侦听端口 80/443,因此当启动您的 nextcloud 容器时,它将无法绑定到这些端口。
您必须让 jwilder/nginx-proxy:alpine
充当 nextcloud 容器和 laravel 服务器的代理。这可以通过您的 nginx 配置完成并将其安装到您的容器(您似乎正在使用 ./proxy/ 目录):
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
尽管如此,如果您的 VPS 能够拥有 2 个 IP 地址,那么您可以将 laravel 应用程序绑定到一个接口,将您的 nextcloud 代理绑定到另一个接口,这也将解决您的问题问题。第一种方法是更好的做法,因为它允许您更好地扩展服务器而无需添加另一个 IP 地址 per-application.
https://docs.docker.com/config/containers/container-networking/