Обратный прокси Docker Nginx
Мне нужно запустить несколько контейнеров WordPress, связанных все с одним контейнером MySQL + обратный прокси Nginx, чтобы легко обрабатывать VIRTUAL_HOSTS.
Вот что я пытаюсь сделать (пока только с одним WP):
- Wordpress (hub.docker.com/_/wordpress/)
- Mysql (hub.docker.com/_/mysql/)
- Обратный прокси-сервер Nginx (github.com/jwilder/nginx-proxy)
Я работаю над OSX, и это то, что я запускаю на терминале:
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:latest
docker run -e VIRTUAL_HOST=wordpress.mylocal.com --name wordpress --link some-mysql:mysql -p 8080:80 -d wordpress
Мой Docker работает на 192.168.99.100, и это приводит меня к ошибке 503 nginx/1.9.12 ofc.
Затем 192.168.99.100:8080 приводит меня к WordPress, как и ожидалось.
Но http://wordpress.mylocal.com/ это не работает; это не перенаправление на 192.168.99.100:8080, и я не понимаю, что я делаю неправильно.
Какие-либо предложения? Спасибо!
3 ответа
Прежде всего, я рекомендую вам начать использовать docker-compose, запуск ваших контейнеров и поиск ошибок станут намного проще.
Что касается вашего случая, кажется, что вы должны использовать VIRTUAL_PORT для прямого доступа к вашему контейнеру на 8080.
Во-вторых, вы не можете иметь два контейнера (nginx-proxy + wordpress), привязанных к одному и тому же порту на хосте.
Удачи!
Первый:
используйте docker compose.
vi docker-compose.yaml
Два:
вставьте это в файл:
version: '3'
services:
nginx-proxy:
image: budry/jwilder-nginx-proxy-arm:0.6.0
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs:ro
- confd:/etc/nginx/conf.d
- vhostd:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
labels:
- com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
environment:
- DEFAULT_HOST=example2.com
networks:
- frontend
letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion:stable
restart: always
volumes:
- certs:/etc/nginx/certs:rw
- confd:/etc/nginx/conf.d
- vhostd:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
# - LETSENCRYPT_SINGLE_DOMAIN_CERTS=true
# - LETSENCRYPT_RESTART_CONTAINER=true
- DEFAULT_EMAIL=example@mail.com
networks:
- frontend
depends_on:
- nginx-proxy
#########################################################
..The rest of the containers go here..
#########################################################
networks:
frontend:
driver: bridge
backend:
driver: bridge
volumes:
certs:
html:
vhostd:
confd:
dbdata:
maildata:
mailstate:
maillogs:
Третье:
настройте столько докеров, сколько вам нужно, и настройте их по своему вкусу. Вот некоторые примеры:
mysql (MariaDB):
mysql:
image: jsurf/rpi-mariadb:latest #MARIADB -> 10 #82eec62cce90
restart: always
environment:
MYSQL_DATABASE: nameExample
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: passwordRoot
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
networks:
- backend
command: --init-file /data/application/init.sql
volumes:
- /path_where_it_will_be_saved_on_your_machine/init.sql:/data/application/init.sql
- /physical_route/data:/var/lib/mysql
nginx-php7.4:
nginx_php:
image: tobi312/php:7.4-fpm-nginx-alpine-arm
hostname: example1.com
restart: always
expose:
- "80"
volumes:
- /physical_route:/var/www/html:rw
environment:
- VIRTUAL_HOST=example1.com
- LETSENCRYPT_HOST=example1.com
- LETSENCRYPT_EMAIL=example1@mail.com
- ENABLE_NGINX_REMOTEIP=1
- PHP_ERRORS=1
depends_on:
- nginx-proxy
- letsencrypt
- mysql
networks:
- frontend
- backend
WordPress:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=exampleuser
- WORDPRESS_DB_PASSWORD=examplepass
- WORDPRESS_DB_NAME=exampledb
- VIRTUAL_HOST=example2.com
- LETSENCRYPT_HOST=example2.com
- LETSENCRYPT_EMAIL=example2@mail.com
volumes:
- wordpress:/var/www/html #This must be added in the volumes label of step 2
Здесь вы можете найти множество примеров и документации.Будьте
осторожны, поскольку в некоторых примерах я помещаю изображения, предназначенные для rpi, и очень вероятно, что они вызовут проблемы в системах amd64 и intel32 . Вам следует выполнить поиск и выбрать изображения, которые вас интересуют, в соответствии с к вашему процессору и операционной системе
Четыре:
запустите эту команду, чтобы запустить все докеры.
docker-compose up -d --remove-orphans
"--remove-orphans" служит для удаления докеров, которых больше нет в вашем файле docker-compose.
Пятое:
когда вы выполните вышеуказанные шаги, вы можете прийти и спросить, что вы хотите, мы будем рады прочитать ваш dockerFile, не умирая, пытаясь прочитать множество команд.
В соответствии с вашим примером, я думаю, что лучшим решением для вас является использование обратного прокси-сервера nginx, который прослушивает сокет докера и может передавать запросы различным виртуальным хостам.
например, допустим, у вас есть 3 WP.
WP1 -> port binding to 81:80
WP2 -> port binding to 82:80
WP3 -> port binding to 83:80
для каждого из них вы должны использовать переменную окружения docker с именем виртуального хоста, которое вы хотите использовать.
WP1-> foo.bar1
WP2-> foo.bar2
WP3-> foo.bar3
После этого у вас должно быть 3 разных WP с портами на 81 82 83.
Теперь загрузите и запустите этот контейнер докера nginx (обратный прокси-сервер), он должен прослушивать сокет докера и получать все данные, поступающие на ваш компьютер через порт 80. Когда вы запустите контейнер WP и предоставленную вами переменную среды, он будет в состоянии определить, какой запрос должен получить к какому экземпляру WP...
Это пример того, как вы должны запустить один из ваших образов докера WP
> docker run -e VIRTUAL_HOST=foo.bar1.com -p 81:80 -d wordpres:tag
В этом случае виртуальный хост будет виртуальным хостом из запроса http