【问题标题】:How do I configure a reverse proxy for my dockers containers?如何为我的 dockers 容器配置反向代理?
【发布时间】:2021-03-05 21:07:17
【问题描述】:

我目前正在将我的树莓派配置为我的个人家庭服务器,并且我想使用 docker。我有几个不同的容器:

-Apache/PHP 81:80

-Nextcloud 8080:80

-我的世界 25565:25565

我已经有一个动态域名 (http://felixbestwaifu.hopto.org)

当我尝试访问 felixbestwaifu.hopto.org:8080 时,它会超时:c

我的目标

下一个云

  • cloud.hostname.org
  • 或 hostname.org/nextcloud

网站

  • Domain.org
  • Domain.org/about.php
  • Domain.org/Anime.php

我尝试通过在 /sites-enabled//sites-available/ 中创建 nextcloud.conf 来使用 NGINX,但它没有'根本不工作^^'

server {
    listen 80;
    server_name nextcloud;

    location /nextcloud {
        proxy_pass 192.168.2.150:8080/;
    }
}

注意:192.168.2.150 是我网络中的 pi 静态 IP

所以这是我的问题:如何为 docker 容器设置反向代理?

非常感谢您的帮助>//

【问题讨论】:

    标签: docker raspberry-pi reverse-proxy


    【解决方案1】:

    假设您的 Apache-PHP 容器名为 apache_php。您应该有两个具有相似内容的.conf 文件(或多或少取决于您在 conf 文件中需要什么)。

    /etc/apache2/sites-available/minecraft.conf:

    <VirtualHost *:80>
            ServerName minecraft.com
    
            ServerAdmin webmaster@minecraft
            DocumentRoot /home/minecraft
            ProxyPreserveHost On
            ProxyPass "/" "http://minecraft:25565/"
            ProxyPassReverse "/" "http://minecraft:25565/"
            ProxyRequests Off
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    </VirtualHost>
    

    /etc/apache2/sites-available/nextcloud.conf:

    <VirtualHost *:80>
            ServerName nextcloud.com
    
            ServerAdmin webmaster@nextcloud
            DocumentRoot /home/nextcloud
            ProxyPreserveHost On
            ProxyPass "/" "http://nextcloud:8080/"
            ProxyPassReverse "/" "http://nextcloud:8080/"
            ProxyRequests Off
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    </VirtualHost>
    

    注意ProxyPassProxyPassReverse 中的结尾/。如果您不添加它们,最终 URL 将类似于 http://minecraft:25565your_page,而尾随 / 将是 http://minecraft:25565/your_page

    在这种情况下,如果有人进入 minecraft.com,您的 Apache 会将他代理到 minecraft 站点,并且 *minecraft 只能由您的 Apache 容器访问。

    请注意,minecraft.comminecraft 是名为 proxy 的网络中的两个不同网站,我将在下面讨论它

    这是我在容器中所做的,但让我据我所知解释一下:

    假设您的 Apache、Nextcloud 和 Minecraft 位于同一个 network 中(在这种情况下,您应该创建一个网络,在我的情况下它称为 proxy 网络)并且所有这三个容器都应该通过 ping 看到彼此.

    你的docker-compose.yml文件在这种情况下应该是什么样子的

    version: '3.9'
    
    services:
        apache_php:
            build: .
            restart: always
            ports:
               - "81:80"
        minecraft:
            build: .
            restart: always
            ports:
               - "25565:25565"
        nextcloud:
            build: .
            restart: always
            ports:
               - "8080:80"
    networks:
    default:
    external:
      name: proxy
    volumes:
    db_data: {}
    

    所以在这个文件中,我创建了三个名为apache_phpminecraftnextcloud 的图像,它们是通过Dockerfile 通过build 关键字构建的。我还代理了 81 到 80 端口,25565 到 25565 和 8080 到 80 端口。

    然后你可以创建一个Dockerfile或者修改已有的类似内容:

    FROM your_os_base:tag
    
    COPY minecraft.conf /etc/apache2/sites-available/
    COPY nextcloud.conf /etc/apache2/sites-available/
    COPY my_bash_commands.sh /root/
    RUN chmod +x /root/my_bash_commands.sh
    RUN /root/my_bash_commands.sh
    ENTRYPOINT ["your_thing"]
    

    在我的情况下,my_bash_commands.sh 是什么?由于大多数情况下默认 shell 是 sh,因此我创建了一个 bash 文件,以便获得我想要的结果。

    my_bash_commands.sh 与此类似:

    #!/usr/bash
    
    service apache2 start
    a2ensite minecraft
    a2ensite nextcloud
    a2enmod proxy
    a2enmod proxy_http
    service apache2 restart
    

    如果你在docker-compose.yml所在的路径中,现在你可以通过运行docker-compose up -d来创建它们,否则你应该使用docker-compose -f /absolute_patht_to/docker-compose.yml up -d

    【讨论】:

    • 谢谢你^-^!抱歉回复晚了,但它现在可以工作了:D!
    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2019-05-18
    • 2014-12-15
    • 2016-09-07
    • 2014-05-01
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多