首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NGINX和Docker Container之间是否可以共享端口?

NGINX和Docker Container之间是否可以共享端口?
EN

Stack Overflow用户
提问于 2020-09-24 00:08:33
回答 1查看 366关注 0票数 0

我有Ubuntu 18:04/NGINX VPS,其中有一堆Laravel项目块,都使用ssl (certbot)。

我想通过Docker Compose在相同的VPS上部署Nextcloud:

代码语言:javascript
复制
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

当我运行这个命令时,我得到:

代码语言:javascript
复制
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,一切都正常,并且Nextcloud服务可以通过URL访问。

我尝试将外部端口更改为

代码语言:javascript
复制
- 8080:80
- 4444:443

然后重建它。然后我看不到上面的错误,但一切都乱七八糟-网址指向错误的域名…

有没有可能通过调整代理容器设置来解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-25 20:53:00

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地址。

https://docs.docker.com/config/containers/container-networking/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64032046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档