構建的環境爲:PHP 7.1.3 fpm & Nginx 1.11.10 & MySQL 5.7
對 Docker 不熟悉的讀者能夠參考以前撰文的一篇文章:Docker 快速上手php
這裏使用 docker-compose 的方式,配置內容以下:html
version: "2" services: # Nginx 1.11.10: https://hub.docker.com/_/nginx/ web: image: nginx:1.11.10 ports: # 將主機的 8080 端口映射到容器的 80 端口 - 8080:80 depends_on: - php # 同 php 一塊兒共享 ./apps 目錄 volumes_from: - php # 建立一個數據卷,由 ./images/nginx/config => /etc/nginx/conf.d volumes: - ./images/nginx/config:/etc/nginx/conf.d:ro # PHP 7.1-fpm: https://hub.docker.com/_/php/ php: image: php:7.1-fpm volumes: - ./apps:/mnt/apps # MySQL 5.7: https://hub.docker.com/_/mysql/ database: image: mysql:5.7 # 配置一些環境變量,具體的環境變量細節能夠訪問上面的網址查看 environment: MYSQL_ROOT_PASSWORD: "root" MYSQL_USER: "dailybird" MYSQL_PASSWORD: "dailybirdo" volumes: - ./database:/var/lib/mysql
在 docker-compose.yml
中,已將 Nginx 的配置目錄 /etc/nginx/conf.d
映射到 ./images/nginx/config
目錄中。根據 Nginx 的配置,處於該目錄下全部 .conf
文件都會做爲配置文件,於是咱們能夠新建一個 default.conf
進行配置。mysql
server{ listen 80; server_name localhost; root /mnt/apps; index index.php index.html index.htm; location / { index index.php index.html; try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { # 這裏使用 php 做爲內部域名鏈接 php 容器 fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
在 docker-compose.yml
所在目錄下,執行如下指令,建立支撐 LNMP 服務的容器組:nginx
docker-compose up -d
這以後,Docker 會建立一個 bridge
類型的網絡並將這三個容器接入網絡內。git
此外,因爲 docker-compose.yml
中的數據卷配置,在當前目錄下,還會建立 database
目錄用於映射數據庫文件目錄;建立 apps
目錄用於存放 web 應用;建立 images/nginx/config
目錄映射 Nginx 配置文件目錄。github
在 docker-compose.yml
中,咱們進行了 8080 => 80
的端口映射;此外,在 default.conf
中,Nginx 的請求被指向了容器的 /mnt/apps
目錄,而該目錄與主機的 ./apps
目錄造成了映射,於是咱們能夠經過 localhost:8080
訪問到 Nginx 容器的服務。固然,還要注意主機端口的佔用狀況,必要時能夠在 docker-compose.yml
中將 8080 端口改成其餘。web
此時,咱們只須要在 ./apps
目錄下建立一個簡單的 PHP 文件,如 test.php
,而後即可以經過 localhost:8080/test.php
訪問了。sql
若是須要向 PHP 中添加擴展,則須要藉助 Dockerfile,並按照官方鏡像給出的方法,安裝相應的擴展,詳情可見 Docker - PHP7.1-fpm。以下,可在 PHP 鏡像中添加 gd
pdo_mysql
zip
opcache
擴展。docker
# Dockerfile 文件 FROM php:7.1-fpm MAINTAINER dailybird <dailybird@mail.com> RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ && docker-php-ext-install gd pdo_mysql zip opcache
相應的,咱們也須要將 docker-compose.yml
文件中的 image
改 build
方式,即由 Dockerfile
建立:數據庫
# ... php: # image: php:7.1-fpm build: # 指出 Dockerfile 所在的文件目錄和文件名 context: ./images/php dockerfile: Dockerfile # ...
咱們能夠經過 Dockerfile
文件,將一部分配置文件拷貝到 /usr/local/etc/php/conf.d
中,從而在鏡像啓動時即可以覆蓋對應的配置:
# Dockerfile 其餘內容... # 將對應的配置文件拷貝到容器中的 PHP 配置目錄中,以覆蓋原有的 PHP 配置 COPY ./config/php.ini /usr/local/etc/php/conf.d/ COPY ./config/opcache-recommended.ini /usr/local/etc/php/conf.d/
這兩個配置文件的內容爲:
memory_limit = 512M post_max_size = 1024M upload_max_filesize = 1024M
更多配置項可見:http://php.net/manual/zh/ini....
opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=60 opcache.fast_shutdown=4 opcache.enable_cli=1
有關 opcache 能夠參考:http://www.cnblogs.com/HD/p/4...
此外,咱們也能夠添加一個數據卷將配置文件目錄映射到主機上以便隨時修改。
咱們能夠製做一個容器,用於安裝 git
composer
等命令工具以即可以使用它們操做項目文件。這時,咱們須要對如下文件進行修改:
services: # 其餘... # 用於 Git,Composer 等工具 console: build: context: ./images/console dockerfile: Dockerfile volumes_from: - php tty: true
因爲繼承了與 PHP 鏡像相同的數據卷,這一工具容器也能夠實現對 ./apps
項目文件目錄的操做。
接下來須要添加 Dockerfile
文件,該文件對應 docker-compose.yml
中的 build
,以下:
FROM php:7.1-fpm MAINTAINER dailybird <dailybird@mail.com> # 安裝 git curl vim zip RUN apt-get update && apt-get install -y git curl vim libfreetype6-dev \ && rm -rf /var/lib/apt/list* \ && pecl install zip \ && docker-php-ext-enable zip # 安裝 composer RUN curl -o composer.phar https://getcomposer.org/download/1.4.1/composer.phar \ && chmod +x composer.phar # 配置 composer ,將鏡像源改成中國國內 RUN mv composer.phar /usr/local/bin/composer \ && echo 'export PATH="$PATH:$HOME/.composer/vendor/bin"' >> ~/.bashrc \ && . ~/.bashrc \ && composer config -g repo.packagist composer https://packagist.phpcomposer.com # 設置 Git 的身份 RUN git config --global user.name "username" \ && git config --global user.email "user@mail.com"
注意按照實際狀況修改 Git 信息。
因爲以前的 Dockerfile 中存在很多下載命令,使用 docker-compose up --build -d
時會因網速問題執行很長時間,因此咱們能夠將下載部分抽離出來,製做成新鏡像後直接使用。這樣一來,構建的過程就會很是迅速。
我已經在 Github 上建立了這樣一個項目,其中那些須要大量下載的鏡像都已製做並上傳到鏡像倉庫,你們能夠經過如下方式克隆:
git clone https://github.com/dailybird/docker-compose-lnmp.git
使用方式能夠參考如下步驟。
在建立容器前,有一些內容須要按照實際狀況進行修改:
修改 web 容器配置中的端口號,可將 8080
改成其餘端口;
修改 database 容器配置中數據庫用戶名、密碼一類的信息;
修改 database 的 ports。該配置用於創建遠程鏈接,使得本地能夠經過 3306
端口鏈接到宿主機,進而鏈接到這一 Docker 容器的 MySQL 服務。可按須要修改端口映射關係或註釋該行;
須要修改 Git 身份信息。
在克隆後的目錄中執行:
docker-compose up --build -d
執行完畢後,使用 docker ps
能夠發現有四個容器正在運行,包括:
PHP 容器,包含 fpm 和一些 PHP 擴展;
web 容器:Nginx 容器;
MySQL 容器;
console 容器:工具類容器,包括 Git,Composer 等;
建立容器後,原目錄下會有三個子目錄:
用於存放項目文件,該目錄爲 PHP 容器、Nginx 容器,以及工具類容器共享。
該目錄爲數據庫目錄,與 MySQL 的數據目錄映射。
該目錄包含鏡像的 Dcokerfile 文件及配置目錄,其中,config 子目錄與服務類容器的對應配置文件目錄造成映射。
當再也不使用時,可使用如下命令刪除容器。注意:數據卷不會隨之刪除。
docker-compose down