【发布时间】:2020-04-04 14:37:09
【问题描述】:
我正在尝试构建这样的结构:
application-1/
├── docker/
│ ├── apache2
│ ├── php
│ ├── docker-compose.yml
├── src/
└── other-framework-files/
application-2/
├── docker/
│ ├── apache2
│ ├── php
│ ├── docker-compose.yml
├── src/
└── other-framework-files/
每个应用程序都是相同代码的完全独立实例。我希望能够让我的应用程序生成两次,并且我可以在两个“盒子”上独立开发。
这种结构适用于一个实例。
假设在我的文件夹中我只有一个可以运行的应用程序:
cd application-1/
docker-compose up -d
这是我的 docker-compose.yml 文件
version: '3.7'
services:
webapp:
build:
context: ./php/
dockerfile: Dockerfile
container_name: webapp
image: php:7.4.2-fpm-alpine
volumes:
- ../:/srv/app
apache2:
build:
network: host
context: ./apache2/
dockerfile: Dockerfile
container_name: apache2
image: httpd:2.4.39-alpine
ports:
- 8080:80
volumes:
- ../:/srv/app
mysql:
container_name: mysql
image: mysql:latest
ports:
- 13306:3306
volumes:
- mysql:/var/lib/mysql:cached
environment:
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: content
MYSQL_USER: content
MYSQL_PASSWORD: content
redis:
container_name: redis
image: redis:5.0.6-alpine
ports:
- 16379:6379
volumes:
- redis:/data:cached
volumes:
mysql:
driver: local
redis:
driver: local
这对于应用程序的一个实例非常有效。
当我去
http://123.123.123:8080 (my Digital Ocean droplet)
我可以看到我的网站,一切都很好。
但是,如果我想将它复制到应用程序 2 并从那里运行它,我无法让它工作。对于第二个应用程序,我尝试更改所有容器的名称,并且还更改了如下端口:
version: '3.7'
services:
webapp2:
build:
context: ./php/
dockerfile: Dockerfile
container_name: webapp2
image: php:7.4.2-fpm-alpine
volumes:
- ../:/srv/app
apache2-2:
build:
network: host
context: ./apache2/
dockerfile: Dockerfile
container_name: apache2-2
image: httpd:2.4.39-alpine
ports:
- 8081:80
volumes:
- ../:/srv/app
mysql2:
container_name: mysql2
image: mysql:latest
ports:
- 13309:3306
volumes:
- mysql:/var/lib/mysql:cached
environment:
MYSQL_ROOT_USER: root
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: content
MYSQL_USER: content
MYSQL_PASSWORD: content
redis2:
container_name: redis2
image: redis:5.0.6-alpine
ports:
- 16380:6379
volumes:
- redis:/data:cached
volumes:
mysql2:
driver: local
redis2:
driver: local
通过这样做,我希望能够获得两个完全独立的多容器作曲家应用程序。这样两个开发人员就可以在同一个应用上分别工作。
但是当我尝试像这样访问它时
http://123.123.123:8081
它只是不加载任何东西。说网站不可用。它不会击中 apache 或任何东西。它只是行不通。
有人能在这里为我指明正确的方向吗?我不需要任何花哨的解决方案。这只是为了开发,只是为了开始,然后我可以尝试调整一些东西。
更新:
这是我的 apache2 配置。我已将 webapp 更改为 webapp2 作为第二个实例。
LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost *:80>
ServerName www.content.local
ServerAlias content.local
# Proxy .php requests to port 9000 of the php-fpm container
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://webapp:9000/srv/app/public/$1
DocumentRoot /srv/app/public
<Directory /srv/app/public>
DirectoryIndex index.php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# Send apache logs to stdout and stderr
CustomLog /proc/self/fd/1 common
ErrorLog /proc/self/fd/2
</VirtualHost>
【问题讨论】:
-
您能否再次检查所有目录名称是否正确(
src与srv等等)?特别是如果两个docker-compose.yml文件都在名为docker的目录中,这会有所不同。 -
@DavidMaze - 嗯,/srv/app 在我的 docker 文件中定义为:
WORKDIR /srv/app/。这是application1和application2文件夹所在的路径。在这些文件夹中,我有我的 symfony 应用程序。你觉得我在这里做错了吗?安装程序适用于端口 8080,但不适用于 8081。我是否认为这可能会这样工作?我也有 apache 代理配置,但我也在那里更新了容器名称。 -
如果在这两种情况下
docker-compose.yml文件都位于名为docker的目录中,则默认情况下,Compose 会认为它们“相同”,这会给您带来问题。 (但我的期望是第二个docker-compose.yml将替换第一个,而不是它会默默地丢失。)您不需要指定container_name:; Compose 会自行选择一个唯一的名称。 -
@Robert 您对网络部分的更改是 100% 必需的。正如您在此处看到的:docs.docker.com/network/bridge,默认桥接网络上的容器只能通过 IP 地址相互访问,因此您需要使用用户定义的网络来使用 apache 配置中的 container_name 来联系应用程序。
-
@akazuko Docker Compose 为您创建一个名为
default的“用户定义”桥接网络;容器间网络正常工作,docker-compose.yml文件中的任何地方都没有networks:部分。 Networking in Compose 有更多详情。
标签: php docker docker-compose apache2 devops