【问题标题】:I have troubles installing several app using docker compose我在使用 docker compose 安装多个应用程序时遇到问题
【发布时间】:2026-02-20 20:25:01
【问题描述】:

就我个人而言,我想在 docker 上设置我的服务器(使用 docker compose)。 而且我在设置几个应用程序时遇到了一些麻烦(问题来自端口)。

我有一个完全干净的 debian 8 服务器。 我创建了 2 个存储库,一个用于 nextcloud,另一个用于 bitwarden 我首先开始了下一个云,一切都很好,所以之后我启动了 bitwarden,但我有一个错误,因为我使用的是相同的端口。但是因为我想对 https 网站和 https 网站都使用letsencrypt,我想如何配置端口和反向代理。

这个是给 nextcloud 的

version: '3' 

services:

  proxy:
    image: jwilder/nginx-proxy:alpine
    labels:
      - "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
    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
    container_name: nextcloud-mariadb
    networks:
      - nextcloud_network
    volumes:
      - db:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MYSQL_ROOT_PASSWORD=toor
      - MYSQL_PASSWORD=mysql
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    restart: unless-stopped
  
  app:
    image: nextcloud:latest
    container_name: nextcloud-app
    networks:
      - nextcloud_network
    depends_on:
      - letsencrypt
      - proxy
      - 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=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_HOST=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_EMAIL=YOUR-EMAIL
    restart: unless-stopped

volumes:
  nextcloud:
  db:

networks:
  nextcloud_network:

这个是给bitwarden的

version: "3"

services:
  bitwarden:
    image: bitwardenrs/server
    restart: always
    volumes:
      - ./bw-data:/data
    environment:
      WEBSOCKET_ENABLED: "true" 
      SIGNUPS_ALLOWED: "true" 

  caddy:
    image: abiosoft/caddy
    restart: always
    volumes:
      - ./Caddyfile:/etc/Caddyfile:ro
      - caddycerts:/root/.caddy
    ports:
      - 80:80 # needed for Let's Encrypt
      - 443:443
    environment:
      ACME_AGREE: "true" 
      DOMAIN: "bitwarden.example.org"  
      EMAIL: "bitwarden@example.org"  
volumes:
  caddycerts:

错误是:

Blockquote ERROR: for root_caddy_1 Cannot start service caddy: driver failed Programming external connectivity on endpoint root_caddy_1 xxxxxxxxxxxxxxxxxx : Bind for 0.0.0.0:80 failed: 端口已分配

【问题讨论】:

  • 您应该在同一个网络上启动所有内容 + 一个新的代理服务器 (NGINX)。您可以删除到 80 和 443 的所有端口映射,而是在新代理服务器中配置子域。代理服务器将是唯一一个监听 80 和 443 端口并基于子域代理转发到相应容器的服务器。这会是一个选择吗?
  • 谢谢,是的,这可能是一个不错的选择,您知道如何设置代理服务器(git hub progect 或 tuto online)吗?

标签: linux docker docker-compose


【解决方案1】:

根据您的评论,我将在此处详细说明具有多个子域的解决方案。

首先,目前最简单的解决方案是将所有服务放在同一个 docker-compose 文件中。如果不是,您将必须创建一个网络并将其声明为每个 docker-compose.yml 中的外部网络。

接下来删除 proxycaddy 容器的端口声明(以释放主机上的端口 80 和 443)。

创建一个新服务并将其添加到同一个 docker-compose.yml:

nginx:
  image: nginx
  volumes:
    - ./subdomains_conf:/etc/nginx/conf.d
  ports:
    - "80:80"

接下来创建一个文件夹subdomanins_conf,并在其中创建一个文件default.conf,其内容类似于:

server {
  listen 80;
  listen [::]:80;
  server_name first.domain.com;

  location {
    proxy_pass http://proxy:80;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header HOST $http_host;
  }
}

server {
  listen 80;
  listen [::]:80;
  server_name second.domain.com;

  location {
    proxy_pass http://caddy:80;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header HOST $http_host;
  }

}

您需要将server_name 的值替换为您的实际域名。 SSL 的配置类似。

您可以通过将 2 个域指向 /etc/hosts 中的 127.0.0.1 来在本地测试此设置。请记住,所有服务都应该定义在同一个 docker-compose.yml 中,或者您需要创建一个网络并在每个 docker-compose.yml 中指定它,否则容器将无法互相看到。

【讨论】:

  • 谢谢它似乎适用于我为 https conf server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name nextcloud.maximiliemoraud.fr; location { proxy_pass https://proxy:443; proxy_set_header X-Real-IP $remote_addr; proxy_set_header HOST $https_host; } } 制作的 http 但这不起作用你有任何线索吗?
  • nginx 并不真正支持 ssl 转发,这也是因为您并不真正需要它。即使在您的情况下,我也不认为您真的需要它。您可以在 443 上接收流量,然后将其重定向到容器的 80 端口。您只需要在 nginx 容器中应用所有证书。所以你的配置可能是:conf server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name nextcloud.maximiliemoraud.fr; location { proxy_pass https://proxy:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header HOST $https_host; } }
【解决方案2】:

我找到了一种使用带有 traefik 的反向代理来管理此问题的简单方法 https://docs.traefik.io/

【讨论】: