Windows10 homeでもDocker使う方法


依頼を受けて作業していると、開発環境を指定されることもある。
よくあるのが『Docker』。
しかし自分の端末は『windows10 home』。
そう『Hyper-V』のない『windows10 Home』なのだ！
※コチラの記事は<a href="https://qooga.jb-jk.net/wp/use-docker-on-windows-10/">ブログ</a>からのほぼ転載です。UPするする詐欺で1クール経った。

## 環境情報
- Windows 10 home
- Docker version 18.03.0-ce, build 0520e24302 (docker --version)

Homeでは『Hyper-V』の代わりにvagrantでお馴染み『Oracle Virtual Box』を利用する『Docker Toolbox』の『レガシー』を使う。

今回は前提条件として
Dドライブ直下に、今後laravalプロジェクトを複数作成することも想定し、laraval専用ディレクトリとして『laraval.host』、その下に今回作成するlaradockプロジェクト『test_pj』を作るとする。
要するに『D:/laraval.host/test_pj』

# Dockerのインストール
下記を参照ください。
全部解るよ、親切！　だから書かない！
[windows 10 home で docker を導入するメモ - Qiita](https://qiita.com/idani/items/fb7681d79eeb48c05144)

「既にVirtual Boxあるけど、合わせた方がいいのかなぁ」なんて軽い気持ちでチェック外さずに入れるとVirtual Boxマネージャが使えなくなって泣く泣く本家で落とし入れ直すことになるので注意。

1回『Docker Quickstart Terminal』を起動して魚が出たらOK。

```
docker-machine.exe stop
```
して画面を閉じる。
『Oracle Virtual Box』で『default』サーバが出来ていることが確認できたらインストール成功。

# 容量増やす
『Oracle Virtual Box』で『default』を選択→『設定』→『システム』
にて『マザーボード』の容量を初期値『1024MB』から増やす。
1024MBなどlaradockが入りもせぬ…
とりあえず『2048MB』にしておけばいいと思うけど、そこは各々個人の裁量でどうぞ。

# ファイル共有
仮想環境内で作成・操作した物をwindowsで使えないのは凄い不便！
windows側のエディターで編集したいし、管理したい。
そんなときに使うのが『ファイル共有』

通常ではdocker側だけで解決出来る。
しかしWindows10 home上のファイルを共有する場合は、VirtualBox機能を使って仮想マシン(default)にイチイチ場所を提供する必要がある…ツライ。

詳しくは下記を参照！
[Docker toolbox on windows マウント：Dockerコンテナの中でホストのフォルダを見たい - Qiita](https://qiita.com/hnishi/items/db10505e36c95587851d)

## ファイル共有先が解らない場合
貰ったdockerファイルによっては自動マウント設定があったりする。
先程書いた通り、そんな設定があっても、windows 10 homeだと『VirtualBox』を設定しないと共有出来ない。
でも設定しようにも「共有ファイル先がわからない！」という状態になる。

そんなときはまず、『Docker Quickstart Terminal』を起動し、

```
docker-compose up -d nginx workspace
```
で1回対象コンテナを起動する。

下記コマンドで、現在起動中のコンテナ情報を取得する。
`docker ps`と打ち込むと下記のような感じで出る。

```
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                        NAMES
6fb2c7674d3c        laradock_nginx       "/bin/bash /opt/star…"   18 hours ago        Up 23 minutes       0.0.0.0:443->443/tcp, 0.0.0.0:800->80/tcp   laradock_nginx_1
...(以下略)
```
一覧の対象コンテナ名が書かれた『NAME』と共に『CONTAINER ID』が表示されているので
`docker inspect 【コンテナID】`
とするとどこかに

```
"Mounts": [
    {
        "Type": "bind",
        "Source": "/d/laraval.host/test_pj",
        "Destination": "/var/www",
        "Mode": "cached",
        "RW": true,
        "Propagation": "rprivate"
    }
],
```
のような情報が見つかる。
上記で言えば『/d/laraval.host/test_pj』が共有フォルダ。

『Oracle VM VirtualBox』起動→『default』の設定→『共有フォルダ』→『追加』

- フォルダーのパス：windows側の共有させたい場所のパス。『D:/laraval.host/test_pj』
- フォルダー名：仮想環境側のパス。『/d/laraval.host/test_pj』

とすれば良いところなんだけど、これだと環境を作れば作った分だけ共有フォルダを増やさなくてはいけなくなる。

そこで前提条件の「『laraval.host』配下はプロジェクト複数作成する想定」という設定が生きてくる。

- フォルダーのパス：D:/laraval.host
- フォルダー名：/d/laraval.host
これでleravalのプロジェクトが増えに増えたとしても問題ない。

# WEBアクセスする
VirtualBox使っているので『127.0.0.1』や『localhost』でアクセスなど出来ない。
何より初期状態ではweb用のポートが開いていないので、そもそもブラウザから見ることが出来ない！
ここに気づくまで数日かけてしまった…

## IPを調べる・設定
VirtualBoxのIPを調べるには、コマンド実行が出来るもので下記を打ち込むと出る。

`docker-machine ip`
今回は仮として『192.168.99.100』とする。

このIPをURLに打ち込むとアクセス出来るようになるのだが、イチイチ覚えるのもめんどくさいからURLを設定する。
windows側hostsファイルに下記のように情報追加。
`192.168.99.100          dockerhost`

##ポート設定
windows側と仮想側でポートを繋ぐ。
『Virtual Box』→『default』→『ネットワーク』→『アダプター』→『ポートフォワーディング』

- ホストポート：仮想環境側ポート。通常『80』
- ゲストポート：windows側ポート(アクセス用ポート)。仮として『800』

別にゲストポートは『80』を設定でもいいのだが、共同作業人がmac(defaultでポート80使用)の可能性があるので、設定ファイルも共有するなら事前に相談しておくと安心。

これで『http://dockerhost:800/』または『http://192.168.99.100:800』にアクセスするとwebページが見れる。

もしHTTPSを使うなら、下記を作っておくがいい。

- ホストポート：443
- ゲストポート：443

#何か問題が起きた場合
##『docker-compose up』途中でエラーが起きる
落とし直すかとりあえずgitをpullして更新してみたら解決することがある。
『.env』の設定する内容が増えていたり、変わっていることがあるので要見直し。
その後『docker-compose up』で巧く行く可能性がある。
無理なら『docker-compose rm』して作り直す。

##『.env』の反映されてない気がする
基本的にupすればOKだが、それでもダメであれば

`docker-compose rm`
してupし直す。

##イメージを再構築(build)がエラーになる
『docker-compose build』『docker-compose up --build』を求められることがある。
ちゃんと後ろに『docker-compose up --build mysql』のように『何を』を対象にするのかを指定すること。
無指定だと更新途中で失敗し、起動しなくなったりするので、そうなったら諦めて

`docker-compose rm`
してからupし直し。それでもダメなら初期に戻す。

##初期に戻す
何かもう巧く行かなすぎてツライ…やり直したい…
なときは、
下記コマンドで全コンテナを削除。

`docker-compose rm`
してからup。

これで駄目なら完全初期化！

```
docker-compose stop
docker system prune -a
docker volume rm $(docker volume ls -qf dangling=true)
```
それでもうまくいかないときはいっそ根本から作り直す。
『Oracle VM VirtualBox』起動して『default』を『除去』する。
何もかも最初からやり直してくれるぞ！

##空き容量がないと言われる
```
ERROR: failed to register layer: Error processing tar file(exit status 1): write ～.so: no space left on device
```
の状態。

`docker system df`
で見ると確かに容量が95%を超えている…とか確認出来る。

`docker-compose stop`
でコンテナを止めてから

`docker system prune -a`
にて、現在停止中の全てのコンテナ、ボリューム、ネットワーク、イメージを一括掃除しちゃってからの『docker-compose up』

Docker vlumeが満杯の可能性もあるので消しても良い。
下記はめんどくさいから全部消す例。

`docker volume rm $(docker volume ls -qf dangling=true)`
指定して消す方法もある。スッキリする。
[Docker volumeの削除 - Qiita](https://qiita.com/Ikumi/items/b319a12d7e2c9f7b904d)

ついでに念の為上記を参照にメモリを増やしておくこともオススメ。

##MySQL起動しない…
基本的には下記の情報で何とかなる。
[Laradockのmysqlが起動できない時の対応(State = Exit0, Exit 1, Exit 3) - Qiita](https://qiita.com/bunty/items/681a74de001b7ed1c022)

`docker images`
で『mysql』を含む名前を覚えて

`docker-compose down`
または
`docker-compose down 【取得した名】`
してから

```
docker-compose rm mysql
docker volume rm 取得した名前
docker rmi 取得した名前
```
～/.laradock/data/の『mysql』ディレクトリを消した後

`docker-compose up mysql`
これで完全作り直ししてくれる。

これでも動かなければ

```
docker-compose stop
docker system prune -a
docker volume rm $(docker volume ls -qf dangling=true)
```
にて全て削除してきれいにした上で
～/.laradock/data/の『mysql』ディレクトリを消した後

```
docker-compose up -d nginx workspace
docker-compose up mysql
```
MySQLは先にnginx workspace作っちゃってから作る方が安全。

##VBoxManageコマンドを使う
もう何が原因か分からないけど巧くいかないときに、原因を調べるときに使える。

『コマンドプロンプト』を起動する。
パス通してなければ『VBoxManage.exe』があるディレクトリまで移動(cd)。
通常なら下記のようになると思う。

`cd C:\Program Files\Oracle\VirtualBox`
そこで使えるようになる。

例えば開いているポートとかの情報が見れる

`VBoxManage showvminfo "default" |find "NIC"`
※『grep』はwindowsでは、通常使えないから『find』にすれば大体使える。

下記がとても参考になった。
[VirtualBox（Oracle VM VirtualBox）のVBoxManageコマンドって、なんか微妙。たぶん使い方が分かってないとは思うけど - ts0818のブログ](https://ts0818.hatenablog.com/entry/2018/07/07/151052)


#dockerの最低限コマンド
『Docker Quickstart Terminal』を開いた時点でVBoxのdefaultサーバが立ち上がる便利。
そこに打ち込んでいくが、下記覚えておけば多分まぁ、何とかなる。

```
docker cd /var/www     ... ディレクトリ移動
docker-compose up -d 【対象】   ... コンポーネント起動
docker images          ... イメージ一覧を見る
docker ps              ... 起動中コンテナ一覧を見る
docker-machine.exe ls　    ... 現在起動中の仮想マシンの確認。
　だが『Oracle Virtual Box』でもdefault起動してるから解る。
docker stop 【コンテナ名】     ... 起動しているコンテナを指定して止める
docker-compose stop     ... 起動しているコンテナを全て止める
docker-compose down     ... 全コンテナを停止
```
よく使うものはbatファイル等にしておくと楽。

バージョン取得系は複数ある。

```
docker-compose version     ... docker-compose自体のバージョン
docker version     ... 詳細型
docker --version     ... 省略型
```

```
docker-machine.exe stop     ... 動いている仮想マシンを止める(終了)
```
これをしてから『Docker Quickstart Terminal』閉じるようにした方が環境が壊れづらい。