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

GeekFactory

int128.hatenablog.com

Docker Machineで既存サーバにDockerホストを構築する

docker

Docker MachineはDockerホストを構築するためのツールです。VirtualBoxVMwareなどの仮想化基盤、AWSやGCEなどのクラウドに対応しており、環境構築からDockerクライアントの接続設定まで自動的に行ってくれます。これによって気軽にDocker環境を調達できるようになります。

既存サーバにDockerホストを構築する

Docker Machineでは、ドライバにGenericを指定することで、既存のサーバにDockerホストを構築することも可能です。Genericを指定したときにどんなコマンドが実行されるのか調べてみました。

下記のコマンドを実行すると、指定したサーバに対してSSH経由で一連の環境構築コマンドが実行されます。

docker-machine -D create --driver generic --generic-ip-address somehost.example.org --generic-ssh-user someuser somehost

引数にはSSH先のIPアドレス、ポート、ユーザ名、秘密鍵を指定できます。詳細は Docker MachineドキュメントのGenericセクション に説明があります。

デバッグオプション -D を指定するとログが表示されます。-D を指定しないと、どんなコマンドが実行されているのかまったく表示されないので気持ち悪いですね。

Genericで実行されるコマンド

今回はCentOS 7で確認しました。

大まかには下記が実行されるようです。

  • OSバージョンのチェック
  • ホスト名やhostsの設定
  • Dockerのインストール
  • Dockerサービスの設定と有効化
  • TLS証明書の設定
exit 0

# OSバージョンのチェック
cat /etc/os-release

# ホスト名やhostsの設定
sudo hostname somehost && echo "somehost" | sudo tee /etc/hostname
if grep -xq 127.0.1.1.* /etc/hosts; then sudo sed -i 's/^127.0.1.1.*/127.0.1.1 somehost/g' /etc/hosts; else echo '127.0.1.1 somehost' | sudo tee -a /etc/hosts; fi

# Dockerのインストール
sudo yum -y update
sudo yum install -y --nogpgcheck  https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm

# Dockerサービスの設定と有効化
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

sudo docker version
sudo mkdir -p /etc/docker
sudo systemctl stop docker

# TLS証明書の設定
printf '%s' '-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
' | sudo tee /etc/docker/ca.pem

printf '%s' '-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
' | sudo tee /etc/docker/server.pem

printf '%s' '-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
' | sudo tee /etc/docker/server-key.pem

# Dockerサービスの設定と有効化
printf "[Service]
ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver devicemapper --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
" | sudo tee /etc/systemd/system/docker.service

sudo systemctl daemon-reload
sudo systemctl start docker

TLS証明書まわりの面倒な設定が自動化されるのはうれしいですね。ただ、何の説明もなく、勝手に /etc/hosts を触ったり yum install されるのはいただけないですね。どんなコマンドが実行されるのか公式に公開されるといいなーと思います。