原文: https://blog.csdn.net/liuyueyi1995/article/details/61204205
你先確認這兩件事:1)執行 docker exec -it dream.php bash,到 php 存放目錄看看,如果看不到你的文件,目錄映射多半有問題;2)確認 fastcgi_param 設置的路徑,先配成絕對路徑(如上文)試試。
--------------------------------------------------------------------------------------------------------------------------------------
0 任務簡介
- 在
Ubuntu 16.04
虛擬機中安裝docker
- 使用
docker
安裝PostgreSQL
- 完成端口映射使得外部機器可以訪問虛擬機中的數據庫
1 安裝docker
這一部分比較簡單,不過考慮到完整性,還是列出來吧。
我這次選擇的是docker-ce
,安裝流程如下:
1.1 建立 repository
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
- 1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 1
sudo apt-key fingerprint 0EBFCD88
- 1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 1
1.2 安裝docker
sudo apt-get update
- 1
sudo apt-get install docker-ce
- 1
2 安裝PostgreSQL
docker pull postgres:9.4
- 1
3 創建容器
docker的容器默認情況下只能由本地主機訪問,即A主機上的容器不能被B主機訪問,所以要做端口映射。
docker run --name postgres1 -e POSTGRES_PASSWORD=password -p 54321:5432 -d postgres:9.4
- 1
解釋: run
,創建並運行一個容器; --name
,指定創建的容器的名字; -e POSTGRES_PASSWORD=password
,設置環境變量,指定數據庫的登錄口令為password
; -p 54321:5432
,端口映射將容器的5432端口映射到外部機器的54321端口; -d postgres:9.4
,指定使用postgres:9.4
作為鏡像。
3.1 驗證結果
之后運行docker ps -a
,結果和下表類似:
CONTAINER ID | IMAGE | COMMAND | CREATED | STATUS | PORTS | NAMES |
---|---|---|---|---|---|---|
f6951e0c5c77 | postgres:9.4 | “docker-entrypoint…” | 38 minutes ago | Up 38 minutes | 0.0.0.0:54321->5432/tcp | postgres1 |
3.2 關鍵點
我自己安裝的過程中遇到了不少的坑,我認為最重要的一點是docker命令中參數的順序。
例如端口映射的-p 54321:5432
的位置如果過於靠后,則會導致映射失敗。
4 連接數據庫
之前的准備工作都已完成,下一步就是從外部訪問數據庫了。
這一步就很常規了:
psql -U postgres -h 192.168.100.172 -p 54321
- 1
注意:
postgres鏡像默認的用戶名為postgres
,
登陸口令為創建容器是指定的值。
5 參考文獻
[1] docker官網
[2] postgres鏡像官方文檔
[3] 非常詳細的 Docker 學習筆記
------------------------------------------------------------------------------------------docker nginx php-fpm 的配置----------------------------
原文:https://segmentfault.com/a/1190000007056245
看完 docker 官方教程,想搭個本地 php 開發環境,可搜了一圈,也沒找到特別滿意的文章,順手總結一個。
假設
- 你知道 nginx、php-fpm 是什么
- 你了解 docker 的基本命令
運行環境
MacBook Pro,OSX 10.11.5
啟動 php-fpm
解釋執行 php 需要 php-fpm,先讓它運行起來:
docker run --name dream-php -d \ -v ~/Workspace/tmp/www:/var/www/html:ro \ php:7.1-fpm
說明:
- dream-php 是容器的名字。
- ~/Workspace/tmp/www 是本地 php 文件的存儲目錄,/var/www/html 是容器內 php 文件的存儲目錄,ro 表示只讀。
編輯 nginx 配置文件
本地存儲路徑:
~/Workspace/tmp/docker/nginx/conf.d/default.conf
配置文件內容:
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name; include fastcgi_params; } }
說明:
- php:9000 表示 php-fpm 服務的 URL,下文還會提及。
- /var/www/html 是 dream-php 中 php 文件的存儲路徑,經 docker 映射,變成本地路徑 ~/Workspace/tmp/www(可以再看一眼 php-fpm 啟動命令)
啟動 nginx
docker run --name dream-nginx -p 80:80 -d \ -v ~/Workspace/tmp/www:/usr/share/nginx/html:ro \ -v ~/Workspace/tmp/docker/nginx/conf.d:/etc/nginx/conf.d:ro \ --link dream-php:php \ nginx
說明:
- -p 80:80 用於添加端口映射,把 dream-nginx 中的 80 端口暴露出來。
- ~/Workspace/tmp/www 是本地 html 文件的存儲目錄,/usr/share/nginx/html 是容器內 html 文件的存儲目錄。
- ~/Workspace/tmp/docker/nginx/conf.d 是本地 nginx 配置文件的存儲目錄,/etc/nginx/conf.d 是容器內 nginx 配置文件的存儲目錄。
- --link dream-php:php 把 dream-php 的網絡並入 dream-nginx,並通過修改 dream-nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,讓 nginx 通過 php:9000 訪問 php-fpm。
測試結果
在 ~/Workspace/tmp/www 下放兩個文件:
index.html
<html><body><h1>Hello World</h1></body></html>
phpinfo.php
<?php phpinfo();
接下來看結果吧:
如果看到 Hello World 和熟悉的 phpinfo,那么大功告成。
訪問 index.html 時,nginx 讀的是 /usr/share/nginx/html/index.html,這個路徑經 dream.nginx 轉換變成本地的 ~/Workspace/tmp/www/index.html。
訪問 phpinfo.php 時,nginx 讓 php-frm 執行 /var/www/html/phpinfo.php,這個路徑經 dream.php 轉換成 ~/Workspace/tmp/www/phpinfo.php。
FAQ
怎樣觀察容器內文件系統:
docker exec -it dream-nginx bash