Причина, по которой вы не можете одновременно использовать apache и контейнер, заключается в том, что вы открываете порты в своем docker -compose.yml. Так что порты заблокированы. Expose означает, что ваш контейнер будет доступен по протоколу hostIP: Port, но порт может использоваться только одним приложением одновременно.
Я думаю, у вас запущена запрошенная настройка. Я использую nginx в качестве обратного прокси-сервера, установленного на хосте docker, чтобы выставить другой контейнер под поддоменами, например. app1.example.com, app2.example.com
Я использую разные docker сети для контейнера, поэтому они остаются изолированными.
Сначала создайте внешние docker сети:
docker network create --driver=bridge --subnet=192.168.1.0/29 --gateway=192.168.1.1 app1net
docker network create --driver=bridge --subnet=192.168.1.8/29 --gateway=192.168.1.9 app2net
Вы можете использовать меньшие или большие сети, если это необходимо. Не забудьте разрешить traffi c в и из сетей проходить через межсетевой экран вашего хоста.
Пример docker -compose.yml:
version: '3.1'
services:
wordpress:
image: wordpress:5.3.2-php7.4-apache
restart: always
links:
- db:db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: Pa$$w0rd
WORDPRESS_DB_NAME: wordpressdb
WORDPRESS_TABLE_PREFIX: wp_
volumes:
- ./html:/var/www/html
networks:
app1net:
ipv4_address: 192.168.1.2
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- db:db
networks:
app1net:
ipv4_address: 192.168.1.3
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpressdb
MYSQL_USER: wordpress
MYSQL_PASSWORD: Pa$$w0rd
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./mysql:/var/lib/mysql
networks:
app1net:
ipv4_address: 192.168.1.4
networks:
app1net:
external:
name: app1net
Доступны различные сервисы через 192.168.1.0/29 net с хоста.
Далее настройте сервер nginx virtal, но вы также можете использовать apache в качестве прокси:
NGINX прокси:
server {
listen 1.2.3.4:80 http2;
listen 1.2.3.4:443 ssl http2;
server_name app1.example.com;
index index.php index.html index.htm;
ssl_certificate /ssl/sslcert.pem;
ssl_certificate_key /ssl/privkey.pem;
location / {
try_files $uri @wordpress;
}
location / {
try_files $uri @phpmyadmin;
}
location @wordpress{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://192.168.1.2;
}
location @phpmyadmin{
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://192.168.1.3;
}
}
прокси Apache2:
<VirtualHost 1.2.3.4:443>
ServerName app1.example.com
SSLEngine on
SSLHonorCipherOrder on
SSLCertificateFile /ssl/sslcert.pem
SSLCertificateKeyFile /ssl/privkey.pem
ProxyPreserveHost On
ProxyPass / http://192.168.1.2
ProxyPassReverse / http://192.168.1.2
</VirtualHost>
<VirtualHost 1.2.3.4:80>
ServerName app1.example.com
ProxyPreserveHost On
ProxyPass / http://192.168.1.2
ProxyPassReverse / http://192.168.1.2
</VirtualHost>
Возможно, вам придется отредактировать конфигурацию по умолчанию apache в /etc/apache2/ports.conf, чтобы установить прослушиваемые ip / ports или отключить apache завершено. Вот почему вы не можете запустить оба сервера одновременно. Apache использует их. Но если вы используете apache в качестве прокси, это не нужно.
Listen 127.0.0.1:80
<IfModule ssl_module>
Listen 127.0.0.1:443
</IfModule>
<IfModule mod_gnutls.c>
Listen 127.0.0.1:443
</IfModule>
Надеюсь, это поможет ...