github 項目地址 https://github.com/March7/docker-lnmp php
docker 基礎
docker的基礎用法請參考官方文檔
中文文檔參考。html
docker-compose
docker-compose 是用來管理編排多個容器協做的。mysql
經過 docker-compose.yml 來編排 nginx、php、mysql 之間的通訊和協做。nginx
在 docker-lnmp 目錄下經過命令 docker-compose up 啓動容器laravel
而後經過 localhost 或者 localhost:8000 就能夠訪問 index.php 了git
docker-compose.yml 簡單介紹
Mysql
先看 Mysql,由於這個 Mysql 鏡像直接來自與官方,沒有作任何修改。github
mysql: ### 容器名稱 image: mysql:5.7 ### 官方鏡像 版本號5.7 volumes: - mysql-data:/var/lib/mysql ### 數據卷,mysql數據就存放在這裏 ports: - "3306:3306" ###端口映射,主機端口:容器對外端口 environment: - MYSQL_ROOT_PASSWORD=123456 ### 設置環境變量,這個變量名是官方鏡像定義的。
官方 Mysql 鏡像構建參考。sql
PHP
PHP 鏡像也來自與官方,可是官方鏡像並無提供鏈接 Mysql 相關的 pdo_mysql 擴展,這裏作了一點修改,因此不能直接用 image 來依賴官方鏡像,須要單獨寫一個 Dockerfile 來自定義 PHP 鏡像。docker
php-fpm: build: context: ./php ### 自定義PHP鏡像的配置目錄 volumes: - ./www:/var/www/html ### 主機文件與容器文件映射共享,PHP代碼存這裏 expose: - "9000" ### 容器對外暴露的端口 depends_on: - mysql ### 依賴並連接Mysql容器,這樣在PHP容器就能夠經過mysql做爲主機名來訪問Mysql容器了
自定義 PHP 鏡像的配置文件 Dockerfileshell
### 來自官方的PHP鏡像版本爲7.1-fpm. ### 該版本只包含FPM不包括CLI,因此這裏並不能執行composer ### 若是須要用PHP-CLI 須要再開一個CLI容器,或者安裝同時包含FPM和CLI的版本 FROM php:7.1-fpm ### 設置環境變量 ENV TZ=Asia/Shanghai ### 執行bash命令安裝php所需的擴展 RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ ### 這裏是docker提供的安裝php擴展的方法,在這裏安裝了pdo_mysql擴展還有GD庫等 && docker-php-ext-install -j$(nproc) iconv mcrypt mysqli pdo_mysql \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd ### 擴展php.ini COPY ./php.ini /usr/local/etc/php/conf.d/php.ini
Nginx
Nginx 須要配置一個 server, 因此也須要一點簡單的定製
nginx: build: context: ./nginx ### 自定義Nginx鏡像的配置目錄 volumes: - ./www:/var/www/html 主機文件與容器文件映射共享,PHP代碼存這裏 ports: - "80:80" ### 端口映射,若是你主機80端口被佔用,能夠用8000:80 - "443:443" depends_on: - php-fpm ### 依賴並鏈接PHP容器,這樣在Nginx容器就能夠經過php-fpm做爲主機名來訪問PHP容器了
自定義 Nginx 鏡像的配置文件 Dockerfile
FROM nginx:1.11 ### 官方鏡像 ENV TZ=Asia/Shanghai ### 環境變量 COPY ./nginx.conf /etc/nginx/conf.d/default.conf ### server配置
Nginx server 配置
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; server_name localhost; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri /index.php =404; ### 主要是這裏用 php-fpm:9000來訪問PHP容器 fastcgi_pass php-fpm:9000; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }
volumes 數據卷
數據卷獨立與容器以外專門存放數據的
### 這裏定義了mysql所用到的數據卷 volumes: mysql-data:
php 測試代碼
<?php // 創建鏈接 try{ //這裏的mysql:host=mysql,後面這個mysql就是咱們的mysql容器 //用戶名 root 是默認的 //密碼 123456 就是咱們在mysql容器設置的環境變量 $dbh = new PDO("mysql:host=mysql;dbname=mysql", "root", 123456); $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $dbh->exec("SET CHARACTER SET utf8"); $dbh=null; //斷開鏈接 }catch(PDOException $e){ print"Error!:".$e->getMessage()."<br/>"; die(); } // 錯誤檢查S // 輸出成功鏈接 echo "<h1>成功經過 PDO 鏈接 MySQL 服務器</h1>" . PHP_EOL; phpinfo(); ?>
如何部署 laravel
部署 laravel 要用到 composer 和 git 因此須要多部署一個 php-cli 容器 ,並安裝 composer 和 git
github 源碼沒有該配置,須要手動添加一個。
php-cli 配置以下
php-cli: build: context: ./php-cli volumes: - ../www:/var/www/html tty: true
Dockerfile
FROM php:7.1-cli COPY ./composer.phar /usr/local/bin/composer RUN apt-get update && apt-get install -y git \ && chmod 755 /usr/local/bin/composer
須要把 composer.phar 提早下載好,並放在 php-cli 目錄下
進入容器
經過命令 docker exec -it dockerlnmp_php-cli_1 bash 進入容器來使用 composer 命令dockerlnmp_php-cli_1 是 docker-compose 自動生成容器名稱,你也能夠自定義。能夠經過 docker-compose ps 來查看全部在運行的容器列表