V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jmyz0455
V2EX  ›  程序员

多个 Docker 端口怎么改成用域名加路径或者二级域名去访问?

  •  
  •   jmyz0455 · 2018-11-15 14:36:29 +08:00 · 4334 次点击
    这是一个创建于 2230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我购置了一台 VPS,用 Docker 构建了几个常用的应用,这里假设叫 do1、do2、do3,分别把暴露端口代理到宿主的 8001、8002、8003 端口上,并分享给朋友使用。考虑到以后朋友使用可能越来越频繁,需求导致我要开的应用越来越多,我可能要不断地增加应用下去,这个时候还用 ip:80** (比如 192.168.0.1:8001~192.168.0.1:8009 )来访问应用显得不合理。

    所以问题来了,我能不能只开一个 80 端口,然后用不同的访问地址来对应到不同的 Docker 应用? 比如访问 192.168.0.1 就默认跳到 192.168.0.1/do1,然后 192.168.0.1/do2、192.168.0.1/do3 对应原本 do1、do2、do3 的 Docker 应用?

    我不是网工或者运维,所以我只知道我的需求,不知道怎么去解决,我搜了一晚,都找不准关键词。 但是我搜到二级代理这个词,所以我想我可不可以申请一个域名,比如 my.com 这样,然后通过 do1.my.comdo2.my.comdo3.my.com 来访问不同的 Docker 应用?

    以上的解决方案我不知道是否实际可行,Docker 我也是刚开始入门。请指点一个思路或者搜索关键词,谢谢。

    第 1 条附言  ·  2018-11-16 10:45:20 +08:00

    因为我没有域名,所以想用第一个方案,我的期望是:

    输入 ip/do1,do 应用下所有的访问,都是会代理到 ip/do1/**,比如 ip/do1/app 可以跳到 ip/do1/my/config。

    我搜了 Nginx 和反向代理,按 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass 来配:

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
        location /do1/ {
            proxy_pass http://127.0.0.1:8001;
        }
        location /do2/ {
            proxy_pass http://127.0.0.1:8002;
        }
        location /do3/ {
            proxy_pass http://127.0.0.1:8003;
        }
    }
    

    结果访问 ip/do1 能跳到 ip/do1/login.php ,但只要一登陆,就会跳到 ip/index.php,显示 404 。即便手动跳转到期望的 ip/do1/index.php ,整个页面加载不完整,所有资源请求都不是以 ip/do1/ 开头的地址,而是直接访问 ip/ 里。

    我知道加不加 / 有区别,我可能是理解错官网的意思了?我试着 location 和 proxy_pass 后面加不加 / 所有搭配了,还是不行,试过 rewrite 也不行,实在有点想不通。请问我是哪里配置错误了?

    24 条回复    2018-11-19 15:20:51 +08:00
    tiedan
        1
    tiedan  
       2018-11-15 14:39:44 +08:00
    nginx
    jmyz0455
        2
    jmyz0455  
    OP
       2018-11-15 15:46:18 +08:00
    @tiedan 我知道 Nginx 这个是服务器,所以请问用 ip+/路径 这个技术是叫什么,我想不到关键词。
    xiaomimei
        3
    xiaomimei  
       2018-11-15 15:50:57 +08:00 via iPhone
    参考 https://help.aliyun.com/knowledge_detail/41467.html
    或者搜一下 apache 监听多端口。
    方法很多,看你喜欢哪一个了
    vjnjc
        4
    vjnjc  
       2018-11-15 15:51:49 +08:00
    vhost?
    zgray
        5
    zgray  
       2018-11-15 15:52:58 +08:00 via iPhone
    反向代理,docker 的话,建议看看 nginx-proxy 这个 image
    sunny352787
        6
    sunny352787  
       2018-11-15 15:53:18 +08:00
    应该搜反向代理
    lllllliu
        7
    lllllliu  
       2018-11-15 15:54:17 +08:00
    反向代理 / a / b / xxx 都可以指定 IP 和端口。
    1419co1in
        8
    1419co1in  
       2018-11-15 15:57:27 +08:00
    proxy_pass 到各个端口
    Liang
        9
    Liang  
       2018-11-15 16:01:50 +08:00
    反代就好了
    neoblackcap
        10
    neoblackcap  
       2018-11-15 16:02:28 +08:00
    两种都可以,前者是反向代理,后者是子域名+vhost
    kimqcn
        11
    kimqcn  
       2018-11-15 16:28:25 +08:00
    用户 nginx 可以:
    server {
    listen 80;
    server_name oa.myweb.cn;
    access_log /bitnami/nginx/logs/oa.access.log;
    error_log /bitnami/nginx/logs/oa.error.log;

    location / {
    proxy_pass http://192.168.100.103:8080/;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    server {
    listen 80;
    server_name mail.myweb.cn;
    access_log /bitnami/nginx/logs/mail.access.log;
    error_log /bitnami/nginx/logs/mail.error.log;

    location / {
    proxy_pass http://192.168.100.103:8081/;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header host $host:$server_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    #client_max_body_size 100m;
    }
    }
    gamexg
        12
    gamexg  
       2018-11-15 16:52:08 +08:00
    我推荐 letsencrypt-nginx-proxy-companion
    jmyz0455
        13
    jmyz0455  
    OP
       2018-11-15 16:52:19 +08:00
    @xiaomimei 第一种方案类似是这样吗?
    server {
    listen 80/do1;
    server_name localhost:8001;
    }
    NicholasYX
        14
    NicholasYX  
       2018-11-15 16:58:30 +08:00
    nginx 反代
    hack
        15
    hack  
       2018-11-15 17:01:23 +08:00
    11 is right
    Midnight
        16
    Midnight  
       2018-11-15 17:02:48 +08:00
    用 nginx-proxy 反向代理,docker-compose 编排到一起,最后用 docker-compose up -d [image-name] 运行某一个或不指定
    cuberlzy
        17
    cuberlzy  
       2018-11-15 17:11:20 +08:00
    关键词是反向代理。

    原理就是只监听某一个端口(比如 80),根据你的 Host 头(也就是访问时的域名),指派到不同的配置上去,替你从这个端口请求数据,然后把响应数据返还给你。
    Kyle18Tang
        18
    Kyle18Tang  
       2018-11-15 17:55:25 +08:00
    nginx 也用 docker 的,所有的应用放一个 network 里,这样也不需要暴露额外的端口,只需要暴露 nginx 的 80 和 443 就可以了。
    jmyz0455
        19
    jmyz0455  
    OP
       2018-11-16 10:47:00 +08:00
    @vjnjc @neoblackcap 暂时先不用域名,第一个方案能通就用了
    jmyz0455
        20
    jmyz0455  
    OP
       2018-11-16 11:09:11 +08:00
    @zgray
    @sunny352787
    @lllllliu
    @1419co1in
    @Liang
    @gamexg
    @NicholasYX
    @Midnight
    @cuberlzy
    @Kyle18Tang
    我配 ip:do1/ 代理 8001 是没问题的,但是 ip:do1/ 下面的请求,比如 ip:do1/test/ 请求到 ip:do1/demo/ 失败了,只会跳到 ip:do1/demo/,就是丢失了 d1/ 这个路径,有配过这个配置的么。
    jmyz0455
        21
    jmyz0455  
    OP
       2018-11-16 11:13:46 +08:00
    @kimqcn @hack 现在我这里没有域名。我更新了题目,是不是能只用 location 和 proxy_pass 来用 /do1/*** 代理 8001
    rockhu
        22
    rockhu  
       2018-11-16 14:26:15 +08:00
    Traefik 或者 Caddy 了解一下。
    1747479654
        23
    1747479654  
       2018-11-18 01:36:21 +08:00
    你装个宝塔,然后用里面的 ngnix 反向代理,轻松又方便, 我的 leanote/docker 一些都是这样的,二级域名 /顶级域名指过来,不要太方便.
    jmyz0455
        24
    jmyz0455  
    OP
       2018-11-19 15:20:51 +08:00
    @1747479654 可以分享下你 Nginx 的 default.conf 吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5506 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:34 · PVG 16:34 · LAX 00:34 · JFK 03:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.