用Docker建立Laravel8的開發環境

Table of Contents

Table of Contents

這篇文章將介紹如何在自己的電腦中用Docker建立Laravel8的開發環境。

教學影片

docker安裝

https://docs.docker.com/get-docker/

電腦環境

docker --version
-> Docker version 20.10.2, build 2291f61

docker-compose --version
-> docker-compose version 1.27.4, build 40524192

github

https://github.com/scobin/docker-php

docker-compose.yml的說明

這次會製作四個服務。分別是nginx, php, db, phpmyadmin

nginx、phpmyadmin直接使用已提供的映像檔。
php, db要客製化,所以使用Dockerfile來做設定。

php的Dockerfile在/php資料夾下,可以看一下裡面的內容,這次要建立PHP8的環境,並且也安裝了composer。
db的Dockerfile在/mysql資料夾下,這次要使用mysql8。

容器內的路徑跟專案路徑做聯通

要對容器內的檔案做任何操作需要進入容器內執行指令,這有時相當不方便。
如果可以跟電腦檔案互相聯通,那麼我們不用進入容器內也可以對檔案做修改或查看那就做好不過了。
要做到這件事,可以使用volumns的描述來達成。
比方說,下面php的容器設定就是將專案嚇得/server路徑跟容器內的/var/www/路徑做相通。
如此,我們在/server裡面建立Laravel應用時直接就等於在容器內的/var/www/裡面建立Laravel應用,修改/server下的內容等於修改容器內/var/www/的內容。

php:
    container_name: php-laravel
    build: ./php
    volumes:
      - ./server:/var/www/:delegated

不只php容器,nginx容器也有相關設定,也可以參考一下。

注意Nginx根目錄的路徑

nginx.conf中的root設定裡,example-app是等一下要建立的Laravel應用程式的專案名稱,你可以自行修正,但修正後等一下建立Laravel應用時請一定要用一樣的名稱。

...
root  /var/www/example-app/public;
index index.php index.html;
...

Docker環境的啟動

建立與啟動容器

使用以下指令建立與啟動容器,第一次執行會需要比較長的時間,之後的啟動時間會縮短。

docker-compose up -d --build

關閉與刪除容器

使用以下指令關閉與刪除容器。

docker-compose down

如果不想刪除容器,可以用以下指令。

docker-compose stop

Laravel的安裝

接下來進入php-laravel容器中安裝Laravel。

進入容器

使用以下指令進入容器。

docker-compose exec php bash

當你成功建立與啟動容器後,可以進入php-laravel容器內檢查PHP、composer版本是否正確。
注意這時還沒有建立Laravel應用,所以你必須到var/www下建立Laravel應用。以下使用composer來建立名為example-app的Laravel應用程式。
(example-app請記得跟nginx.conf的跟目錄設定要一致。)

# change path according to your nginx.conf
cd ..
# create project
composer create-project laravel/laravel example-app

建立應用程式一樣需要一些時間請耐心等候。你可以利用這個時間用瀏覽器打開localhost:8811檢查phpmyadmin的頁面是否正確顯示。

應用程式建立好後,用exit指令退出容器,然後用以下指令重新啟動容器。

docker-compose restart

再用瀏覽器打開localhost:8010看看Laravel的預設頁面是否正確顯示。
如果顯示成功那麼表示你的設定已經正確。恭喜你已經將PHP8, MySQL8, Laravel8的Docker環境順利建構完成。

權限錯誤:Permission Denied

如果你開啟localhost:8010畫面後,看到以下錯誤訊息的話,請執行權限變更。

UnexpectedValueExceptionThe stream or file “/var/www/example-app/storage/logs/laravel.log” could not be opened in append mode: Failed to open stream: Permission denied

因為資料夾的權限設定不符合,因此修改權限設定。
先確認php-fpm的使用者名稱,根據php-fpmconfig設定可以查看相關消息。
php容器中,usr/local/etc/php-fpm.d/www.conf中可以找到下面的設定。

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user’s group
;       will be used.
user = www-data
group = www-data

因此將storagebootstrap/cache資料夾的所有者跟群組改為www-data
這裡用以下方式修改,

#進入php容器
docker-compose exec php bash
# 修改權限設定
chown -R www-data:www-data /var/www/example-app/storage
chown -R www-data:www-data /var/www/example-app/bootstrap/cache
chmod -R 775 /var/www/example-app/storage
chmod -R 775 /var/www/example-app/bootstrap/cache