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

时间:2017-09-04 15:25:29

标签: macos docker

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

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

如果我需要在我的环境中添加额外的2-3个dockerized dev站点,该怎么办?什么是最好的行动方式,以防止必须通过港口,即81,82,83等访问这些网站?此外,在这些情况下,我似乎只能将仅绑定到端口80的开发站点重写为特定的主机名?有没有办法克服这个?从不同端口管理多个docker站点的最佳方法是什么?

注意,我希望通过容器的IP地址(即172.21.0.4)访问docker容器,然后只需在我的hosts文件中添加一个主机名条目,但是按IP地址访问容器并不是“{1}}。在Mac上工作。

搬运工-compose.yml

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-阿帕奇/ Dockerfile

FROM php:7-apache
COPY ./config/php.ini /usr/local/etc/php/
EXPOSE 80

提前致谢

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:1)

具体解决方案

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

nginx-proxy:
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro

然后,以这种方式更改apache_site1服务:

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网站是否可访问:

curl -H 'Host: apache-1.dev' localhost

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

更多网站

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

通用解决方案

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

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

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

curl -H 'Host: example-2.dev' localhost

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

已经使用nginx和docker服务构建了解决方案

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

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标头转发到代理服务器。