使用带有docker的/ etc / hosts

问题描述 投票:1回答:3

在我的Mac上,我使用流浪汉运行Ubuntu和apache,并为我的各种代码存储库提供虚拟主机条目。在OSX方面,我为每个v-host条目创建/ etc / hosts条目。

我试图用docker实现相同的效果,但是我在努力解决它而不必在访问应用程序时指定端口号,我不想这样做。例如:我的/ etc / hosts中有127.0.0.1 dockertest.com,然后可以访问http://dockertest.com:8080。我希望能够在没有指定端口的情况下去http://dockertest.com。我怎样才能做到这一点?我知道端口号不能在/ etc / hosts文件中使用,所以我正在寻找一种可以模仿效果的方法。我需要能够同时运行多个docker应用程序,因为一些代码库彼此通信并且每个代码库都需要有自己唯一的主机名,所以我不认为只是在docker-compose文件中将端口设置为80:80将工作,因为每个应用程序将(尝试)在127.0.0.1:80上运行。

对于上下文,我跟着this tutorial在docker上运行apache,php和mysql。我的所有文件都与该网站上显示的完全一致。

更新

我用以下502 Bad Gateway文件得到docker-compose.yml nginx错误。

version: "3.3"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./public_html/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    volumes:
      - ./public_html/:/var/www/html/
    environment:
      - VIRTUAL_PORT=3000
      - VIRTUAL_HOST=dockertest.com
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  frontend:
  backend:

更新2

解决了'502 Bad Gateway'错误,这是更新的docker-compose.yml文件。我不得不将nginx-proxy添加到我引用的其中一个网络中。我的问题没有完全解决,但我确实有一部分工作。对于读这个寻找解决方案的人,我创建了另一个问题here,以防止这个问题变得太长。

version: "3.3"
services:
  php:
    build: './php/'
    networks:
      - backend
    volumes:
      - ./public_html/:/var/www/html/
  apache:
    build: './apache/'
    depends_on:
      - php
      - mysql
    networks:
      - frontend
      - backend
    volumes:
      - ./public_html/:/var/www/html/
    environment:
      - VIRTUAL_HOST=dockertest.com
  mysql:
    image: mysql:5.6.40
    networks:
      - backend
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
  nginx-proxy:
    image: jwilder/nginx-proxy
    networks:
      - backend
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  frontend:
  backend:
apache docker containers
3个回答
1
投票

你可以使用jwilder/nginx-proxy,它是由其他容器的env vars自动配置的反向代理,因此你不需要手动编写nginx代理配置。同样根据要求,它允许使用特定端口转发请求。

# docker-compose.yml

version: '3.3'

services:

  lamp:
    environment:
      VIRTUAL_HOST: some_domain.dev
      VIRTUAL_PORT: 9999
    image: my_lamp_image

  app:
    environment:
      VIRTUAL_HOST: another_domain.dev
      VIRTUAL_PORT: 3000
    image: my_app_image

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

127.0.0.1 some_domain.dev
127.0.0.1 another_domain.dev

jwilder/nginx-proxy有许多更好的功能,如ssl,uwsgi,fastcgi,也可以用于生产。还有像let's encrypt sslman in the middle proxy这样的“伴侣”补充。


0
投票

看起来您的apache服务器在容器内的端口80上运行。如果你想在你的/ etc / hosts条目之外使用dockertest.com,那么你也必须在外面使用端口80。

  1. 为dockertest.com域制作你的/etc/hosts条目
  2. 如果您使用docker,如果您使用docker-compose,请使用-p 80:80or运行它
ports:
  - "80:80"

0
投票

一种可能性是将所有应用程序设置在单独的容器中,然后通过docker network连接它们。

为了到达所有容器,我建议将nginx webserver容器作为反向代理添加到网络中,然后可以将其绑定到计算机的端口80。

然后,您可以单独为每个应用程序定义location,也可以定义一个通用位置

# sample.conf
server {
  listen 80 default_server;
  server_name ~ (?<docker_host_name>.+);
  location ~ {
    # for actual request forwarding
    proxy_pass                         http://$docker_host_name$1$is_args$args;
    # some stuff I figured out I have to use in order for service to work properly
    proxy_set_header                   Upgrade $http_upgrade;
    proxy_set_header                   Connection 'upgrade';
    proxy_http_version                 1.1;
    proxy_cache_bypass                 $http_upgrade;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

此配置必须内嵌在原始/etc/nginx/nginx.conf中,或者放在http配置块中包含的单独文件中。

重新启动nginx服务或容器后(取决于容器设置),您应该能够访问docker网络内的所有服务,并且所有服务应该能够相互通信而不会出现问题。

当然,您仍然必须将条目保留在hosts文件中,因此您的计算机知道它必须在本地处理请求。

Edit:

原始配置(可能)不会执行它应该执行的操作。所以,我想出了一个更新的版本,它应该完成工作:

# sample.conf
server {
  listen 80 default_server;
  location ~ {
    # for actual request forwarding
    proxy_pass                         http://$host$1$is_args$args;
    # some stuff I figured out I have to use in order for service to work properly
    proxy_set_header                   Upgrade $http_upgrade;
    proxy_set_header                   Connection 'upgrade';
    proxy_http_version                 1.1;
    proxy_cache_bypass                 $http_upgrade;
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

使用此配置,nginx服务器将侦听端口80上的所有传入请求,并将它们转发到网络内的适当容器。您也不必自己配置主机解析,因为docker容器名称也代表容器的主机(-name)。

希望这对你有用。

© www.soinside.com 2019 - 2024. All rights reserved.