本記事について
Docker が動いているマシンに、ネットワーク越しに、別のクライアントから Docker にアクセスできるようにする方法。
はじめに
Dockerはサーバー・クライアントで動いています。
ローカルのPCにDockerをインストールした際は、同じPC上にサーバー・クライアントが構築され、直接通信を行います。
その通信をネットワーク越しに行えるよう設定することにより、他のPCで動いているDockerでも、ローカルのDockerで作業するのと同じ感覚で、操作ができるようになります。
Docker Machineでネットワーク通信をセットアップ
Docker をネットワーク通信できるようにする方法は、公式の https://docs.docker.com/engine/security/https/ に記載されていますが、結構手間です。
そこでここでは、Docker Machineを使って、Dockerをネットワーク通信できるようセットアップします。
Docker Machineとは
- Dockerサーバーを作成・管理するためのコマンドです。
https://docs.docker.com/machine/ - 新たにDockerサーバーを作ったり、既存のサーバーをDockerサーバーにすることができます。
- サーバーにするPCは何でもよく、仮想PCでも構いません
Docker Machine構築
既にPCがあって、それをDocker Machineにする方法を記載します。
- (サーバー側作業)サーバーにSSHログインできるようセットアップしておく
- (サーバー側作業)サーバーでSSHログインユーザーがsudoをパスワード無しで実行できるようにしておく
-
docker-machine
コマンドをインストール https://docs.docker.com/machine/install-machine/ - Genericドライバーで、サーバーをDocker Machineにする
Dockerは自動でインストールされるので、インストールしておく必要はありません
docker-machine create \
--driver generic \
--generic-ip-address=<IPアドレス> \
--generic-ssh-key <ssh鍵ファイルパス> \
--generic-ssh-user <sshログインユーザー名> \
<マシン名>
これで、指定したPCがDocker Machineとなります。
作成されたDocker Machineではdocker daemonがネットワーク通信可能な状態でセットアップされています。
$ ps -aux | grep dockerd
… usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
Docker Machineを作成したローカルPCからは、docker-machine ls
でマシン一覧を表示し、eval $(docker-machine env <マシン名>)
で、Dockerの接続先マシンを切り替えることができるようになります。
Docker Machineに別のクライアントからアクセスする
docker-machineコマンドは、マシンを作成した時に使用したクライアントで利用し、その他のクライアントからDocker Machineにアクセスするには、クライアントのDockerの設定で、参照先が作成したDocker Machineを向くようにします。
以下、参照先変更手順になります。
Docker Machine設定情報をコピー
Docker Machineを作成すると、docker-machine create
を実行したPCの下記ディレクトリに、作成されたDocker Machineの各種情報が保存されます。
~/.docker/machine/machines/<マシン名>
そのうち、Dockerにアクセスするために必要なファイルは
~/.docker/machine/machines/<マシン名>/ca.pem
~/.docker/machine/machines/<マシン名>/cert.pem
~/.docker/machine/machines/<マシン名>/key.pem
の3つで、これを新しいクライアントに、3つが同じディレクトリに置かれるようコピーします。
Docker環境変数の設定
docker
コマンドがどのマシンのDockerを見に行くかは、コマンド引数もしくは、環境変数によって設定できます。
ここでは環境変数による設定を紹介します。
下記のようなシェルスクリプトを作り、source ./change_docker_machine.sh
で環境変数をセットして切り替えます。
ローカルのDockerに戻すには、source ./change_docker_default.sh
で環境変数を削除します。
#!/bin/bash
export DOCKER_HOST=tcp://<マシンのIPアドレス>:2376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=<コピーした[ca.pem][cert.pem][key.pem]が置いてあるディレクトリ>
#!/bin/bash
unset DOCKER_HOST
unset DOCKER_TLS_VERIFY
unset DOCKER_CERT_PATH
利用例
Dockerを切り替えることができると、ローカルのDockerで作業するのと同じ感覚で、サーバーのDockerが操作できるようになります。
例えば、ローカルで作ったDockerfileをサーバーにアップする際
- Dockerfileと一連のファイルをサーバーにアップ
- サーバーにログインして Docker コマンドを実行
といった作業は必要はありません。
単にローカル上で Dockerの 接続先をサーバーに変更して、Docker コマンドを実行するだけでサーバーのデプロイが完了します。
また、docker-compose を使う際も同様で、Docker の接続先をサーバーに変更して、docker-compose up
コマンドを実行するだけで、サーバーへのデプロイが完了します。