Docker中配置Nginx與PHP

最近在學docker,順便配置了一下docker中的nginx與php,發現網上的關於docker中配置nginx與php的資料不多,並且有的也很舊,沒有太多的參考性,因此決定本身寫一篇,分享一下其中的經驗。php

版本說明

  1. docker: Version 17.06.2-ce-mac27 (19124)
  2. PHP:7.1
  3. Nginx:1.13.3
  4. 操做系統 Mac 10.12.6

安裝docker

直接上docker的官網https://www.docker.com下載docker For Mac這個版本,是docker專門爲mac系統編寫的軟件,至關於一個app,下載安裝好後,打開docker App,而後在App中啓動docker便可。html

安裝Nginx

啓動docker以後,打開命令行,你的命令行裏面就有了docker這個命令:nginx

clipboard.png

而後我直接使用的是官方的nginx鏡像,下載方法:docker

docker pull nginx

等待下載完便可。安全

安裝PHP

同理,我也是使用的官方的PHP鏡像,其實nginx和php我都推薦官方的鏡像,畢竟官方鏡像表明着安全和穩定。網絡

docker pull php:7.1-fpm

你若是想下載其餘的版本,上官方鏡像上面去看一下,都有各類版本的說明,想下載什麼版本的都有。我這裏就用的最新的php版本了。app

啓動Nginx

安裝好nginx以後,便用命令啓動它:spa

docker run -p 80:80 --name mynginx -v /Users/Doubleduan/Documents/project:/home -v /Users/Doubleduan/Documents/conf:/etc/nginx/conf.d -d nginx
  • -p 表明着把容器中的80端口綁定到宿主機的80端口,因此之後訪問宿主機的80端口就會轉發到nginx容器的80端口
  • --name 啓動的容器的名稱,本身定義,方便好記就行
  • -v 就是把我主機的/Users/Doubleduan/Documents/project目錄映射到容器中的/home目錄中,在容器中訪問/home你就會發現是我/Users/Doubleduan/Documents/project目錄中的東西。我映射了項目目錄和配置文件,你也能夠把日誌目錄也映射了,這樣你之後操做什麼東西直接在主機中操做了,就不用登陸容器中去查看了。
  • -d 後臺運行容器
  • 後面的那個nginx就是鏡像的名稱了

啓動PHP

docker run -p 9000:9000 --name myphp -v /Users/Doubleduan/Documents/project:/home -d php:7.1-fpm

配置nginx的配置文件

下面貼出個人配置操作系統

server {
    listen       80;
    server_name  algo.test.com;
    root /home/algorithm;

    access_log  /var/log/nginx/access.log  main;
    error_log /var/log/nginx/error.log error;

    location / {
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        fastcgi_pass   172.17.0.3:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

這個algo.test.com我在主機的hosts文件中配置的指向127.0.0.1,其實就是訪問的本機80端口。這裏要特別注意兩個點:命令行

第一點:是fastcgi_pass 172.17.0.3:9000,這裏的172.17.0.3就是php容器的ip,查詢容器IP的方法:

docker inspect 容器ID或容器名 |grep '"IPAddress"'

你本身配置的話要替換成你本身的php容器ip,注意不能用127.0.0.1,由於我用的是docker默認的網絡鏈接模式,也就是docker bridge模式,這種模式下你要訪問另外一個容器就必須用那個容器的虛擬ip,並且端口也必需要與宿主機的相應端口綁定,由於宿主機是一個網關,nginx容器訪問php容器要通過宿主機的網關轉發的,因此不綁定端口確定訪問不了。

第二點
關於fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name這個配置,若是你想用$document_root變量,那就必須把nginx容器的數據目錄與php容器的數據目錄弄成一致的,好比個人nginx容器的數據目錄是/home/algorithm,在php容器中依然是這個,若是php容器中的目錄改變了,不是這個了,那麼php容器就會找不到請求的這個文件的。由於兩個容器至關於兩套文件系統,路徑有多是不同的。可是呢,若是你偏要設置成不同的,那麼只能寫死地址了,好比弄成這樣:fastcgi_param SCRIPT_FILENAME /home/algorithm/$fastcgi_script_name,就可讓php容器訪問到相應的文件了。

弄好配置文件以後,重啓nginx容器,就能夠訪問了。

相關文章
相關標籤/搜索