昨天拿到一個用thinkphp開發(fā)的網站玖瘸,需要跑起來看看效果杰捂,但苦于自己好久不開發(fā)PHP了舆床,手里已經沒有集成環(huán)境,便想著用docker搭一套環(huán)境嫁佳,本以為可以信手拈來挨队,沒想到還踩了不少坑,也對之前一知半解的東西加深了一下理解蒿往,故在這里記錄一下
準備鏡像
這個沒有多大問題盛垦,去hub.docker.com找些官方的鏡像就可以了,我這兒用到了nginx瓤漏,php-fpm,mysql,獲取命令放在這兒腾夯,方便大家直接使用
docker pull nginx
docker pull bitnami/php-fpm
docker pull mysql
編寫docker-compose.yml
version: "3"
services:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./default.conf:/etc/nginx/conf.d/default.conf ##配置文件位置映射
- .:/usr/share/nginx/html ##網頁文件位置映射
depends_on:
- php
php:
image: bitnami/php-fpm
volumes:
- .:/app ##網頁文件位置映射
depends_on:
- mysql
links:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_PASSWORD: EisBzdye6adiJHHj ##數(shù)據(jù)庫用戶密碼
MYSQL_DATABASE: www_ammopic_com
MYSQL_USER: www_ammopic_com
ports:
- 3306:3306
volumes:
- ./www_ammopic_com.sql:/docker-entrypoint-initdb.d/db.sql
問題1:依賴啟動
nginx依賴于php-fpm,php-fpm又依賴于mysql颊埃,depends_on很好的解決了這個問題
問題2:mysql自動填充創(chuàng)建數(shù)據(jù)庫以及填充數(shù)據(jù)
雖然可以把mysql先運行起來,然后把sql文件拷貝進去蝶俱,然后進入容器執(zhí)行導入腳本班利,但總覺得這樣操作很low,都想好了要做一條命令啟動一個環(huán)境了跷乐,如果還有這么多操作就違背初衷了肥败。
查了一下,mysql有個機制愕提,可以從/docker-entrypoint-initdb.d/
這個路徑下檢查sql文件馒稍,sh腳本等,從而實現(xiàn)自動導入數(shù)據(jù)的功能浅侨,非常好用纽谒,完美的解決了這個問題
問題3:各容器之間如何通信,統(tǒng)一端口映射到主機非常不優(yōu)雅
之前操作的時候因為經常開發(fā)如输,所以像nginx鼓黔,mysql這些都是把端口直接映射到主機的,這樣方便了開發(fā)不见,但又違背了初衷澳化。所幸links完美的解決了這個問題,這樣在代碼里連接mysql稳吮,在nginx里連接php-fpm都很方便了缎谷,而且不會對外暴露,非常好用
編寫nginx配置文件
server {
listen 80;
listen [::]:80;
server_name localhost;
root /usr/share/nginx/html/public;
location / {
if (!-e $request_filename){
rewrite ^(.*)$ /index.php?s=$1 last; break;
}
index index.html index.php index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
root /app/public;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
這種寫了不知道多少遍的配置文件灶似,居然也出現(xiàn)了翻船的時候列林,正應了那句話,拳不離手曲不離口酪惭。
問題1:root目錄
thinkphp和laravel一樣希痴,是需要將根目錄映射到public目錄的,這該死的記性
問題2:連接到php-fpm應該如何寫
以前寫配置的時候nginx和php-fpm都是在同一臺機器上春感,所以代碼位置也放在了一起砌创,這一次代碼分別在nginx容器和php-fpm容器里,一時還寫不對了鲫懒。最后測試發(fā)現(xiàn)纺铭,在連接php-fpm的配置里,需要寫的文件位置是php-fpm容器里的代碼路徑刀疙,如上述文件的/app/public
最后執(zhí)行
docker compose up
,鏡像沒有問題舶赔,但網站依舊訪問不了,究其原因谦秧,是因為奇葩的開發(fā)者寫的奇葩的邏輯竟纳,與本文想講的技術無關了撵溃,但依然忍不住想在這里吐槽,這種不靠譜的程序員什么時候能少一點……