Docker Host(Windows 64bit) + Docker Client(OSX)
奇跡的にこんな環境で作業する羽目になった. Windows 64bitと明記している理由は,Docker Toolboxを利用するからである.
Windows 32bitは割と苦行だと思う.2016/05/05, docker-machineにdriver(virtualbox-driver等)が入ってなく詰んだ.たぶん,正解はWindows32bit machineにVirtualBoxでsshサーバを立てて,clientはgenericを使ってdocker hostをつくるのかなー?
Install (Host)
Docker Toolbox
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