docker
QEMU
boot2docker

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

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

dockerを始めたいが、手元のPCのvt-xが有効でない場合、QEMU上の仮想OSで実行する。

vt-xが有効ならば以前の投稿をご参考下さい。
image.png

キーワード
docker without vt-x

QEMUをインストール

QEMU公式からダウンロードしてインストール

Boot2dockerのISOイメージを取得

Boot2docker公式から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割り当て4つ:-smp 4
メモリ割り当て4G:-m 4G
NATとSSHでログインするためのポートフォワード設定: -net nic -net user,hostfwd=tcp::2022-:22

起動したらSSHでログイン
QEMUのコンソールでもよいが、コピペ等やりにくいのでSSHでやる。

ssh docker@localhost -p 2022

ユーザ:dokcer
パスワード:tcuser
DockerReadmeより

先ほどの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

再起動

sudo reboot

Dockerを使おう

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

ssh docker@localhost -p 2022

ユーザ:dokcer
パスワード:tcuser
DockerReadmeより

以下のエラーが出た場合

Boot2docker側の署名が変わったので取り直しましょう。

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

修正コマンド

ssh-keygen -R '[localhost]:2022'

公式FAQ

(おまけ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