Обратный прокси 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

Другие вопросы по тегам