2 つの別々のコンテナをリンクしようとしています:
問題は、phpスクリプトが動作しないことです。おそらくphp-fpmの設定が間違っているのでしょう。ここにソースコードがあります。リポジトリ. ファイルはこちらですdocker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
そして、Dockerfile
nginx のイメージに基づいてカスタム イメージを構築するために使用しました。
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
最後に、カスタム Nginx 仮想ホスト構成を次に示します。
server {
listen 80;
server_name localhost;
root /var/www/test;
error_log /var/log/nginx/localhost.error.log;
access_log /var/log/nginx/localhost.access.log;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass 192.168.59.103:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
これらのコンテナを正しく構成して PHP スクリプトを実行するのを手伝ってくれる人はいますか?
追伸私は次のようにdocker-composer経由でコンテナを実行します。
docker-compose up
プロジェクトのルートディレクトリから。
ベストアンサー1
少し古い投稿であることは承知していますが、私も同じ問題を抱えており、あなたのコードがなぜ機能しないのか理解できませんでした。何度もテストした結果、原因が分かりました。
server.root
fpm は nginx から完全なパスを受け取り、fpm コンテナ内のファイルを見つけようとするようです。そのため、 nginx コンテナ内に存在しない場合でも、nginx 構成とまったく同じである必要があります。
実証するには:
ドッカー
nginx:
build: .
ports:
- "80:80"
links:
- fpm
fpm:
image: php:fpm
ports:
- ":9000"
# seems like fpm receives the full path from nginx
# and tries to find the files in this dock, so it must
# be the same as nginx.root
volumes:
- ./:/complex/path/to/files/
デフォルト
server {
listen 80;
# this path MUST be exactly as docker-compose.fpm.volumes,
# even if it doesn't exist in this dock.
root /complex/path/to/files;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/.+\.php(/|$) {
fastcgi_pass fpm:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Dockerファイル
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/