2020/11/17

はじめに

minikube(ミニキューブ) は Kubernetes の環境を作成するためのパッケージで、単一 Node の環境構築をするコマンドです。

現在の Docker For Mac では Kubernetes が統合インストールされますが、minikube は別途インストールする必要があります。

ハイパーバイザーのインストール

Kubernetes を利用するには、以下のいずれかのハイパーバイザーをインストールが必要です。

  • HyperKit
  • VirtualBox
  • VMware Fusion

macOS では、Hypervisor Framework に対応した HyperKit も利用できるためインストールします。


$ brew install hyperkit

HyperKit のバージョンを確認します。


$ hyperkit -v
hyperkit: v0.20200224-44-gb54460

Homebrew で minikube のインストール

homebrew コマンドで minikube をインストールします。


$ brew install minikube

minikube がインストールされたかバージョンを確認します。


$ minikube version
minikube version: v1.13.1

もし /usr/local/bin/minikube がない場合、現在のフォルダにある minikube を /usr/local/bin/ に移動します。


$ sudo mv minikube /usr/local/bin

minikube の初回起動確認(HyperKit)

minikube のドライバを HyperKit にして起動します。起動にはパスワードが必要です。


$ minikube start --vm-driver=hyperkit
...
Password:
...
🏄  Done! kubectl is now configured to use "minikube" by default

minikube の確認

minikube の起動確認をします。Running と表示されていれば起動中です。


$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Docker For Mac のめnyメニューにも minikube が追加されています。

minikube の停止

minikube を停止します。


$ minikube stop

minikube が停止したか確認します。


$ minikube status
minikube
type: Control Plane
host: Stopped
kubelet: Stopped
apiserver: Stopped
kubeconfig: Stopped

kubectl を使ってみる

初回ハイパーバイザーを設定して起動しておくと、次回からはオプションなしで起動できます。


$ minikube start

起動前にクラスターを変更する場合、 config use を利用してから起動します。


$ kubectl config use クラスター名

kubectl でクラスタ構成を確認し、デフォルトで minikube クラスターが作成されているのを確認します。


$ kubectl config get-contexts
CURRENT   NAME                 CLUSTER          AUTHINFO         NAMESPACE
          docker-desktop       docker-desktop   docker-desktop   
          docker-for-desktop   docker-desktop   docker-desktop   
*         minikube             minikube         minikube

その他のクラスタは、Docker For Mac インストールで作成されたクラスターです。

Namespace 一覧を取得します。


$ kubectl get namespace
NAME              STATUS   AGE
default           Active   19m
kube-node-lease   Active   19m
kube-public       Active   19m
kube-system       Active   19m
  • default: デフォルト Namespace
  • kube-system:Kubernetesシステムで作成されたオブジェクト用の Namespace
  • kube-public:全てのユーザーから読み取り可能な Namespaceリ

kube-system の Pod を取得します。


$ kubectl get pod -n kube-system
NAME                               READY   STATUS    RESTARTS   AGE
coredns-f9fd979d6-gbpf4            1/1     Running   1          21m
etcd-minikube                      1/1     Running   1          21m
kube-apiserver-minikube            1/1     Running   1          21m
kube-controller-manager-minikube   1/1     Running   1          21m
kube-proxy-kjbn8                   1/1     Running   1          21m
kube-scheduler-minikube            1/1     Running   1          21m
storage-provisioner                1/1     Running   2          21m

アドオンの利用

minikube には機能拡張するアドオンがあり、一覧を確認して enabled となっているのが有効になっているアドオンです。


$ minikube addons list

ingress を追加してみます。


$ minikube addons enable ingress
🔎  Verifying ingress addon...
🌟  The 'ingress' addon is enabled

アドオンを利用停止にするときは以下のコマンドを実行します。


$ minikube addons enable アドオン名

ingress

ingress は https ロードバランサーで、IP管理を service ではなく ingress で管理することができます。

hellow-world コンテナ起動

hello-world コンテナを起動して、Hello from Docker! のメッセージ表示されるか確認します。


$ docker run hello-world
...
Hello from Docker!
...

現在利用されていないコンテナーを削除したい場合は、 prune で削除しておきます。


$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
c4e29bf9fb68a07e863384879fec3567342b9bb20c99c22c15aec8756c508b60
5d8680dcfcd40e1b9c1e0a52636106b10d118284f75494a902ff20f171a18dd4

  2020/11/02

あらかじめ Git 管理にあるファイルやディレクトリを .gitignore に追加するには、キャッシュをクリアが必要です。

キャッシュのクリア

ファイル


$ git rm --cached ファイル名

ディレクトリ


$ git rm --cached -r ディレクトリ名

.gitignore に追加してコミット

vi や エディタソフトなどで .gitignore にファイルを追加し、あとはコミットするだけです。

  2020/10/24

Laravel 6.x から Laravel 8.x にバージョンアップしますが、普通に composer update すると以下のエラーがでます。


> Illuminate\Foundation\ComposerScripts::postAutoloadDump

> @php artisan package:discover --ansi

PHP Fatal error:  Declaration of App\Exceptions\Handler::report(Exception $exception) must be compatible with Illuminate\Foundation\Exceptions\Handler::report(Throwable $e) in /Users/yoo/projects/ict-kids/app/Exceptions/Handler.php on line 35

Handler.php の修正

app/Exceptions/Handler.php の Exception の処理が 6.x から 7.x で変更されているため、手動で修正します。

修正前


namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    ...
    public function report(Exception $exception)
    {
        parent::report($exception);
    }
    ...
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

修正後


namespace App\Exceptions;

use Throwable; //追加
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    ...
    public function report(Throwable $exception)  //修正
    {
        parent::report($exception);
    }
    ...
    public function render($request, Throwable $exception)  //修正
    {
        return parent::render($request, $exception);
    }

composer.json の修正

Laravel 8.x アップグレードガイド 」を参考に composer.json を修正します。


    "require": {
        ...
        "laravel/framework": "^8.0",
        "guzzlehttp/guzzle": "^7.2",
        ...
    },

    "require-dev": {
        "facade/ignition": "^2.3.6",
        ...
        "laravel/ui": "^3.0",
        ...
        "nunomaduro/collision": "^5.0",
        "phpunit/phpunit": "^9.0
    },

Composer アップデート

Composer で Laravel8 へアップデートします


$ composer update

バージョンを確認します。


$ php artisan -V
Laravel Framework 8.11.2

  2020/10/24

Composer でインストールする時にメモリ不足のエラーがでることがあります。

$ composer require "laravelcollective/html"
....
Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar:///usr/local/Cellar/composer/1.10.10/bin/composer/src/Composer/DependencyResolver/Solver.php on line 223

Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.MBP:

PHP のメモリ確認

まず現状の PHP のメモリ上限を確認します。


$ php -i | grep memory_limit
memory_limit => 128M => 128M

メモリが 128M になっています。

php.ini ファイルの確認

PHP 設定ファイル php.ini で設定変更するためファイルパスを調べます。


$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php/7.4
Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini
Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d
Additional .ini files parsed:      /usr/local/etc/php/7.4/conf.d/ext-opcache.ini

今回の場合「/usr/local/etc/php/7.4/php.ini」が設定ファイルです。

php.ini で memory_limit を設定

php.ini ファイルを修正します


$ vi /usr/local/etc/php/7.4/php.ini

メモリ上限の設定 memory_limit を無制限(-1)に設定します


;memory_limit = 128M
memory_limit = -1

設定が変更されたか確認します。


$ php -i | grep memory_limit
memory_limit => -1 => -1

Composer コマンドのメモリ指定 

Composer コマンド実行時にメモリ制限を無制限にすることもです。以下は、Composer のアップデート処理で PHP のメモリ上限をなしにした実行です。


$ php -d memory_limit=-1 /usr/local/bin/composer update

  2020/10/24

Blade ではデフォルトでカスタムクラスを呼び出すことができないため、別途設定する必要があります。

app.php を修正

Laravel ではデフォルトでクラスをオートロードしていますが、その設定は app.php に記述されています。

'School' => App\School::class,


    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'Str' => Illuminate\Support\Str::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,
    ],

Laravel で Facade でよく利用される名称に気づくでしょう。

カスタムクラスをアプリ全体で利用する場合は、 app.php の 「aliases」 に追加します。

Item.php を利用してみる

例えば、app/Item.php クラスファイルが以下のように税込計算の static 関数が定義してあるとします。


class Item {
    public static function taxPrice($price, $tax) {
        return $price * (1 + $tax);
    }
}

この Item.php を app.php にネームスペース記述で追加します。


    'aliases' => [
        ....
        'Item' => App\Item::class,
    ],

これで、アプリ全体で利用可能になり Blade ファイルからも利用することができます。


{{ Item::taxPrice(100, 0.1) }} 

app.php に設定する前に

アプリ全体で利用できるのは便利ですが毎回ローディングされるため、たくさんのカスタムファイルや大きなファイルはメモリ消費や負荷を念頭においた方がよいでしょう。

さほど利用しない機能のクラスは、コントローラーで都度呼び出したりミドルウェアなどで処理することが基本となります。 また、Blade でクラスを多用しすぎると MVC の分離ができなるなるのも注意が必要です。

  2020/08/30

現在のブランチと同名で push や pull 

通常 Git でブランチの変更を行うような管理の場合、リモートとブランチ名を指定します。


$ git push -u origin master 

ただ、一人で開発する場合、大規模でない限りブランチを利用することはあまりないと思うので、


$ git push

のようにブランチ指定せずに実行もよいかも知れません。

これは、現在のブランチ名がリモートと同じという条件でなりたちます。

config にデフォルト設定する

現在の状態をデフォルトとする設定をします。


$ git config --global push.default current
$ git config --global pull.default current

config を確認すると、 push.default が current に設定されます。


$ git config -l
...
push.default=current
pull.default=current
... 

これで、ブランチ指定せずに現在の状態で pull、 push できるようになりました。

ただしグループ開発するような時は、省略はしない方がよいでしょう。

  2020/08/30

git pull や git push できなくなったとき、ブランチの間違いやファイルがコンフリクトしている可能性があります。

git pull エラー


$ git pull origin master
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
...

git pull は fetch と merge を両方実行しているので、コンフリクトが発生するとエラーになります。


$ git fetch
$ git merge origin/master

git push エラー


$ git push origin master
...
fatal: refusing to merge unrelated histories
...

マージを実行

マージを実行するとコンフリクトしています


$ git merge --allow-unrelated-histories origin/master
CONFLICT (add/add): Merge conflict in README.md
Auto-merging README.md
CONFLICT (add/add): Merge conflict in .gitignore
Auto-merging .gitignore
Automatic merge failed; fix conflicts and then commit the result.

コンフリクトファイルを修正して、 commit & push します。


$ git add.
$ git commit -m 'confrict'
$ git push -u origin master

-u は --set-upstream の短縮形です。

  2020/08/17

Docker のコンテナからホストOSに接続するのに「host.docker.internal」というホストが用意されています。

Docker for Mac Stable release notes

Docker For Mac での機能なので、Linux ベースでは利用できないかと思います。

Dockerコンテナから Mac の MySQL に接続

mysql コマンドで Dockerコンテナから、ホストOS(Mac)の MySQL に接続する場合、ホスト名に「host.docker.internal」を指定します。


# mysql -u ユーザ名 -h host.docker.internal -p
mysql>

よって、開発のプログラム上でも「host.docker.internal」をホストで設定して利用できます。

Dockerコンテナから PHP で MySQL の PDO接続


$db_name = 'DB名';
$user_name = 'ユーザ名';
$password = 'パスワード';
$host = 'host.docker.internal';
$dsn = "mysql:dbname={$db_name};host={$host}";

try {
    $pdo = new PDO($dsn, $user_name, $password);
    echo "接続成功" . PHP_EOL;
} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage() . PHP_EOL;
    exit;
}

Dockerコンテナから Mac の PostgreSQL に接続


# psql -l -h host.docker.internal -U ユーザ名
                         List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges 
-----------+-------+----------+---------+-------+-------------------
 postgres  | yoo   | UTF8     | C       | C     | 
 sample    | yoo   | UTF8     | C       | C     | 
 template0 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo
 template1 | yoo   | UTF8     | C       | C     | =c/yoo           +
           |       |          |         |       | yoo=CTc/yoo

  2020/08/17

Mac でそのまま ifconfig を利用すると、IP アドレスがすぐに見つけられません。


$ ifconfig
lo0: flags=8049 up,loopback,running,multicast  mtu 16384
	options=1203 rxcsum,txcsum,txstatus,sw_timestamp 
	inet 127.0.0.1 netmask 0xff000000 
...

ネットワークインターフェイスを指定する

ネットワークインターフェイスを指定すると比較的見やすくなります。


$ ifconfig en0
en0: flags=xxxxxxxxxx mtu 1500
    ether xx:xx:xx:xx:xx:xx
	inet6 xx:xx:xx:xx:xx:xx%en0 prefixlen 64 secured scopeid 0x7 
	inet 192.168.1.6 netmask 0xffffff00 broadcast 192.168.1.255
    ....

「en0」は PC のネットワークボードによってことなりますが、デフォルトはだいたい「en0」です。

フィルタリングする

更に awk で inet の欄をフィルタリングします。


$ ifconfig en0 | awk '/inet / { print $2 }'
192.168.1.6

.bashrc にエイリアスを作成する

フィルタリングのコマンドを打つのも面倒なので、.bashrc に ip というエイリアスを作成します。
※エイリアス名の ip は簡略化しているので自己責任で

vi などで .bashrc を編集します。


$ vi ~/.bashrc

.bashrc に追加しますが、「'」(シングルクォート)は「'\''」とエスケープする必要があります。


alias ipconfig='ifconfig en0 | awk '\''/inet / { print $2 }'\'''

.bashrc を再読み込みします。


$ source ~/.bashrc

ip と入力すると IPアドレスが表示されます。


$ ip
192.168.1.6

  2020/08/17

ホストOS から Docker の MySQLコンテナにログインする場合、以下の方法があります。

  • MySQL コンテナに bash でログイン
  • mysql コマンドでログイン

MySQL コンテナにログイン

他のコンテナ同様、docker-compose で MySQL コンテナに直接ログインします。


$ docker-compose exec コンテナ名 bash

コンテナ名が mysql だった場合


$ docker-compose exec mysql bash

Docker コンテナにログインしたら、MySQL にログインします。


# mysql -u root -p

この方法は、docker-compose が動作するパスで実行する必要があり、MySQL コンテナ内でも mysql でログインします。

mysql コマンドでログイン

次にホスト OS から mysql コマンドでログインしてみます。

つまりは、Docker の MySQL を外部ホストでログインする方法です。


$ mysql -u root -p -h localhost -P 3306 --protocol=tcp

mysql で localhost を指定すると自分の PC を指すため、--protocol で TCP ソケットを指定する必要があります。

<< Top < Prev Next > Last >>
Mac に minikube をインストール
途中から .gitignore に追加する
Larevel 6.x から Laravel 8.x にバージョンアップ
Composer で Allowed memory size (メモリ不足)エラー
Blade でカスタムクラスを利用する
git push git pull にブランチ指定せずに実行する
git pull や git push できなくなったとき
Docker のコンテナからホストOS に接続
Mac で ローカル IP アドレス(ipv4)のみを表示する
ホストOS から Docker の MySQLコンテナに接続
caching_sha2_password のエラー
node-config で環境設定ファイルを利用する
rootパスワードを初期化(再設定)する
Git から clone したときのエラー対処
Mac に MySQL をインストール
Mac に PostgreSQL をインストール
Laravel 環境構築 - Mac ネイティブ編
Firebase 入門 - Firebase とは
Firebase 入門 - CLI インストールとデータベースの設定
AWS 無料枠(t2.micro)で容量とメモリエラー
Cloud9 を起動する -初心者編-
gcloud で GCEインスタンスを起動してみる
AWS CLI と jq でインスタンス一覧を整形して表示
React と Laravel7 のプロジェクトを作成する
Homebrewインストール-2020年版
3直線で囲まれた範囲塗りつぶし
PuLP で線形最適化問題を解く
カスタムのペジネーションを作る
node-sass を使って sass をコンパイルする
Log ファサードでSQLログを分離して書き出す
いちから始める Docker - 複数のコンテナを使う - (2020年)
いちから始める Docker - docker-compose を使う - (2020年)
AWS ECR を使ってみる
Laravel7 でマルチ認証
Mac に AWS Client を設定する
Laravel7 リリース
v-html でHTML表示する
Laravel で Nuxt.js を使ってみる(Docker環境)
Laravel で Vue コンポーネントを使う
いちから始める Docker -コンテナをビルド- (2020年)
いちから始める Docker -起動してみる- (2020年)
Mac で MySQL(8系)
composer で vendor がインストールできない
Eloquent の日付を Carbon で扱う
webpack 4 入門(npm編)
[Mac]容量を減らす
DIコンテナはじめ
freee SDKを Laravel で使ってみる
freee API を使ってみる
Segueを利用しない画面遷移