Docker: Laravel

好,首先,我要先聽歌冷靜一下……

最近在用 Laravel OAuth。我覺得……Docker 實在是太過難以理解了。你每次用新的 container, 就算用一樣的 image, 一樣的指令,結果會因為不同的用途改動、或安裝問題,結果都不一定一樣。

總之,如果想用 Laravel 的話,建議每次都砍掉 /vendors 目錄後,重下 composer install 指令。

再來幾個問題:

Docker 與 Laravel 的交互

那麼,Docker 怎麼跑 Laravel 呢?最快的辦法,就是裝bitnami/laravel。官方說明你可以下這些指令裝這個 instance:

$ docker network create laravel-network
$ docker volume create --name mariadb_data
docker run -d --name mariadb \
  --env ALLOW_EMPTY_PASSWORD=yes \
  --env MARIADB_USER=bn_myapp \
  --env MARIADB_DATABASE=bitnami_myapp \
  --network laravel-network \
  --volume mariadb_data:/bitnami/mariadb \
  bitnami/mariadb:latest
$ docker run -d --name laravel \
  -p 8000:8000 \
  --env DB_HOST=mariadb \
  --env DB_PORT=3306 \
  --env DB_USERNAME=bn_myapp \
  --env DB_DATABASE=bitnami_myapp \
  --network laravel-network \
  --volume ${PWD}/my-project:/app \
  bitnami/laravel:latest

……那可不可以直接用 docker-compose-yml 啊?嗯,還真可以。這些指令可以搬的。

# 無所謂
version: "3.3"

services:
    # docker volume create --name mariadb_data 
    mariadb_data:
        # --env flag
        environment:
            # --env ALLOW_EMPTY_PASSWORD=yes \
            ALLOW_EMPTY_PASSWORD: yes
            # --env MARIADB_USER=bn_myapp \
            MARIADB_USER: "bn_myapp"
            # --env MARIADB_DATABASE=bitnami_myapp \
            MARIADB_DATABASE: "bitnami_myapp" 
        # --network laravel-network
        networks:
            - "laravel-network"
        # --volume mariadb_data:/bitnami/mariadb
        volumes:
            - "./mariadb_data:/bitnami/mariadb"
        # bitnami/mariadb:latest
        image: "bitnami/mariadb:latest"
    # docker run -d --name laravel
    laravel:
        # -p 8000:8000
        ports:
            - "8000:8000"
        environment:
            # --env DB_HOST=mariadb
            DB_HOST: mariadb
            # --env DB_PORT=3306
            DB_PORT: 3306
            # --env DB_USERNAME=bn_myapp
            DB_USERNAME: "bn_myapp"
            # --env DB_DATABASE=bitnami_myapp
            # mariaDB image 要用 DB_DATABASE 
            MARIADB_DATABASE: "bitnami_myapp"
        # --network laravel-network
        networks:
            - "laravel-network"
        # --volume ${PWD}/my-project:/app
        # 但我們改為 my-project 然後不用 ${PWD} 浙東以以避免麻煩
        volumes:
            - "./my-project:/app"
        # bitnami/laravel:latest
        image: "bitnami/laravel:latest"

networks:
    # docker network create laravel-network
    laravel-network:
        name: laravel-network

在裝了 Laravel 以後,的 controller 或 model 之類要怎麼產生?我都直接在主機裝自行設定的 PHP 後,再裝 composer 後直接在程式的目錄下 php artisan 指令。

但不對啊,我資料庫如果放在 docker 的 container 的話,我怎麼用資料庫指令?難道不會裝到本機去嗎?

所以資料庫相關的指令如 php artisan migrate 要這樣下:

$ docker exec {container名字} php artisan migrate
$ # 注意每個 container 名字都不一樣。你需要看 docker 是怎麼寫的。
$ # 比方上面的例子,下下去就會是這樣:
$ docker exec laravel php artisan migrate

也就是在你的 Laravel container 下 php artisan migrate。這樣 Laravel container 就會對 MariaDB container 做動作了。

phpmyadmin 與 Laravel

那能不能裝 phpmyadmin 呢?答案是可以。

    pma:
        image: phpmyadmin/phpmyadmin
        ports:
            - "8080:80"
        depends_on:
            - mariadb_data
        networks:
            - "laravel"
        environment:
            PMA_HOST: mariadb_data
            PMA_PORT: 3306

然後加到與 laravel: 同層就可以了。注意 networksenvironment.PMA_HOST 都要用。

Socialize

難用。

  1. SSL certificate problem: unable to get local issuer certificate 是怎麼一回事?
    1. 憑證問題。localhost 會有問題。請從 curl.haxx.se 裝憑證解決。
  2. InvalidStateException 又是如何?
    1. 請去 config/session.php 設定。

參考資料