【筆記】Docker 建置 Laravel (Nginx + Mysql) 專案 – 以 Laradock 為例

Command Line 苦手我,為了避免日後忘記是怎麼用 Docker 建置 Laravel + Nginx + Mysql 專案,所以寫下這一篇筆記,也可以給想要學習 Docker (Laradock) 的人作參考。

以下是用 MacOS 環境為例。

Docker

安裝 Docker

  1. 可以透過官方文件下載 Docker for Mac 並安裝執行。
  2. 透過 Homebrew 安裝 docker
$ brew update
$ brew cask install docker

安裝完 Docker 後可以確認所安裝的 Docker 版本

$ docker -v 

docker-compose 指令:Docker for Mac 本身就有,不需另外安裝。

將自己的帳號加入 docker 群組,避免之後的指令需要打 sudo 才能執行

$ sudo usermod -aG docker YourUsername

Laradock

Laradock 是一個 Docker File,是一個用 Docker 建置的 PHP 環境。

首先先建立 Laravel 專案資料夾
(依個人習慣,這邊是在家目錄底下建立 projects/laravel-test 資料夾)

$ mkdir ~/projects
$ mkdir ~/projects/laravel-test

安裝 Laradock
(依個人習慣,這邊是在家目錄底下建立 Laradock)

$ cd ~/
$ git clone https://github.com/laradock/laradock.git Laradock

製作 Laradock 環境檔
(複製 Laradock 底下的 env-example 模版,命名為 .env,Laradock 將吃 .env 的設定)

$ cd Laradock
$ cp env-example .env

進入 .env 環境檔,指定我們的專案路徑

$ vim .env
(於 .env 內)
APP_CODE_PATH_HOST=../projects/laravel-test

啟動 Laradock 服務

$ docker-compose up -d nginx mysql
(你可以從以下列表選擇你要的容器組合,其中 workspace 和 php-fpm 不需要在 up 命令中加上它們就會自己被執行)
nginx, hhvm, php-fpm, mysql, redis, postgres, mariadb, neo4j, mongo, apache2, caddy, memcached, beanstalkd, beanstalkd-console, workspace

進入 Workspace 容器

$ docker-compose exec workspace bash

因為剛剛已經將 Laradock 的預設根目錄指向 ../projects/laravel-test
所以進來 Workspace 這時候的 /var/www/ 應該是在 laravel-test 資料夾內了
現在我們可以建立 laravel 專案

$ composer create-project laravel/laravel --prefer-dist

接下來我們重啟 Laradock,在瀏覽器網址列輸入 localhost 應該就可以看到 Laravel 專案了

$ docker-compose down
$ docker-compose up -d nginx mysql

建立站台(選用)

將專案設定運行在 Nginx 的虛擬站台

Laradock 本身已提供 Nginx 虛擬站台的設定檔模板,複製一份即可

$ cd ~/Laradock/nginx/sites
$ cp laravel.conf.example laravel.test.conf

打開 laravel.test.conf,修改根目錄

$ vim laravel.test.conf

與建立 laravel 專案時一樣,因為一開始在 .env 已經將 Laradock 的預設根目錄指向 ../projects/laravel-test,所以 laravel.test 的根目錄也是從 ../projects/laravel-test 開始,故 /var/www/public = ../projects/laravel-test/public

(於 laravel.test.conf 內)
server_name laravel.test;
root /var/www/public

設定 Host
我們設定的 Nginx 虛擬站台名稱 laravel.test,但因為它實際上不存在,所以我們需要在本機上設定 DNS 對應
打開 /etc/hosts 檔案

$ sudo vim /etc/hosts

在最下方新增一行

127.0.0.1 laravel.test

重新啟動 Laradock

$ cd ~/Laradock/
$ docker-compose down
$ docker-compose up -d nginx mysql

接下來在瀏覽器網址列輸入 laravel.test,應該就會被導向 laravel-test/public 資料夾,與 localhost 呈現的頁面一樣

Laradock 與虛擬站台備註

若 Laradock 想要運行多個 laravel 專案,可在將 .evn 的路徑修改為

(於 .env 內)
APP_CODE_PATH_HOST=../projects/

再指定虛擬站台 laravel.test.conf 的根目錄

(於 laravel.test.conf 內)
server_name laravel.test;
root /var/www/laravel-test/public

重新啟動 Laradock

$ cd ~/Laradock/
$ docker-compose down
$ docker-compose up -d nginx mysql

Mysql 8.0 + Sequel Pro Bug(如何更改 Laradock Mysql 版本)

因為 Laradock 預設的 Mysql 版本是最新版,而在 Mysql 8.0 跟 Sequel Pro 會有連接失敗的問題,可以將 Laradock 的 Mysql 版本降版至 5.7 來解決

$ cd ~/Laradock
$ vim .env
(於 .env 內,搜尋 MYSQL_VERSION)
MYSQL_VERSION=5.7

re-build

因為上面已經起了一個 container 過,所以就算已經修改了 .env 檔,下 docker-compose up 時 Docker 仍然會先找到之前存在的 mysql image (MYSQL_VERSION=latest)來開啟 container,所以需要 re-build image 讓它吃到 Mysql 新的 .env 設定

$ docker-compose build mysql

重新啟動 Laradock

$ cd ~/Laradock/
$ docker-compose down
$ docker-compose up -d nginx mysql

參考文章

在《【筆記】Docker 建置 Laravel (Nginx + Mysql) 專案 – 以 Laradock 為例》中有 1 則留言

  1. 建立 laravel 專案之後,所有code應該會放在 ~/projects/laravel-test/laravel/*,重啟 Laradock,這時候 nginx 理論上是吃 default.conf,裡面的 root 是 /var/www/public,而 /var/www 是指到 ~/projects/laravel-test,所以如果不把 root 改成 /var/www/laravel/public,應該會 404 才對,JS Ying 您為什麼可以直接吃到public下面的index.php?

發表迴響