Command Line 苦手我,為了避免日後忘記是怎麼用 Docker 建置 Laravel + Nginx + Mysql 專案,所以寫下這一篇筆記,也可以給想要學習 Docker (Laradock) 的人作參考。
以下是用 MacOS 環境為例。
Docker
安裝 Docker
- 可以透過官方文件下載 Docker for Mac 並安裝執行。
- 透過 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
參考文章
建立 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?