Dcokerをvt-xがない環境でやってみよう(QEMU)

#Dcokerをvt-xがない環境でやってみよう
dockerを始めたいが、手元のPCのvt-xが有効でない場合、QEMU上の仮想OSで実行する。

vt-xが有効ならば[以前の投稿](https://qiita.com/ranran/items/cce41e0e363631d66c72)をご参考下さい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/81968/d3d3a2d0-5d5f-a3c3-54f8-ff05764f48a1.png)

キーワード
docker without vt-x

#QEMUをインストール
[QEMU公式](https://www.qemu.org/)からダウンロードしてインストール

#Boot2dockerのISOイメージを取得
[Boot2docker公式](https://github.com/boot2docker/boot2docker/releases)からboot2docker.isoをダウンロード

#事前準備1（初回のみ）
Dockerの永続領域のHDイメージを作成。適当に30GB
※qcow2（圧縮）形式やRAW(非圧縮)形式

```
qemu-img create -f qcow2 data.qcow2 30G
```

QEMUでISOを起動
若干時間がかかります。

```
qemu-system-x86_64 -hda ./data.qcow2 -cdrom ./boot2docker.iso -smp 4 -m 4G -boot d  -net nic -net user,hostfwd=tcp::2022-:22
```
>CPU割り当て４つ：-smp 4
メモリ割り当て４G：-m 4G
NATとSSHでログインするためのポートフォワード設定： -net nic -net user,hostfwd=tcp::2022-:22

起動したらSSHでログイン
QEMUのコンソールでもよいが、コピペ等やりにくいのでSSHでやる。
```
ssh docker@localhost -p 2022
```

>ユーザ：dokcer
パスワード：tcuser
[DockerReadmeより](https://github.com/boot2docker/boot2docker#ssh-into-vm)

先ほどのHDイメージが「/dev/sda」に設定されているので、初期化する。
btrfs で「boot2docker-data」のラベルを付けなければならないので、boot2dockerを使うためにDockerでdebianイメージをとってきてHDイメージを初期化する。

```
docker run -i -t --rm --privileged -v /dev:/hostdev debian bash
```
Boot2dockerの/devが/hostdevにマウントされているので、debian内で以下のコマンドを実行。

```
root@5c3507fcae63:/# fdisk /hostdev/sda
Command: o
Command: n
Select: p
Partition: <enter>
First sector: <enter>
Last sector: <enter>
Command: w
root@5c3507fcae63:/# apt-get update && apt-get install btrfs-tools
root@5c3507fcae63:/# mkfs.btrfs -L boot2docker-data /hostdev/sda1
root@5c3507fcae63:/# exit

```

[詳しくは公式WORKAROUNDS](https://github.com/boot2docker/boot2docker/blob/master/doc/WORKAROUNDS.md#btrfs-ie-mkfs-inside-a-privileged-container)

再起動

```
sudo reboot
```

#Dockerを使おう
起動したらSSHでログイン。
永続領域にDocker関連ファイルは保存されるため、再起動しても消えなくなります。
先ほどのdebianさんは消えてます。

```
ssh docker@localhost -p 2022
```
>ユーザ：dokcer
パスワード：tcuser
[DockerReadmeより](https://github.com/boot2docker/boot2docker#ssh-into-vm)

###以下のエラーが出た場合
Boot2docker側の署名が変わったので取り直しましょう。

```
$ ssh docker@localhost -p 2022
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

修正コマンド

```
ssh-keygen -R '[localhost]:2022'
```
 [公式FAQ](https://github.com/boot2docker/boot2docker/blob/master/doc/FAQ.md#how-can-i-solve-my-problems-with-ssh)





#(おまけflowchart.jsのフローチャートソース)

```
st=>start: Boot2dockerが使いたい:
e=>end: Virtualbox + boot2docker
eq=>end: QEMU + boot2docker

cond=>condition: BIOS(CPU)でvt-xが有効？
Yes or No?:
cond2=>condition: 
Yes or No?:

st->cond
cond(yes)->e
cond(no)->eq
```


#(おまけProxyで躓いたら)
・Boot2dockerでdockerhubへ接続する場合
今回でいうdebianの取得時
/etc/default/docker（初めは存在しません）へproxyサーバを記述する。

```
export http_proxy=http://username:password@your.proxy.address:proxy.port/
export https_proxy=http://username:password@your.proxy.address:proxy.port/
```

・Dockerのゲストからapt-getする場合
今回でいうdebianの中
/etc/apt/apt.conf（初めは存在しません）へproxyサーバを記述する。

```
Acquire::http::proxy "http://username:password@your.proxy.address:proxy.port/";
Acquire::https::proxy "http://username:password@your.proxy.address:proxy.port/";
```

#（おまけホスト⇔Boot2dockerのポートフォワードについて）
QEMUのポートを起動後に開ける方法がわからなかったので、sshでポートフォワードしてみた。
boot2dockerで適当に8000ポートへnginxを公開

```
docker run -d -p 8000:80 nginx
```
ホストの80ポートへboot2dockerの8000ポートをSSH経由でフォワード

```
ssh -L 80:localhost:8000 docker@localhost -p 2022
```