読者です 読者をやめる 読者になる 読者になる

座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

Linux上で動かすDocker Machine

Docker

職場のWindows端末でDockerを動かそうとしたが, プロキシ越えの設定が面倒になって, やめた.

エラーをトレースしていけば回避できるだろうけど, Docker Toolboxに含まれている Docker Machine のほうが興味深かったので, 自宅のarchlinux環境で試してみた.

はじめに Docker Engine を理解する

Docker Machine とは何か. それを知る前にまず Docker Engine を知っておいたほうがいいと思った.

Docker Engine は, Docker そのもののこと. 要するに docker コマンドで行うあらゆる操作のこと.

  • イメージを取得してくる pull
  • コンテナを作って実行する run
  • コンテナの状態を調べたりするための inspect, ps,
  • 自分でイメージを作成する build

これらのコマンド/サブコマンドはすべて Docker Engine が担っている機能である.

ホストと呼ばれることもある (コンテナとイメージの面倒を見ていて, コンテナを使ったサービスをユーザーに提供するから)

x86_64のLinux上で稼働するサービスである.

Docker Machine とは何か

そして本題. Docker Machine とは何か.

Docker Machine は仮想マシン上に Docker Engine をインストールするツールであり、 docker-machine コマンドを使ってホストを管理します。Machine を使えば、自分のローカルの MacWindows 上に Docker ホストを作れるだけでなく、あなたの会社のネットワーク上や、データセンターや、AWS や Digital Ocean のようなクラウド・プロバイダ上でも作れます。

Docker Machine 概要

前述したとおり, Docker Engine は64bitのLinux上でしか稼働させられない.

MacWindowsでDocker Engineは動かせないので, Virtualboxなどの仮想マシン上でDocker Engineを動かす必要がある. それをやってくれるのが, Docker Machine であるということ.

引用した概要にあるように, Docker Machine は仮想マシンだけでなく, その他のホスト上へもDocker Engineをインストールすることができる. 本当においしい話はこの先に出てくるんだろうと思うけど (たとえば Docker Swarm とか?), とりあえずここでは自分のarchlinuxのローカル環境で Docker Machine を使ってみる話に戻る.

archlinuxで Docker Machine を動かしてみる

archlinuxでは, Docker関係のほとんどのパッケージをPacmanでインストールできる. Docker Machineは次のコマンドでインストールできる.

$ sudo pacman -S docker-machine

ちなみに, ということでもないけど, Docker MachineをインストールするためにDocker関係のパッケージは必要ない. 依存パッケージは gcc-libs のみ. Docker は64bit版しか用意されていないが, Docker Machine には i686向けのパッケージ も用意されている

手順はWindowsでもMacでも同じなんだが, Docker Machine で仮想マシンを作る場合は, docker-machine create コマンドを実行する. default という名前の仮想マシンを作るなら, 次のコマンドを実行する.

$ docker-machine create --driver virtualbox default

次のような実行結果が得られて, 成功していることがわかる.

$ docker-machine create --driver virtualbox default
Running pre-create checks...
Creating machine...
(default) Copying /home/kosuke/.docker/machine/cache/boot2docker.iso to /home/kosuke/.docker/machine/machines/default/boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env default
$

Virtualboxを立ち上げてみてみればわかるが, default という名前の仮想マシンが作られている.

ローカルのコンソールからこの仮想マシンを使えるようにするには, 次のコマンドを実行する.

$ eval $(docker-machine env default)

docker-machine env default は, ローカルの docker コマンドで仮想マシン上のDockerホストを操作できるようにするための環境変数を表示する.

そのため, この状態で docker コマンドを使えば, 仮想マシンの Docker Engine への操作を行っていることになる.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

$

LinuxでDocker Machineを使うメリットは

本番環境のLinuxホスト上でDocker machine (とそれを含めた各種構成) を使うメリットは数多くあると思うが, 個人のたかだか検証用途のLinux環境でDocker Machineを使うメリットはあるのか?

Docker関連の操作には, Dockerがサービスとして稼働していることもあってか, ほとんどの場合にroot権限が必要になる. そのため, sudo コマンドと組み合わせたり, su - でrootユーザとして操作しないといけないのだが, 検証用途の操作のために, 自分のマシンでrootで操作するのは精神衛生にあまりよくない.

その点でいうと, Docker Machine に対する操作にはroot権限が必要ない, もちろん仮想マシン内ではデーモンプロセスを扱うに相応しいユーザーが扱っていると思うけど, Docker Machine経由による操作でそれを意識することはない. そういう利点はあるかなと思う.

広告を非表示にする