DockerにRemoteからアクセス

表題の通り。boot2dockerはローカルのMac(or Windows)からVirtualBoxに起動したVMにリモートアクセスしている。自身が別途構築したVM上にインストールしたDockerに対しても同じようにアクセスしたい。

■ 環境

  • Docker 1.7.1
  • Mac OSX (10.9.5)
  • VirtualBox
  • CentOS 6.6

■ 目標

boot2dockerでは下記を環境変数に入れるように促される。

export DOCKER_HOST=tcp://192.168.59.103:2376
export DOCKER_CERT_PATH=/Users/iida/.boot2docker/certs/boot2docker-vm
export DOCKER_TLS_VERIFY=1

これによって”docker“コマンドは、自身の環境では”192.168.59.103“で稼動しているDockerにリモートアクセスし結果を得ている。これを別のVMでも実現させたい。コマンドでいえば下記が正常な応答を返すことが目的だ。

$ docker -H tcp://[IP]:2376 info

もちろん他の”docker“コマンドも全て正常に動作することが目的である。

■ Dockerのリモートアクセス

CentOS 6.6でDockerは稼動している。プロセスを確認すると下記の通りである。

[vagrant@localhost ~]$ ps -ef | grep docker
root      1347     1  0 06:14 ?     00:00:01 /usr/bin/docker -d
[vagrant@localhost ~]$

ちなみにboot2dockerで稼動しているDockerのプロセスを見てみると下記の通りである。

withsin:~ withsin$ boot2docker ssh
  :
Boot2Docker version 1.7.1, build master : c202798 - Wed Jul 15 00:16:02 UTC 2015
Docker version 1.7.1, build 786b29d
docker@boot2docker:~$ ps -ef | grep docker
root       781     1  0 Aug02 ?        00:11:06 /usr/local/bin/docker -d -D -g /var/lib/docker -H unix:// -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/var/lib/boot2docker/tls/ca.pem --tlscert=/var/lib/boot2docker/tls/server.pem --tlskey=/var/lib/boot2docker/tls/serverkey.pem
  :
docker@boot2docker:~$

オプションがいろいろ付いている。気になるのは下記2点だ。

  • -H unix://
  • -H tcp://0.0.0.0:2376

リモートアクセスという点から考えるに2点目が特に怪しい。これらがどこで設定されているのかを確認してみると、boot2dockerの環境では下記のinitスクリプトの中で書かれていた。

/usr/local/etc/init.d/docker

何か設定ファイルでもあるのかと思ったが、どうやら無いようである。 “/var/lib/boot2docker/profile“に書かれたりするのかもしれないが、これがDockerの設定ファイルというわけでは無いだろう。

また、dockerコマンドのヘルプも確認する。

[vagrant@localhost ~]$ docker --help

以上から、デーモンプロセスの起動時に単に設定すればOKそうである。

■ 起動時のオプション

次にDockerプロセス起動時のオプションをどこに記載すべきか、が問題になるが、initスクリプトに直書きは気分的によろしくない。よって、下記のファイルが存在していたのでこれに記載することにした。

[vagrant@localhost ~]$ cat /etc/sysconfig/docker
# /etc/sysconfig/docker
#
# Other arguments to pass to the docker daemon process
# These will be parsed by the sysv initscript and appended
# to the arguments list passed to docker -d

other_args=""

記載するのは前述の2つ。従って下記のようになる。

[vagrant@localhost ~]$ cat /etc/sysconfig/docker
  :
other_args="-H unix:// -H tcp://0.0.0.0:2376"

リモートアクセスだけに絞るのであれば2点目だけで問題がないだろうが、デフォルトではUnixドメインソケットを利用するようなので、同マシンからのアクセスも設定無しに可能にさせる為に残してある。

Dockerを再起動させる。

[vagrant@localhost ~]$ sudo service docker relaod
Stopping docker:                               [  OK  ]
Starting docker:                               [  OK  ]
[vagrant@localhost ~]$

これで外部からのアクセスも可能となったはずだ。

withsin:~ withsin$ docker -H tcp://172.28.128.10:2376 info
An error occurred trying to connect: Get https://172.28.128.10:2376/v1.19/info: tls: oversized record received with length 20527
withsin:~ withsin$

TLSの設定等はしていないので、boot2dockerの時に使用している環境変数が原因と思われる。今はTLS周りの設定はしている時間はないので、利用しないように環境変数を一時的に外してしまう。ちなみに外してしまうと今度はboot2dockerが利用できなくなってしまうので、最終的には自身で構築したDockerの方にもTLSの設定を入れるのが良いだろう。

withsin:~ withsin$ unset DOCKER_TLS_VERIFY
withsin:~ withsin$ docker -H tcp://172.28.128.10:2376 info
Containers: 0
Images: 127
Storage Driver: devicemapper
   :
withsin:~ with$

アクセスが可能となった。その他のコマンドも一通りちゃんと動いてくれているようなので問題なし。

以上。

■ 関連