从 LAN 访问在 VMware 中运行的 Docker 环境

从 LAN 访问在 VMware 中运行的 Docker 环境

这是我的设置:

我有一台在 VMware(vSphere 客户端)中运行的 Ubuntu 20.04.2 LTS 机器。

在这台机器上,我使用 Wodby Docker4Drupal 在 Docker 中运行一个本地 Drupal 网站,https://github.com/wodby/docker4drupal

该网站可以在 Ubuntu 机器上访问http://drupal.localhost:8000

Ubuntu 计算机的 IP 为192.168.10.100我可以从位于同一 LAN 上的本地 Windows 计算机 ping 通它(Windows 计算机 IP 地址是 192.168.10.97)。

有没有什么方法可以让我直接从位于同一 LAN 的计算机(即我的 Windows 机器)上的浏览器访问 Drupal 网站?

我曾尝试访问http://192.168.10.100:8000但我收到了一条404 page not found消息。在端口上80我收到了ERR_CONNECTION_REFUSED。有什么想法吗?

我还要提一下,在 Ubuntu VM 上,我还可以相同 404 page not found如果我尝试达到http://0.0.0.0:8000或者http://127.0.0.1:8000或 http://localhost:8000。只有项目内配置的主机名才能解析为 Drupal 网站(http://drupal.localhost:8000)。


这是docker-compose.yml我正在使用的。

version: "3.7"

services:
  mariadb:
    image: wodby/mariadb:$MARIADB_TAG
    container_name: "${PROJECT_NAME}_mariadb"
    stop_grace_period: 30s
    environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_DATABASE: $DB_NAME
      MYSQL_USER: $DB_USER
      MYSQL_PASSWORD: $DB_PASSWORD
    volumes:
      - d4d-db-data:/var/lib/mysql # Use bind mount

  php:
    image: wodby/drupal-php:$PHP_TAG
    container_name: "${PROJECT_NAME}_php"
    environment:
      PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
    volumes:
    - ./web:/var/www/html:cached

  crond:
    image: wodby/drupal-php:$PHP_TAG
    container_name: "${PROJECT_NAME}_crond"
    environment:
      CRONTAB: "0 * * * * drush -r /var/www/html/web cron"
    command: sudo -E LD_PRELOAD=/usr/lib/preloadable_libiconv.so crond -f -d 0
    volumes:
    - ./web:/var/www/html:cached

  nginx:
    image: wodby/nginx:$NGINX_TAG
    container_name: "${PROJECT_NAME}_nginx"
    depends_on:
    - php
    environment:
      NGINX_STATIC_OPEN_FILE_CACHE: "off"
      NGINX_ERROR_LOG_LEVEL: debug
      NGINX_BACKEND_HOST: php
      NGINX_SERVER_ROOT: /var/www/html/web
      NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
    #      NGINX_DRUPAL_FILE_PROXY_URL: http://example.com
    volumes:
    - ./web:/var/www/html:cached
    labels:
    - "traefik.http.routers.${PROJECT_NAME}_nginx.rule=Host(`${PROJECT_BASE_URL}`)"

  mailhog:
    image: mailhog/mailhog
    container_name: "${PROJECT_NAME}_mailhog"
    labels:
    - "traefik.http.services.${PROJECT_NAME}_mailhog.loadbalancer.server.port=8025"
    - "traefik.http.routers.${PROJECT_NAME}_mailhog.rule=Host(`mailhog.${PROJECT_BASE_URL}`)"

  traefik:
    image: traefik:v2.0
    container_name: "${PROJECT_NAME}_traefik"
    command: --api.insecure=true --providers.docker
    ports:
    - '8000:80'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  d4d-db-data:

答案1

事实证明这只是 Traefik 中的一个设置。我必须在我的 nginx 容器中添加第二条路由器 http 规则docker-compose.yml

- "traefik.http.routers.${PROJECT_NAME}_nginx_lan.rule=Host(`192.168.10.100`)"

因此完整的 nginx 部分现在看起来像这样:

  nginx:
    image: wodby/nginx:$NGINX_TAG
    container_name: "${PROJECT_NAME}_nginx"
    depends_on:
    - php
    environment:
      NGINX_STATIC_OPEN_FILE_CACHE: "off"
      NGINX_ERROR_LOG_LEVEL: debug
      NGINX_BACKEND_HOST: php
      NGINX_SERVER_ROOT: /var/www/html/web
      NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
    #      NGINX_DRUPAL_FILE_PROXY_URL: http://example.com
    volumes:
    - ./web:/var/www/html:cached
    labels:
    - "traefik.http.routers.${PROJECT_NAME}_nginx.rule=Host(`${PROJECT_BASE_URL}`)"
    - "traefik.http.routers.${PROJECT_NAME}_nginx_lan.rule=Host(`192.168.10.100`)"

一切正常。我现在可以访问我的 Drupal 网站http://192.168.10.100:8000与同一 LAN 上的任何其他设备。

在我的例子中,PROJECT_BASE_URLPROJECT_NAME配置在一个.env文件中,分别对应于drupal.localhostdrupal

感谢@muru 的帮助!

相关内容