docker-lnmp 多容器部署 Laravel 方案分享(轉)

docker lnmp 多容器部署方案。徹底基於 docker 官方鏡像,遵循最佳實踐,一容器一進程。

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 來查看全部在運行的容器列表

相關文章
相關標籤/搜索