首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker在不同端口上的多个站点

Docker在不同端口上的多个站点
EN

Stack Overflow用户
提问于 2017-09-04 23:25:29
回答 2查看 2.2K关注 0票数 1

现在,我有一个运行在docker容器中的静态站点,在端口80上提供服务。这很好用,因为80是公共交通的默认值。

因此,在我的/etc/hosts文件中,我可以添加一个条目,比如127.0.0.1 example.dev并导航到example.dev,它会自动使用端口80。

如果我需要向我的环境中添加额外的2-3个停靠的开发站点,该怎么办?要避免仅通过端口访问这些站点,例如81、82、83等,最佳的行动方案是什么?而且,在这种情况下,我似乎只能将绑定到端口80的开发站点重写为特定的主机名?有没有办法克服这个问题?从不同端口管理多个扩展坞站点的最佳方式是什么?

注意,我希望通过容器的IP地址访问docker容器,即172.21.0.4,然后简单地将主机名项添加到我的主机文件中,但是通过IP地址访问容器在Mac上不起作用。

docker-compose.yml

代码语言:javascript
复制
version: '3'

services:
    mysql:
      container_name: mysql
      build: ./mysql
      environment:
        - MYSQL_DATABASE=example_dev
        - MYSQL_USER=test
        - MYSQL_PASSWORD=test
        - MYSQL_ROOT_PASSWORD=0000
      ports:
        - 3307:3306
    phpmyadmin:
      container_name: myadmin
      image: phpmyadmin/phpmyadmin
      ports:
        - 8080:80
      links:
        - "mysql:db"
    apache_site1:
      container_name: apache_site1
      build: ./php-apache
      ports:
              - 80:80
      volumes:
        - ../:/var/www/html
      links:
        - mysql:db

./php-apache/Dockerfile

代码语言:javascript
复制
FROM php:7-apache
COPY ./config/php.ini /usr/local/etc/php/
EXPOSE 80

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2017-09-04 23:38:11

您的问题最好使用反向代理来处理,例如nginx。您可以在端口80上运行反向代理,然后将其配置为将请求路由到特定站点。例如,

代码语言:javascript
复制
http://example.dev/site1     route to site1 at http://example.dev:8080
http://example.dev/site2     route to site2 at http://example.dev:8081

因此你在端口8080,8081上运行你的站点...

票数 1
EN

Stack Overflow用户

发布于 2017-09-05 00:11:50

具体解决方案

基于问题中的docker-compose文件。编辑docker-compose.yml文件,添加此服务:

代码语言:javascript
复制
nginx-proxy:
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro

然后,按如下方式更改apache_site1服务:

代码语言:javascript
复制
apache_site1:
  container_name: apache_site1
  build: ./php-apache
  volumes:
    - ../:/var/www/html
  links:
    - mysql:db
  environment:
    - VIRTUAL_HOST=apache-1.dev

运行docker-compose文件并检查您的apache-1网站是否可访问:

代码语言:javascript
复制
curl -H 'Host: apache-1.dev' localhost

或者使用Chrome扩展,如下所述。

更多网站

当您需要添加更多网站时,只需添加一个您想要的apache_site2条目,并确保在其定义中设置一个VIRTUAL_HOST环境变量。

通用解决方案

使用具有多个服务器条目的单个nginx

如果你不想为每个网站使用一个带有子路径的反向代理,你可以设置一个nginx反向代理监听你的主机80端口,每个站点/容器都有一个server条目。

代码语言:javascript
复制
server {
    listen       80;
    server_name  example-1.dev;

    location / {
        proxy_pass http://website-1-container:port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

server {
    listen       80;
    server_name  example-2.dev;

    location / {
        proxy_pass http://website-2-container:port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
... and so on

然后,您可以使用Host标头向您的localhost请求不同的域,而无需更改/etc/hosts

代码语言:javascript
复制
curl -H 'Host: example-2.dev' localhost

如果您正在进行web开发,因此需要查看web页面,则可以在每个页面请求时使用a browser extension to customize the Host header

已经使用nginx和docker服务实现了解决方案

对所有的都使用docker-compose文件,并使用jwilder/nginx-proxy镜像,该镜像将使用环境变量为您自动配置nginx代理。这是一个示例docker-compose.yml文件:

代码语言:javascript
复制
version: "3"
services:
  website-1:
    image: website-1:latest
    environment:
      - VIRTUAL_HOST=example-1.dev
  website-2:
    image: website-2:latest
    environment:
      - VIRTUAL_HOST=example-2.dev
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

Apache解决方案

使用apache virtual hosts设置多个网站,方法与nginx相同。确保启用the Apache ProxyPreserveHost DirectiveHost报头转发到代理服务器。

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

https://stackoverflow.com/questions/46040152

复制
相关文章

相似问题

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