じゅんくどうです。
本投稿は「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特集は終了。
でわでわ