Docker Host(Windows 64bit) + Docker Client(OSX)

奇跡的にこんな環境で作業する羽目になった. Windows 64bitと明記している理由は,Docker Toolboxを利用するからである.

Windows 32bitは割と苦行だと思う.2016/05/05, docker-machineにdriver(virtualbox-driver等)が入ってなく詰んだ.たぶん,正解はWindows32bit machineにVirtualBoxsshサーバを立てて,clientはgenericを使ってdocker hostをつくるのかなー?

Install (Host)

Docker Toolbox

Docker Toolbox | Docker

Create Container

docker-machine create -d virtualbox docker0
VBoxManage controlvm docker0 naptpf1 "docker_host,tcp,0.0.0.0,52376,,2376"
VBoxManage controlvm docker0 naptpf1 "ssh_host,tcp,0.0.0.0,50022,,22"

copy ssh-key

以下のコマンドで,$HOGE/.dockerが出力される.ssh-keyがあるdirectoryまで移動する.

docker-machine config docker
cd $HOGE/.docker/machine/machine/docker0
ls
#=> id_rsa を OSXまで持っていく 

Install (Client)

export DOCKER_HOST_ADDR=Windows 64bitのIP Addressをいれる

docker-machine

以下から最新のdocker-machineを持ってくる.2016/05/05, v0.7.0

Releases · docker/machine · GitHub

取得したらPATHを通す

register docker-host with docker-machine

copy ssh-keyにて取得したid_rsa$HOME/.ssh/docker-machineへrenameする. そのssh-keyと以下のコマンドでdocker-machineへ登録する.

docker-machine create -d generic --generic-ssh-user docker --generic-ssh-key $HOME/.ssh/docker-machine --generic-ip-address $DOCKER_HOST_ADDR --generic-ssh-port 50022 --generic-engine-port 52376 docker9

以下のコマンドので確認する.

docker-machine ls
#NAME      ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER    ERRORS
#docker9   *        generic   Running   tcp://$DOCKER_HOST_ADDR:52376           v1.11.1

実際にdockerを使って見る

eval "$(docker-machine env docker9)"
docker run hello-world

Port forwarding

例えば,nginxのコンテナを作るとする. 以下のようにPort forwardingしないと,nginxにアクセスすることができない.

docker run -d -p 58080:80 nginx
docker-machine ssh docker9 -f -N -L 58080:localhost:58080

なぜなら,以下のようにNAPTしているからだ.

Docker Host <- NAPT -> (Windows 64bit) <-> Docker Client

plus

上記の例には無駄がある. -p 58080:80マッピングは不要だ.

exposeしているportへのマッピングは下記でよい.

docker run -d nginx
#=> ad8w3h
docker-machine ssh docker9 -f -N -L 58080:$(docker inspect --format="{{ .NetworkSettings.IPAddress }}" ad8w3h):80

add CMD

export cmd=/bin/sh
docker exec -it $container_name $cmd

confirm command

docker-machine create -d virtualbox docker0

create docker host

VBoxManage controlvm docker0 naptpf1 "docker_host,tcp,0.0.0.0,52376,,2376"

NAPT

VBoxManage controlvm $VM_NAME naptpf[1-n] "$RULE_NAME,$PROTOCOL,$LOCAL_ADDRESS,$LOCAL_PORT,$VM_ADDRESS,$VM_PORT"

docker-machine config docker

show config

docker-machine create...

create docker host info

docker-machine create -d $DRIVER .... $HOST_NAME