@goodjinny

Как заставить apache/nginx под докером работать вместе с локальным nginx?

Приветствую уважаемые эксперты!
Суть проблемы в следующем. У меня локально крутиттся связка nginx+php7.2+mysql которые использую для разработки сайтов. Стала задача поднять мой древний проект, который был еще написан на php5.3. Для этого нашел нужную зборку докера (apache+php5.3+mysql), который при запуске не отрабатывает т.к. имеется конфликт портов - порт 80 уже занят локальным nginx.
Как можно решить данную проблему не удаляя и не останавливая локальный nginx/mysql?
Не являюсь большим экспертом в сетевом взаимодействии, поэтому обращаюсь за помощью к вам.
  • Вопрос задан
  • 983 просмотра
Решения вопроса 2
IgorPI
@IgorPI
Я тоже совсем недавно работаю с докером.
Поделюсь своим опытом.

Использую Docker-compose.

Например мне нужно для сайта, открыть внешний доступ, который крутится где-то там в докере.
# Development configuration
version: "3.1"

services:

  app:
    container_name: rusaddress.app
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile-dev
    volumes:
      - .:/www
      - ./docker/php/log:/var/log
    depends_on:
      - db
    links:
      - db
    expose:
      - 9000



  # Nginx api server
  nginx-api:
    container_name: rusaddress.nginx-api
    restart: always
    build: ./docker/nginx
    volumes:
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./docker/nginx/sites-enabled/vhost-api.rusaddress.conf:/etc/nginx/sites-enabled/vhost-api.rusaddress.conf
    ports:
      - "127.0.0.150:8090:90"
    depends_on:
      - app
    expose:
      - "90"
    command: ["nginx", "-g", "daemon off;"]
...


Конфигурация сервера который крутится в докере
/docker/nginx/sites-enabled/vhost-api.rusaddress.conf
server {
    listen                          90;

    client_max_body_size            208M;
    access_log                      /var/log/nginx/api.access.log;
    root                            /www/public;

    location / {
        try_files                   $uri $uri/ /api.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info     ^(.+\.php)(/.+)$;
        fastcgi_pass                app:9000;
        fastcgi_index               api.php;
        include                     fastcgi_params;
        fastcgi_param               SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param               PATH_INFO $fastcgi_path_info;
    }
}


Теперь у меня сайт доступен локально
по адресу 127.0.0.150:8090

Как я понял, у Вас именно с этим проблема.

Теперь нам как то нужно открыть внешний доступ, для этого делаем следующее...

На реальном хосте, настраиваем nginx

server {
    listen      			%ip%:%httpport%;
    server_name 		api.rusaddress.local;
   
    access_log  			"%sprogdir%/userdata/logs/api.rusaddress.local.access.log combined";
    error_log   			"%sprogdir%/userdata/logs/api.rusaddress.local.error.log error";
	
	add_header				"Access-Control-Allow-Origin" "*";
	add_header				"Access-Control-Allow-Headers" "Origin, X-Requested-With, Content-Type, Accept, Authorization";
	add_header				"Access-Control-Request-Methods" "GET, POST, OPTIONS";

    location / {
	proxy_pass  		http://127.0.0.150:8090;	
        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-Host $server_name;
    }
}


Обратите внимание на адрес 127.0.0.150:8090

Теперь сайт доступен по api.rusaddress.local

api.rusaddress.local <---- это ваш публичный адрес

В моём случае локальный, так как я это сделал для себя, для разработки.
Восстановил картину, как это будет работать на реальном сервере.
Ответ написан
athacker
@athacker
Товарищ выше в целом верно говорит, только не обязательно для этого docker-compose использовать. Запустите контейнер со старым приложением с указанием ключа -p 8080:80. Тогда 80-ый порт контейнера будет доступен на 8080 порту хоста. Соответственно, снаружи можете подключаться к этому порту: http://my_host_ip:8080 -- и попадёте в своё старое приложение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы