laravel docker建置筆記

by 2 月 17, 2021開發筆記0 comments

參考資料

docker
https://www.minwt.com/website/server/20822.html

docker指令
https://blog.longwin.com.tw/2017/01/docker-learn-initial-command-cheat-sheet-2017/

利用 Dockfile、Docker Compose 建立 LAMP 環境 (PHP、Apache、MySQL)
https://hackmd.io/@titangene/docker-lamp

adminer
https://www.minwt.com/website/server/18404.html

https://banbanpeppa.github.io/2019/01/24/docker/docker-mysql-adminer/

docker mariaDB
https://hub.docker.com/_/mariadb

adminer缺少mysqli擴展
https://www.twblogs.net/a/5cac8989bd9eee2dd0f290aa?lang=zh-cn

php extension
https://kejyuntw.gitbooks.io/devops-learning-notes/content/drone/debug/drone-debug-php-extension-sockets-is-missing.html

composer 安裝
https://getcomposer.org/download/

docker caddy
https://hub.docker.com/_/caddy?tab=description

caddy反向代理
https://www.yuyang.io/post/caddy-proxy-docker-wordpress/

Laravel 在 Docker 環境下訪問 storage 靜態資源 404 問題解決
https://iter01.com/460382.html

流程

  1. 安裝docker
  2. 安裝docker-compose
  3. docker安裝caddy映象檔
  4. docker安裝php映象檔
  5. docker安裝mysql映象檔
  6. 使用docker-compose將服務啟動
  7. 建立caddyfile寫入設定值
  8. 建立phpinfo
  9. 確定caddy連線正常
  10. 進入PHP的容器
  11. 安裝php擴充套件
  12. 安裝composer
  13. 利用composer安裝laravel專案

laravel 6

laravel本身是以PHP這個語言所建立的框架,所以基本上就需要有PHP的環境
laravel 6官方所需要的環境:

  • PHP >= 7.2.5
  • BCMath PHP Extension
  • Ctype PHP Extension
  • Fileinfo PHP Extension
  • JSON PHP Extension
  • Mbstring PHP Extension
  • OpenSSL PHP Extension
  • PDO PHP Extension
  • Tokenizer PHP Extension
  • XML PHP Extension

由於本身的mamp是使用php 7.4.1,所以這邊就以php 7.4.1作為環境
實際安裝版本:

  • php 7.4.1
  • caddy 2.3
  • mariaDB 10.5
docker pull php:7.4.15-fpm
docker pull caddy:2.3.0-alpine

docker composer

sudo apt install docker-compose

若您之後使用 docker 指令時不想要一直打 sudo 的話,可以依照官方的建議將自己的帳號加到 docker 這個群組:

sudo usermod -aG docker shengyou

不過要提醒您的是,由於我們目前是在自己的本機端建置開發環境,所以這樣設定比較沒有安裝性風險。但若是在正式機上建置 Docker 的話,則建議您閱讀一下官方文件,了解這樣設定可能帶來的風險。

###docker composer.yml設置

設置caddy及php

version: "3"
services:
  caddy:
    restart: unless-stopped
    image: caddy:2.3.0-alpine
    container_name: caddy
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./volumes/caddy:/etc/caddy
      - ./volumes/www:/usr/share/caddy
  php:
    restart: unless-stopped
    image: php:7.4.15-fpm
    container_name: php
    volumes:
      - ./volumes/www:/var/www/htmls

caddyfile:
要注意php_fastcgi這樣設定以避免拿不到根目錄

localhost
root * /usr/share/caddy
php_fastcgi php:9000 {
	root /var/www/html
}
file_server

可以在www目錄下新增一個PHPINFO:

<?php
echo phpinfo();
?>

瀏覽器輸入localhost出現這個畫面代表OK

安裝mysql以及管理器

管理器使用adminer 較為輕量化

docker pull mariadb:10.5

串起來會有問題

要進PHP裡面增加模組

terminal進入docker容器的方法

docker exec -it hash-id /bin/sh

安裝系統所需套件

apt-get update -y && apt-get install -y zlib1g-dev libpng-dev unzip libzip-dev

安裝PHP套件
以下程式還沒有連接在一起,需一個一個執行

docker-php-ext-install zip
docker-php-ext-install gd
docker-php-ext-install sockets
docker-php-ext-install pdo_mysql
docker-php-ext-install bcmath

請注意由於我們是利用容器間連接,所以伺服器那邊需填入「db」(compose.yml 內的設定名稱)

php composer

一樣在PHP內安裝composer
安裝 composer 後,將composer.phar指令移動到/bin/裡面並改名為composer,方便安裝其他的composer套件。

sudo mv composer.phar /usr/bin/composer

laravel

依官方說明利用composer 安裝laravel框架套件

composer global require laravel/installer

執行laravel new app會出現 command not found
因為沒有把composer內的指令寫到系統變數中
而docker這版php的composer是安裝在/root/.composer/內

composer套件安裝位置可利用composer global about查詢

使用vim等編輯器開啟~/.bashrc並加入:

export PATH=/root/.composer/vendor/bin:$PATH

然後重讀.bashrc:

source ~/.bashrc

執行

laravel new app

這個方式會安裝最新版的laravel,若要安裝其他版本的需直接用composer指令來處理

composer create-project --prefer-dist laravel/laravel app "6.*"

瀏覽localhost/app/public出現如下圖即代表安裝成功

但因為整個laravel專案是建立在掛載出來的volume上,所以一般來說也可以直接透過本機安裝好的composer來處理這個專案

測試mysql

先利用adminer之類的建立新資料庫以及使用者供laravel使用
設定app/.env內的設定檔,注意DB_HOST設定為db (docker用的名稱)

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=apdc
DB_PASSWORD=b1201b1200

在docker的PHP容器內執行

php artisan migrate

若有成功migrate即代表laravel與資料庫連結沒有問題

權限設定

若發現CSS等設定有帶到,但圖片是回傳404,請執行下列步驟

chown -R www-data:www-data 專案資料夾
chmod -R 775 專案資料夾

於專案資料夾內執行

php artisan storage:link

docker內的php有時後無法以上面的指令建立軟連結,所以需使用另一種指令方式
進入public/內執行:

ln -sf ../storage/app/public storage

將設定好的資料存到image

看一下要存的image ID

docker ps

將變動存到image裡

docker commit {image ID} {要存的檔名}

將image另存成一個tar檔

docker save {image名稱} > {存的名稱}.tar

讀取image

docker load < {image名稱}

LINUX

在LINUX上處理有任何連線問題,請先確定防火牆的設定,centos7的SELinux以及filwall都是預設開啟的

神奇的錯誤

若出現以下錯誤

iptables: No chain/target/match by that name

  1. 請在系統執行

    sudo iptables -t filter -F
    sudo iptables -t filter -X
    
  2. 重啟docker服務

    systemctl restart docker