Обратный прокси-сервер nginx для кластера Docker 1.13 "Swarm Mode"
У меня есть существующий кластер Docker Swarm, работающий на двух узлах, и я хочу добавить nginx для обратного прокси. Я задаю этот вопрос, потому что у меня есть пара проблем, которые я не знаю, как решить.
Мой первый вопрос касается запуска nginx внутри Swarm и возможности доступа к контейнерам моего приложения, используя их собственные имена. Во-первых, вот результат docker network ls
6897486e798b bridge bridge local
3c5b72414821 docker_gwbridge bridge local
6f762b23ff12 host host local
uwy3qfuu4oos ingress overlay swarm
0e867cd5a3bf none null local
Нужно ли создавать еще одну оверлейную сеть и настроить Nginx для работы в этой оверлейной сети. Я создаю сервис nginx следующим образом:
docker service create rproxy -p 80:80 --mount type=volume,source=rproxy,target=/etc/nginx --mode=global nginx:alpine
С помощью этой команды nginx создается во всех моих узлах, и я могу получить доступ к стандартному экрану nginx "hello world" с помощью браузера.
Поскольку я смонтировал том для конфигурации nginx, я могу получить доступ к конфигурации nginx из /var/lib/docker/volumes/rproxy/_data
, Итак, я вошел в /etc/nginx/conf.d
удалено default
и создал простой vhost:
server {
listen 80;
location / {
proxy_pass http://myapp:80;
}
}
Когда я перезапустил nginx, мой сервер не запустился из-за ошибки nginx, Host "myapp" does not exist
, Я знаю, что если я выставлю какой-либо порт из myapp
сервис, я смогу прокси, используя что-то вроде:
proxy_pass http://0.0.0.0:SOME_PORT;
Я не выставляю никаких портов, но хочу получить доступ к моим контейнерам, используя их соответствующие сервисные имена. Это возможно? Если да, то как мне это сделать?
Мой второй вопрос касается хранения файлов конфигурации. Есть ли способ создать единый том в рое и получить доступ к нему со всех узлов? Я даже не буду возражать, если том хранится на сервере менеджера роя, поскольку nginx загружает конфигурацию в память, что не повлияет на производительность.
РЕДАКТИРОВАТЬ: Я не проверял версию Docker при установке, думая, что 1.13 является последней. Docker версия 17.06.1-ce, сборка 874a737
1 ответ
Нужно ли создавать еще одну оверлейную сеть и настроить Nginx для работы в этой оверлейной сети.
Контейнер nginx и ваши целевые приложения должны находиться в одной и той же докерной сети для связи от контейнера к контейнеру. Вы можете добавить контейнер nginx в несколько специализированных сетей или создать одну прокси-сеть и присоединить все приложения к этой сети. От docker run
Команда, которую вы можете подключить к одной сети. Для нескольких сетей трудным путем, вы можете сделать docker create
а потом docker network connect
перед запуском docker start
, Самый простой способ - использовать файл docker-compose.yml, который автоматизирует эти шаги для подключения вашего контейнера к нескольким сетям.
Есть ли способ создать единый том в рое и получить доступ к нему со всех узлов? Я даже не буду возражать, если том хранится на сервере менеджера роя, поскольку nginx загружает конфигурацию в память, что не повлияет на производительность.
Вы можете создать том, который подключается к удаленному серверу NFS. Вот несколько примеров команд docker для использования удаленного общего ресурса nfs:
# create a reusable volume
$ docker volume create --driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
foo
# or from the docker run command
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
foo
# or to create a service
$ docker service create \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
foo