Использование / etc / hosts с докером - PullRequest
1 голос
/ 31 марта 2019

На моем Mac я использую vagrant с Ubuntu и работающим на нем apache, и у меня есть записи виртуальных хостов для моих различных репозиториев кода для apache. На стороне OSX я создаю записи / etc / hosts для каждой из этих записей v-host.

Я пытаюсь добиться того же эффекта с помощью докера, но я изо всех сил пытаюсь понять это без необходимости указывать номер порта при доступе к приложению, чего я не хочу делать. Пример: у меня есть 127.0.0.1 dockertest.com в моем / etc / hosts, к которому я могу получить доступ в http://dockertest.com:8080. Я хотел бы иметь возможность просто перейти на http://dockertest.com без указания порта. Как мне этого добиться? Я знаю, что номера портов нельзя использовать в файле / etc / hosts, поэтому я ищу способ, который бы имитировал эффект, если бы это было возможно. Мне нужно иметь возможность запускать несколько приложений докеров одновременно, потому что некоторые кодовые базы взаимодействуют друг с другом, и у каждого должно быть свое собственное уникальное имя хоста, поэтому я не думаю, что просто установить порты на 80:80 в докере. compose file будет работать, потому что каждое приложение будет (пытаться) работать на 127.0.0.1:80.

Для контекста я следовал этому руководству для запуска apache, php и mysql в докере. Все мои файлы точно такие, как показано на этом сайте.

Обновление

Я получаю 502 Bad Gateway nginx ошибку со следующим docker-compose.yml файлом.

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 в одну из сетей, на которые я ссылался. Мой вопрос не полностью решен, но у меня есть часть работы. Для тех, кто читает это в поисках решения, я создал еще один вопрос здесь , чтобы этот вопрос не стал слишком длинным.

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:

Ответы [ 3 ]

1 голос
/ 31 марта 2019

Вы можете использовать jwilder / nginx-proxy , это обратный прокси-сервер, автоматически конфигурируемый env-переменными других контейнеров, поэтому вам не нужно вручную писать настройки прокси-сервера 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 и может также использоваться в производстве.Также есть «сопутствующие» дополнения, такие как Давайте зашифруем ssl и man в среднем прокси .

0 голосов
/ 31 марта 2019

Одна возможность состоит в том, чтобы настроить все приложения в их отдельных контейнерах, а затем подключить их через сеть докеров .

И чтобы охватить все контейнеры, я бы предложил добавитьКонтейнер веб-сервера nginx к сети в качестве обратного прокси-сервера, который затем можно привязать к порту 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, поэтому ваш компьютер знает, что он должен обрабатывать запрос локально.

Редактировать:

Исходная конфигурация (вероятно) не делает то, что она должна делать.Итак, я придумал более новую версию, которая должна выполнить работу:

# 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 и перенаправлять их в соответствующий контейнер.внутри сети.Вам также не нужно настраивать разрешение хоста самостоятельно, так как имена контейнеров докеров также представляют хост (-name) контейнера.

Надеюсь, это сработает для вас.

0 голосов
/ 31 марта 2019

Похоже, ваш сервер apache работает через порт 80 внутри контейнера.Если вы хотите использовать dockertest.com снаружи с вашей записью / etc / hosts, тогда вам также нужно использовать порт 80 для внешней стороны.

  1. создайте /etc/hosts запись для домена dockertest.com
  2. Если вы используете Docker, запустите его с -p 80:80 или, если вы используете Docker-compose
ports:
  - "80:80"
...