Saya mencoba menautkan 2 wadah terpisah:
Masalahnya adalah skrip php tidak berfungsi. Mungkin konfigurasi php-fpm salah. Ini adalah kode sumbernya, yang ada di repositori saya . Ini filenya docker-compose.yml
:
nginx:
build: .
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www/test/
links:
- fpm
fpm:
image: php:fpm
ports:
- "9000:9000"
dan Dockerfile
yang saya gunakan untuk membuat gambar khusus berdasarkan nginx:
FROM nginx
# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/
Terakhir, berikut adalah konfigurasi virtual host Nginx khusus saya:
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;
}
}
Adakah yang bisa membantu saya mengkonfigurasi wadah ini dengan benar untuk menjalankan skrip php?
PS Saya menjalankan kontainer melalui buruh pelabuhan-komposer seperti ini:
docker-compose up
dari direktori root proyek.
php
nginx
docker
dockerfile
docker-compose
Victor Bocharsky
sumber
sumber
docker exec
masuk ke container yang sedang berjalan dan melakukan ping ke fpm?Nginx
danPHP-FPM
bersama dengan Gelandangan dan Ansible. Periksa repo saya github.com/bocharsky-bw/vagrant-ansible-docker jika Anda mau.Jawaban:
Jangan melakukan hardcode ip kontainer di konfigurasi nginx, tautan pekerja pelabuhan menambahkan nama host dari mesin yang ditautkan ke file host dari kontainer dan Anda harus dapat melakukan ping dengan nama host.
EDIT: Jaringan Docker 1.9 tidak lagi mengharuskan Anda untuk menghubungkan kontainer, ketika beberapa kontainer terhubung ke jaringan yang sama, file host mereka akan diperbarui sehingga mereka dapat menjangkau satu sama lain dengan nama host.
Setiap kali kontainer buruh pelabuhan berputar dari gambar (bahkan menghentikan / memulai kontainer yang ada) kontainer mendapatkan ip baru yang ditetapkan oleh tuan rumah buruh pelabuhan. Ip ini tidak berada di subnet yang sama dengan mesin Anda yang sebenarnya.
lihat dokumen penautan buruh pelabuhan (inilah yang digunakan penulisan di latar belakang)
tetapi lebih jelas dijelaskan dalam
docker-compose
dokumen tentang tautan & eksposdan jika Anda menyiapkan proyek Anda untuk mendapatkan port + kredensial lain melalui variabel lingkungan, tautan secara otomatis menetapkan banyak variabel sistem :
sumber
--links
sekarang sudah usang, menurut dokumentasi buruh pelabuhan yang Anda rujuk. Mereka saat ini masih didukung tetapi rencana yang jelas agar mereka ditinggalkan.Saya tahu ini semacam posting lama, tetapi saya memiliki masalah yang sama dan tidak dapat memahami mengapa kode Anda tidak berfungsi. Setelah BANYAK tes, saya menemukan alasannya.
Sepertinya fpm menerima jalur lengkap dari nginx dan mencoba menemukan file di penampung fpm, jadi itu harus persis sama dengan
server.root
di konfigurasi nginx, meskipun tidak ada di penampung nginx.Untuk menunjukkan:
docker-compose.yml
/etc/nginx/conf.d/default.conf
Dockerfile
sumber
/var/www/html
dengan kegagalan.:9000
port yang digunakan di wadah bukan yang terekspos ke host Anda. Butuh waktu 2 jam untuk menyelesaikannya. Mudah-mudahan, Anda tidak perlu melakukannya.services.fpm.ports is invalid: Invalid port ":9000", should be [[remote_ip:]remote_port[-remote_port]:]port[/protocol]
ports
bagian sama sekali di sini. Anda mungkin hanya perlu melakukannyaexpose
jika belum ada dalam gambar (yang mungkin sudah ada). Jika Anda melakukan komunikasi antar-kontainer, Anda tidak boleh mengekspos port PHP-FPM.AH01071: Got error 'Primary script unknown\n'
dan bahwa wadah php-fpm harus berbagi direktori yang sama dengan node web adalah solusinya!Seperti yang ditunjukkan sebelumnya, masalahnya adalah file tidak terlihat oleh penampung fpm. Namun untuk berbagi data di antara penampung, pola yang disarankan menggunakan penampung hanya data (seperti yang dijelaskan dalam artikel ini ).
Singkat cerita: buat wadah yang hanya menyimpan data Anda, bagikan dengan volume, dan tautkan volume ini di aplikasi Anda dengan
volumes_from
.Menggunakan compose (1.6.2 di mesin saya),
docker-compose.yml
file akan membaca:Perhatikan bahwa
data
menerbitkan volume yang terkait dengan layanannginx
danfpm
. KemudianDockerfile
untuk layanan data , yang berisi kode sumber Anda:Dan
Dockerfile
untuk nginx, itu hanya menggantikan konfigurasi default:Demi penyelesaian, berikut file konfigurasi yang diperlukan agar contoh berfungsi:
yang hanya memberi tahu nginx untuk menggunakan volume bersama sebagai root dokumen, dan menyetel konfigurasi yang tepat untuk nginx agar dapat berkomunikasi dengan penampung fpm (yaitu: hak
HOST:PORT
, yangfpm:9000
berkat nama host yang ditentukan oleh compose, dan theSCRIPT_FILENAME
).sumber
Dockerfile
penampung data menyalin sumber Anda ke penampung pada waktu pembuatan. Itulah mengapa mereka tidak akan diperbarui jika Anda mengubah file di host. Jika Anda ingin membagikan sumber antara host dan container, Anda perlu memasang direktori. Ubahdata
layanan di file tulis yang akan dimuatimage: busybox
, dan divolumes
bagian masukkan./sources:/var/www/html
, di mana./sources
jalur ke sumber Anda di host.Jawaban Baru
Docker Compose telah diperbarui. Mereka sekarang memiliki format file versi 2 .
Mereka sekarang mendukung fitur jaringan Docker yang ketika dijalankan mengatur jaringan default yang disebut myapp_default
Dari dokumentasinya, file Anda akan terlihat seperti di bawah ini:
Karena kontainer ini secara otomatis ditambahkan ke jaringan default myapp_default, mereka akan dapat saling berbicara. Anda kemudian akan memiliki konfigurasi Nginx:
fastcgi_pass fpm:9000;
Juga seperti yang disebutkan oleh @treeface di komentar ingat untuk memastikan PHP-FPM mendengarkan pada port 9000, ini dapat dilakukan dengan mengedit di
/etc/php5/fpm/pool.d/www.conf
tempat yang Anda perlukanlisten = 9000
.Jawaban Lama
Saya telah menyimpan di bawah ini di sini untuk mereka yang menggunakan versi lama penulisan Docker / Docker dan ingin informasinya.
Saya terus tersandung pada pertanyaan ini di google ketika mencoba menemukan jawaban untuk pertanyaan ini tetapi itu tidak cukup apa yang saya cari karena penekanan Q / A pada docker-compose (yang pada saat penulisan hanya memiliki dukungan eksperimental untuk fitur jaringan buruh pelabuhan). Jadi inilah pendapat saya tentang apa yang telah saya pelajari.
Docker baru - baru ini menghentikan fitur tautannya demi fitur jaringannya
Oleh karena itu, dengan menggunakan fitur Jaringan Docker Anda dapat menautkan kontainer dengan mengikuti langkah-langkah berikut. Untuk penjelasan lengkap tentang opsi, baca di dokumen yang ditautkan sebelumnya.
Pertama buat jaringan Anda
Selanjutnya jalankan penampung PHP-FPM Anda memastikan Anda membuka port 9000 dan menetapkan ke jaringan baru Anda (
mynetwork
).Bagian penting di sini adalah
--name php-fpm
di akhir perintah yang merupakan namanya, kita akan membutuhkannya nanti.Selanjutnya jalankan container Nginx Anda lagi tetapkan ke jaringan yang Anda buat.
Untuk wadah PHP dan Nginx, Anda juga dapat menambahkan
--volumes-from
perintah dll sesuai kebutuhan.Sekarang sampai pada konfigurasi Nginx. Yang seharusnya terlihat seperti ini:
Perhatikan
fastcgi_pass php-fpm:9000;
di blok lokasi. Itu mengatakan wadah kontakphp-fpm
di pelabuhan9000
. Ketika Anda menambahkan kontainer ke jaringan jembatan Docker, mereka semua secara otomatis mendapatkan pembaruan file host yang menempatkan nama kontainer mereka pada alamat IP mereka. Jadi ketika Nginx melihat bahwa ia akan tahu untuk menghubungi wadah PHP-FPM yang Anda beri namaphp-fpm
sebelumnya dan ditugaskan ke Andamynetwork
jaringan Docker .Anda dapat menambahkan konfigurasi Nginx itu selama proses pembuatan container Docker Anda atau setelahnya terserah Anda.
sumber
php-fpm
sedang mendengarkan pada port 9000. Ini akanlisten = 9000
masuk/etc/php5/fpm/pool.d/www.conf
.Seperti jawaban sebelumnya telah dipecahkan, tetapi harus dinyatakan dengan sangat eksplisit: kode php harus tinggal di wadah php-fpm, sedangkan file statis harus tinggal di wadah nginx. Untuk kesederhanaan, kebanyakan orang baru saja melampirkan semua kode ke keduanya, seperti yang juga saya lakukan di bawah ini. Jika di masa mendatang, saya kemungkinan akan memisahkan bagian kode yang berbeda ini dalam proyek saya sendiri untuk meminimalkan wadah mana yang memiliki akses ke bagian mana.
Memperbarui file contoh saya di bawah dengan wahyu terbaru ini (terima kasih @alkaline)
Ini tampaknya menjadi pengaturan minimum untuk docker 2.0 ke depan (karena segalanya menjadi jauh lebih mudah di buruh pelabuhan 2.0)
docker-compose.yml:
( DIPERBARUI docker-compose.yml di atas : Untuk situs yang memiliki css, javascript, file statis, dll., Anda memerlukan file tersebut yang dapat diakses ke penampung nginx. Sambil tetap memiliki semua kode php yang dapat diakses ke penampung fpm. Sekali lagi, karena kode dasar saya adalah campuran css, js, dan php yang berantakan, contoh ini hanya melampirkan semua kode ke kedua wadah)
Di folder yang sama:
site.conf:
Dalam kode folder:
./code/index.php:
dan jangan lupa untuk memperbarui file host Anda:
dan jalankan docker-compose Anda
dan coba URL dari browser favorit Anda
sumber
Saya pikir kita juga perlu memberikan volume pada wadah fpm, bukan? Jadi =>
Jika saya tidak melakukan ini, saya mengalami pengecualian ini saat menjalankan permintaan, karena fpm tidak dapat menemukan file yang diminta:
sumber
Nginx
danPHP-FPM
di GitHubUntuk siapa saja yang mendapatkan
saat menggunakan
index.php
whileindex.html
berfungsi dengan sempurna dan telah memasukkanindex.php
indeks di blok server konfigurasi situs merekasites-enabled
Pastikan file nginx.conf Anda
/etc/nginx/nginx.conf
benar-benar memuat konfigurasi situs Anda dihttp
blok ...sumber