開篇
Use Docker First And Learn About It Later
簡介
Laradock 是為 Docker 提供的完整 PHP 本地開發環境,和 Homestead 一樣提供了一系列打包好(包括配置)的 Docker Image。Laradock 早期專注為 Laravel 打造 Docker 開發環境,因而最早在 Laravel 社區中出名,后來隨着影響力的擴大,逐漸被 PHP 社區接納和采用,目前支持的 PHP 項目除了 Laravel 之外,還有 Symfony、CodeIgniter、WordPress、Drupal 等等。
Docker 掃盲
在學習和使用 Laradock 之前,我們有必要先學習和了解 Docker,而在使用 Docker 之前,又有必要搞清楚下面兩個問題:
Docker 是什么
Docker 基於 Go 語言開發,是一個基於 LXC 技術之上構建的 Container 容器引擎。容器是一種以固定格式打包軟件的方式,以便讓軟件可以在共享的操作系統中運行,不同於虛擬機,容器並不需要捆綁這個操作系統,只需要軟件正常工作所必須的庫和設置即可,這使得容器更加高效、輕量級、可以自成系統並且不管部署在什么地方都可以保證運行結果一致。
Docker提供了一種在安全、可重復的環境中自動部署軟件的方式,它的出現拉開了基於雲計算平台發布產品方式的變革序幕。開發者使用 Docker 可以解決當需要和同事共享代碼時"只能在我的機器工作"的問題;操作者使用 Docker 可以在關聯容器中邊運行邊管理以便獲取更好的計算密度;企業使用 Docker 可以用來構建敏捷的軟件分發管道以便可以更快處理新特性。
為什么要使用 Docker
Docker 的出現就是為了解決以下問題:
-
環境管理復雜: 從各種 OS 到各種中間件再到各種 App,一款產品能夠成功發布,作為開發者需要關心的東西太多,且難於管理,這個問題在軟件行業中普遍存在並需要直接面對。Docker 可以簡化部署多種應用實例工作,比如Web應用、后台應用、數據庫應用、大數據應用比如 Hadoop 集群、消息隊列等等都可以打包成一個 Image 部署。
-
雲計算時代的到來: AWS 的成功, 引導開發者將應用轉移到雲上, 解決了硬件管理的問題,然而軟件配置和管理相關的問題依然存在。Docker 的出現正好能幫助軟件開發者開闊思路,嘗試新的軟件管理方法來解決這個問題。
-
虛擬化手段的變化: 雲時代采用標配硬件來降低成本,采用虛擬化手段來滿足用戶按需分配的資源需求以及保證可用性和隔離性。然而無論是 KVM 還是 Xen,在 Docker 看來都在浪費資源,因為用戶需要的是高效運行環境而非 OS, GuestOS 既浪費資源又難於管理, 更加輕量級的 LXC 更加靈活和快速。
-
LXC的便攜性: LXC在 Linux 2.6 的 Kernel 里就已經存在了,但是其設計之初並非為雲計算考慮的,缺少標准化的描述手段和容器的可便攜性,決定其構建出的環境難於分發和標准化管理。Docker就在這個問題上做出了實質性的創新方法。
Docker 通常用於如下場景:
-
Web 應用的自動化打包和發布;
-
自動化測試和持續集成、發布;
-
在服務型環境中部署和調整數據庫或其他的后台應用;
-
從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平台來搭建自己的 PaaS 環境。
本教程不將那么多高大上的東西了,我們專注於通過 Docker 構建一個可移植的本地開發環境。
Docker 安裝使用
首先我們需要在系統安裝 Docker 的免費社區版,官方提供 Windows、Mac 及 Linux 等版本下載:
下載地址。下載操作系統對應版本后,按照引導流程安裝,最后打開 Docker 應用,即可在命令行檢查是否安裝成功:
Mac:
Windows:
docker-desktop
:https://blog.csdn.net/luomin369433047/article/details/105110161
注:Windows 系統下使用 Docker 需啟用 Hyper-V 組件(推薦在原生系統中使用),如果是在 VMware 或 Parallels 虛擬機中使用 Windows,需要在設置里面啟用嵌套的虛擬化支持(設置->處理器和內存->高級選項->啟用虛擬化管理程序),如果虛擬機不支持此配置或 Hyper-V,可以嘗試額外安裝 Docker ToolBox 來支持使用 Docker(詳情參考 官方文檔)。我這里的環境就是 Mac + VMware Fusion + Windows 10(虛擬機)。
快速上手
深入了解 Laradock 之前讓我們先見識下如何在 Laradock 中快速安裝 Nginx、PHP、Composer、MySQL、Redis 和 Beanstalkd 吧,有了這些開發 Laravel 必備的工具組件也就差不離了。
1、首先將 Laradock 項目代碼克隆到本地:
$ git clone https://github.com/Laradock/laradock.git
2、進入 laradock 目錄將 env-example 重命名為 .env:
$ cp env-example .env
3、打開你
PHP項目的
.env文件或者你正在
讀取的配置文件, 並將數據庫配置
DB_HOST設置為
mysql:
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
4、運行容器:
$ docker-compose up -d nginx mysql redis
如果指定端口已經被占用,運行上述命令會報錯,關閉相應的服務再重新運行上述命令即可。
注:安裝過程中,由於某些資源需要 翻牆才能下載,建議安裝並啟用 VPN 后再執行上述命令。如果出現需要認證的下載資源無權下載,可以通過 Docker ID/密碼 登錄到 Docker 應用(點擊狀態欄 Docker 應用小圖標就能看到登錄菜單),注意這里必須用 Docker ID,不能用注冊郵箱。在 Windows 下如果出現目錄掛載失敗,可以嘗試在 Docker 設置中重新設置 Shared Drives。
5、要測試配置訪問域名指向 Docker 環境目錄,我們先在 laradock 父級目錄下創建一個與 laradock 同級的 wwwroot 目錄,然后在 wwwroot 目錄下運行以下命令創建一個新的 Laravel 應用:
$ composer create-project laravel/laravel blog --prefer-dist
相應的層級目錄關系如下所示:
然后我們需要到 laradock 下編輯
.env 中的 APPLICATION 配置項:
APPLICATION=../wwwroot/ 注:最新版本為 APP_CODE_PATH_HOST=../wwwroot/
這樣就相當於為 wwwroot 與 Docker 的 /var/www 目錄建立了軟鏈接,然后我們在
laradock/nginx/sites 目錄下新增一個 blog.conf 配置,設置虛擬域名為 blog.test:
server {
listen 80;
listen [::]:80;
server_name blog.test;
root /var/www/blog/public;
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;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
}
接下來需要在
/etc/hosts (Windows 下對應文件路徑是
C:\Windows\System32\drivers\etc\hosts)文件中新增如下這行配置:
127.0.0.1 blog.test
注意天朝境內的話, 修改.env配置文件:
CHANGE_SOURCE=true
最后,需要重啟 Docker 的 Nginx:
$ docker-compose up -d nginx
如若不成功:docker-compose down 后 docker-compose -d nginx mysql redis
這樣,我們就可以在瀏覽器中通過
http://blog.test 訪問這個應用了:
以上就是 Laradock 的簡單上手指南。這里我們設置的場景是新建一個應用,如果是多個應用的話要怎么辦呢?也很簡單,就是在上述 wwwroot 目錄下創建多個應用目錄,然后在 laradock/nginx/sites 下對應創建多個配置文件,最后不要忘記在系統 /etc/hosts 中配置相關域名綁定 IP 即可。
注意:
項目中的數據庫配置要改成 laradock 下 .env 中的 DB_HOST 的值。
注:更多使用細節請參考官方文檔: http://laradock.io/documentation/
ThinkPHP5配置
server {
listen 80;
listen [::]:80;
# For https
# listen 443 ssl;
# listen [::]:443 ssl ipv6only=on;
# ssl_certificate /etc/nginx/ssl/default.crt;
# ssl_certificate_key /etc/nginx/ssl/default.key;
server_name thinkphp.test;
root /var/www/thinkphp/public;
index index.php index.html index.htm;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
location ~ \.php$ {
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
error_log /var/log/nginx/thinkphp_error.log;
access_log /var/log/nginx/thinkphp_access.log;
}
功能特性
最后,我們來捋一下 Laradock 的功能特性:
-
可輕松在不同版本 PHP 之間切換: 7.2、7.1、5.6 等
-
自由選擇數據庫: MySQL、Postgres、MariaDB 等
-
運行自己的軟件: Memcached、HHVM、Beanstalkd 等
-
每個軟件都運行在隔離的容器中: PHP-FPM、NGINX、PHP-CLI 等
-
輕松自定義容器,只需編輯 Dockerfile 文件即可
-
所有的鏡像都擴展自官方的鏡像
-
預配置的 NGINX
-
可以在每個項目中使用 Laradock, 也可以讓所有項目共享一個 Laradock
-
使用環境變量在容器中輕松安裝/卸載軟件
-
干凈、結構良好的 Dockerfile
-
最新版本的 docker-compose 文件
-
一切均可見、可編輯
-
快速構建鏡像
除此之外,目前為止,Laradock 支持的軟件包括但不限於:
-
數據庫引擎: MySQL - MariaDB - Percona - MongoDB - Neo4j - RethinkDB - MSSQL - PostgreSQL - Postgres-PostGIS.
-
數據庫管理工具: PhpMyAdmin - Adminer - PgAdmin
-
緩存工具: Redis - Memcached - Aerospike
-
Web 服務器: NGINX - Apache2 - Caddy
-
PHP 編譯器: PHP-FPM - HHVM
-
消息隊列: Beanstalkd - RabbitMQ - PHP Worker
-
隊列管理器: Beanstalkd Console - RabbitMQ Console
-
大國重器: HAProxy - Certbot - Blackfire - Selenium - Jenkins - ElasticSearch - Kibana - Mailhog - Minio - Varnish - Swoole - Laravel Echo 等
-
Laradock 還引入了 Workspace 鏡像作為開發環境,里面包含了豐富且實用的工具集:PHP CLI - Composer - Git - Linuxbrew - Node - V8JS - Gulp - SQLite - xDebug - Envoy - Deployer - Vim - Yarn - SOAP - Drush 等
Docker 還是 Vagrant
最后,我們繞不開的話題是作為開發環境,選擇 Docker(Laradock) 還是 Vagrant(Homestead),Mac 系統上官方還提供了 Valet,嘗鮮的話、做Demo或者快速學習為目的當然 Valet 還是不二之選,因為它最小巧、最輕量級,上手最快,天下武功,唯快不破。
至於 Laradock 還是 Homestead,就是見仁見智了,Laradock 相對 Homestead 而言更加輕量級,因為正如前面所言,Homestead 是 VM 級別的虛擬化解決方案,依賴一個完整的操作系統,雖然功能很全,但是很重,而 Laradock 是容器,只依賴那些它必需的軟件,更加靈活,更加高效。
還有一點需要提及的是 Docker 可以用於本地也可以用於線上,所謂 same environment everywhere,而 Vagrant 部署的開發環境只能用於本地,這一點也可以作為重要考量因素。
注:學院君日常開發使用的本地開發環境就是 Laradock。
server {
listen 80; #端口
server_name localhost; #主機名
set $root /usr/share/nginx/html/tp5/public/; #文件入口
index index.php;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#靜態資源
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root root /usr/share/nginx/html;
}
location ~ \.css {
add_header Content-Type text/css;
}
location ~ \.js {
add_header Content-Type application/x-javascript;
}
#php請求
location / {
include /etc/nginx/mime.types
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
root $root;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $request_uri;
include fastcgi_params;
}
#
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
root /usr/share/nginx/html/tp5/public/;
index index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /usr/share/nginx/html/tp5/public/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
MySQL切換版本的問題:
-
修改env文件MYSQL_VERSION=5.7 // 默認為latest2.停止所有容器 並 刪除mysql數據庫docker-compose downrm -rf ~/.laradock/data/mysqlpowershell命令行下執行該命令刪除rm -Force ~/.laradock/data/mysql
-
執行mysql build命令docker-compose build mysql
-
刪除所有容器 重新創建容器docker-compose up -d nginx mysql redis
-
查看現有mysql版本docker inspect laradock_mysql_1
注意:運行在win10 下 docker for window 如果之前有默認安裝過mysql數據庫,並且需要將之前數據庫添加到現有的數據庫中 一定要注意 將數據庫庫文件所在的目錄設置為共享目錄,比如我的數據庫目錄默認為~laradock\data\mysql下,,默認是在c盤,所以c盤要設置為共享盤
mysql8.0 無法連接問題
1、使用docker-compose up命令運行phpMyAdmin容器
# use with mysql
docker-compose up -d mysql
phpmyadmin
2、打開瀏覽器並通過端口8080訪問本地主機:
http://localhost:8080 ,服務器:mysql, 用戶名:root,密碼:root 登錄
3、如果宿主機安裝了
Navicat 之類的數據庫管理軟件,主機地址使用 127.0.0.1 ,就可以連接 mysql 數制庫。
4、但是在 mysql8.0 時,這些數據庫管理軟件還不支持,可能會報錯:
mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client
這是因為 mysql 8.0 將密碼驗證方式由以前的 mysql_native_password 改為了 caching_sha2_password 。可以進入 mysql 容器 bash,登錄 mysql ,將驗證方式修改成原來的。
#在
docker-compose exec mysql bash
mysql -uroot -p
mysql> grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
mysql> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> FLUSH PRIVILEGES;
mysql> exit;
現在就可以用 root 登錄了。為了使新建用戶的驗證方式默認為 mysql_native_password ,可以修改 my.cnf 文件,在 [mysqld] 部分中添加:
default_authentication_plugin = mysql_native_password
5、laradock 默認裝的是 mysql 最新版本(mysql8),也可以更換成低版本的 mysql 。
# 修改 .env 文件
MYSQL_VERSION=5.7 # 默認為 latest
#停止mysql容器
docker-compose stop mysql
# 刪除舊數據庫數據
rm -rf ~/.laradock/data/mysql
# 重新構建新 mysql
docker-compose build mysql
# 重新創建容器
docker-compose up -d nginx mysql
# 查看現有 mysql 版本
docker inspect laradock_mysql_1
6、在 php 程序中連接數據庫時,如果 DB_HOST 為 127.0.0.1 或 localhost,則會報錯:SQLSTATE[HY000] [2002] Connection refused ,SQLSTATE[HY000] [2002] No such file or directory,那時因為 php 容器里是沒有 mysql 的,需要用 mysql 容器的 IP。
7、刪除了 NO_AUTO_CREATE_USER 模式
在 5.7.* 的日志中提到已廢除該模式,在 8.0.11 中刪除了,遷移時會拋出如下異常:
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
解決方案:將 config/database.php 配置文件中 mysql 的 strict 的值改為 false 即可!
開機自動運行
方法一:找到/etc/rc.d/rc.local文件,添加以下腳本(由於是並行啟動,不一定是在docker服務啟動后啟動)cd /root/laradock && /usr/bin/docker-compose up -d mysql redis nginx方法二:(推薦)![]()
![]()
![]()
$ vim /root/laradock/up.sh#!/bin/bash# 設置開機啟動容器cd /root/laradock && docker-compose up -d nginx mysql redis$ vim /lib/systemd/system/laradock.service[Unit]Description=laradock docker-compose upRequires=docker.service[Service]Type=oneshotExecStart=/usr/bin/bash /root/laradock/up.sh[Install]WantedBy=multi-user.target$ systemctl enable laradock
鏡像加速
鑒於國內網絡問題,后續拉取 Docker 鏡像十分緩慢,我們可以需要配置加速器來解決,我使用的是網易的鏡像地址:
http://hub-mirror.c.163.com。
新版的 Docker 使用
/etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 來配置 Daemon。
請在該配置文件中加入(
沒有該文件的話,請新建一個):
{ "registry-mirrors": [ "http://141e5461.m.daocloud.io", "http://1f637783.m.daocloud.io", "http://hub-mirror.c.163.com" ] }
https://vuepress.mirror.docker-practice.com/install/mirror.html
附:
docker-compose 安裝:
https://www.cnblogs.com/cshaptx4869/p/10947645.html
文檔:
