Microsoft Azure でDockerはじめちゃいますか?

じゅんくどうです。
本投稿は「Azure Advent Calender 2014」12月7日分の投稿になります。Azure Advent Calender 2014は各人が12月25日まで思い思いにAzureについて投稿するイベントです。今回は、(たぶん)Microsoftも注目しているDockerについて書きます。

MicrosoftとDocker

最近、Microsoft界隈の方も「Docker」という言葉を頻繁に耳にすると思います。そう、10月15日にDocker社と提携したという発表があったためです。また、スコットガスリー氏のブログで、次期Windows ServerでDockerをサポートするとともに、Docker Hubとの統合も行えるようにすると書かれています。これによってWindows でもDockerが動くということになり、Windows、Linuxという壁を越えてDockerを扱えるようになります(なるはずです)。

現状、WindowsがサポートしているのはDocker Clientです。Docker ClientはAPI、コマンドラインによる操作が可能となります。

AzureでDockerを使ってみる

AzureでDockerを使う方法として2つ。
– Linuxインスタンスを立ち上げてDockerをインストールする。
– 用意されたCoreOSイメージを利用する。

前者はapt-getやyumでインストールして利用しようって感じです。
後者は仮想マシンで用意されているCoreOS利用する方法です。
前者については真新しいものでもないので、今回は後者の方法を見ていきたいと思います。

では、最初にAzureポータルから仮想マシンを作成。CoreOSイメージを選択しましょう。
おっと、2つイメージが表示されます。何が違うのか確認してみましょう。
DockerとCoreOSのバージョンを調べてみました(2014/12/03時点)

①CoreOS Alpha

CoreOS (alpha)
azureuser@docker-alpha ~ $ sudo docker -v
Docker version 1.3.2, build 50b8feb
azureuser@docker-alpha ~ $ cat /etc/os-release 
NAME=CoreOS
ID=coreos
VERSION=509.1.0
VERSION_ID=509.1.0
BUILD_ID=
PRETTY_NAME="CoreOS 509.1.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

②CoreOS Beta

CoreOS (beta)
azureuser@docker-beta ~ $ sudo docker -v
Docker version 1.3.2, build 50b8feb
azureuser@docker-beta ~ $ cat /etc/os-release 
NAME=CoreOS
ID=coreos
VERSION=494.1.0
VERSION_ID=494.1.0
BUILD_ID=
PRETTY_NAME="CoreOS 494.1.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

Dockerのバージョンは、1.3.2と同じものになります。
CoreOSのバージョンがAlpha版は509.1.0、Beta版は494.1.0となります。
Alphaの方が最新版になるくことに注意しましょう。

さて、実際にイメージを選択しインストールしていきます。
Alpha版をインストールします。
仮想マシンの作成方法は変わりませんので、適当に入力/選択します。

ここも一緒です。

拡張機能は使えないのでそのまま進めましょう。
将来的に、Deep Security Agentが使えるといいなぁ(願望)

はいこれで完了です。
簡単ですねーーー。

ではログインしてみましょう。
・・・・それでは、面白くないのでDocker CLI for Windows Clientsを使ってみます。
Docker CLI for Windows Clientsは「Connect();」でもデモ公開されました。

Docker CLI for Windows Clientsを利用するには、githubで公開されているソースから、Windowsでコンパイルして利用する方法があります。コンパイル方法については「How to compile Docker on Windows」で公開されています。

上記のサイトを参考(超超超訳)で進めていきます。

事前準備としてAzure上にWindows Server 2012 R2を立ち上げましょう。
Dockerと通信が行える場所に配置しましょう。

Step1:Goをインストールします。

Goのインストーラをgolang.orgよりダウンロードます。インストールするとコマンドプロンプトで利用できるようになります。

バージョン確認

PS C:Usersazureuser> go version
go version go1.3.3 windows/386

Step2:コードをチェックアウトします。

Gitをインストールします。

次にdocker/cockerレポジトリよりCloneします。

git clone https://github.com/docker/docker.git c:gopathsrcgithub.comdockerdocker

実行結果

C:Usersazureuser>git clone https://github.com/docker/docker.git c:gopathsrcgithub.comdockerdocker
Cloning into 'c:gopathsrcgithub.comdockerdocker'...
remote: Counting objects: 64814, done.
remote: Compressing objects: 100% (31/31), done.
Receiving objects: 100% (64814/64814), 35.91 MiB |

Resolving deltas: 100% (42532/42532), done.
Checking connectivity... done.
Checking out files: 100% (1581/1581), done.

Step3:コンパイル!

簡単です。コマンドプロンプトより次のコマンドを実行します。

set GOPATH=c:gopath;c:gopathsrcgithub.comdockerdockervendor
set DOCKER_CLIENTONLY=1
cd c:gopathsrcgithub.comdockerdockerdocker
go build -v

実行結果

C:Usersazureuser>set GOPATH=c:gopath;c:gopathsrcgithub.comdockerdockervendor

C:Usersazureuser>set DOCKER_CLIENTONLY=1

C:Usersazureuser>cd c:gopathsrcgithub.comdockerdockerdocker

c:gopathsrcgithub.comdockerdockerdocker>go build -v
github.com/Sirupsen/logrus
github.com/docker/docker/pkg/ioutils
github.com/docker/docker/dockerversion
github.com/docker/docker/pkg/fileutils
github.com/docker/docker/pkg/pools
github.com/docker/docker/pkg/promise
github.com/docker/docker/pkg/system
github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar
github.com/docker/docker/pkg/archive
github.com/docker/docker/pkg/term
github.com/docker/docker/pkg/timeutils
github.com/docker/docker/pkg/units
github.com/docker/docker/utils
github.com/docker/docker/engine
github.com/docker/docker/pkg/parsers
github.com/docker/docker/pkg/version
github.com/docker/docker/vendor/src/github.com/docker/libtrust
github.com/docker/docker/api
github.com/docker/docker/daemon/graphdriver
github.com/docker/docker/pkg/tarsum
github.com/docker/docker/nat
github.com/docker/docker/pkg/mflag
github.com/docker/docker/opts
github.com/docker/docker/runconfig
github.com/docker/docker/image
github.com/docker/docker/pkg/parsers/filters
github.com/tchap/go-patricia/patricia
github.com/docker/docker/pkg/truncindex
github.com/docker/docker/pkg/httputils
github.com/docker/docker/pkg/parsers/kernel
github.com/gorilla/context
github.com/gorilla/mux
github.com/docker/docker/registry
github.com/docker/libtrust
github.com/docker/docker/graph
github.com/docker/docker/pkg/signal
github.com/docker/docker/pkg/stdcopy
github.com/docker/docker/pkg/urlutil
github.com/docker/docker/api/client
github.com/docker/docker/pkg/reexec
github.com/docker/docker/docker

全て完了したら、愛しのdocker.exeがディレクトリにできています♡

実行結果

c:gopathsrcgithub.comdockerdockerdocker>docker.exe
Usage: docker [OPTIONS] COMMAND [arg...]

A self-sufficient runtime for linux containers.

Options:
  --api-enable-cors=falseEnable CORS headers in the remote API
  -D, --debug=false  Enable debug mode
  -d, --daemon=false Enable daemon mode
  -G, --group="docker"   Group to assign the unix socket specified by -H when running in daemon mode
   use '' (the empty string) to disable setting of a group
  -H, --host=[]  The socket(s) to bind to in daemon mode or connect to in client mode, specified using one or more tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd.
  -l, --log-level="info" Set the logging level
  --tls=falseUse TLS; implied by --tlsverify flag
  --tlscacert="C:\Users\azureuser\.docker\ca.pem"Trust only remotes providing a certificate signed by the CA given here
  --tlscert="C:\Users\azureuser\.docker\cert.pem"Path to TLS certificate file
  --tlskey="C:\Users\azureuser\.docker\key.pem"  Path to TLS key file
  --tlsverify=false  Use TLS and verify the remote (daemon: verify client, client: verify daemon)
  -v, --version=falsePrint version information and quit

Commands:
  attachAttach to a running container
  build Build an image from a Dockerfile
  commitCreate a new image from a container's changes
  cpCopy files/folders from a container's filesystem to the host path
  createCreate a new container
  diff  Inspect changes on a container's filesystem
  eventsGet real time events from the server
  exec  Run a command in a running container
  exportStream the contents of a container as a tar archive
  history   Show the history of an image
  imagesList images
  importCreate a new filesystem image from the contents of a tarball
  info  Display system-wide information
  inspect   Return low-level information on a container
  kill  Kill a running container
  load  Load an image from a tar archive
  login Register or log in to a Docker registry server
  logoutLog out from a Docker registry server
  logs  Fetch the logs of a container
  port  Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
  pause Pause all processes within a container
  psList containers
  pull  Pull an image or a repository from a Docker registry server
  push  Push an image or a repository to a Docker registry server
  restart   Restart a running container
  rmRemove one or more containers
  rmi   Remove one or more images
  run   Run a command in a new container
  save  Save an image to a tar archive
  searchSearch for an image on the Docker Hub
  start Start a stopped container
  stop  Stop a running container
  tag   Tag an image into a repository
  top   Lookup the running processes of a container
  unpause   Unpause a paused container
  version   Show the Docker version information
  wait  Block until a container stops, then print its exit code

Run 'docker COMMAND --help' for more information on a command.

バージョンの確認

c:gopathsrcgithub.comdockerdockerdocker>docker.exe -v
Docker version , build
c:gopathsrcgithub.comdockerdockerdocker>docker.exe version
Client API version: 1.16
Go version (client): go1.3.3
OS/Arch (client): windows/386
←[31mFATA←[0m[0000] Get http:///var/run/docker.sock/v1.16/version: dial unix /var/run/docker.sock: An address incompatib
le with the requested protocol was used.. Are you trying to connect to a TLS-enabled daemon without TLS?

Dockerをリモートで操作する方法としてRemote APIを使います。
そのためにCoreOS側でSocketを作成する必要があります。

CoreOS側にログインしてsocketを作成します。
docker-alpha ~ # vi /etc/systemd/system/docker-tcp.socket

ポート2375で待ち受けするようにSocketを作成します。

[Unit]
Description=Docker Socket for the API

[Socket]
ListenStream=2375
BindIPv6Only=both
Service=docker.service

[Install]
WantedBy=sockets.target

Dockerを再起動します。

docker-alpha ~ # systemctl enable docker-tcp.socket
Created symlink from /etc/systemd/system/sockets.target.wants/docker-tcp.socket to /etc/systemd/system/docker-tcp.socket.
docker-alpha ~ # systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket
docker-alpha ~ # systemctl start docker-tcp.socket
docker-alpha ~ # systemctl start docker

ポート2375で動作しているか確認します。

docker-alpha ~ # docker -H tcp://127.0.0.1:2375 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

問題ないようです。
ではWindows側で確認してみましょう。

c:gopathsrcgithub.comdockerdockerdocker>docker.exe -H tcp://100.72.32.96:2375 version
Client API version: 1.16
Go version (client): go1.3.3
OS/Arch (client): windows/386
←[31mFATA←[0m[0000] Error response from daemon: client and server don't have same version (client : 1.16, server: 1.15)

…ウップ
APIのバージョン違うぞって怒られた。

あれ?CoreOS + Docker CLI for Windows Clients on Azureは・・・ムリポ?

今回は時間がないのでここまで!まぁ通信できているからいいか(w
Dockerからブランチ指定してCloneしたらBuildできないorz
CoreOSではなくUbuntuとかにインストールすればDockerも1.16つかえるので大丈夫です。
CoreOS・・・・・

おまけ

それでもWinodwsで夢をみる

じゃWindowsでDocker使いたいよって人の為には!
boot2dockerを利用するのが簡単かな?

では早速、Azure でWindows7を起動させて・・・ちょっとまって!boot2dockerは、AzureやHyper-vで起動しません。

なぜかって?

boot2dockerはVirual Box上で起動する仕組みになっています。そして64bit対応である必要があります。
Virual BoxがAzure上やHyper-v上で64bitで動作しないのでムリポ。(ここら辺、詰めて検証していないのであとでやってみます。)

では、boot2dockerを動作させるためにはどうしたら良いか?実機を使いましょう(w
boot2dockerはこちらのサイトよりダウンロードできます。
ドキュメントはこちら

ダウンロードしてきたdocker-install.exeを走らせインストールを開始します。

インストールが完了したらデスクトップ上に「Boot2Docker Start」というショートカットができます。
起動しましょう。

バックグラウンドでは、Virual Boxにマシンイメージが作成され起動されます。
そして自動的に、sshで接続されます。

これで使えますね。

さー確認してみましょう

APIのバージョンが一緒なので大丈夫!
確認ができましたね。

以上で今回のdocker特集は終了。
でわでわ