docker-machineでGMO-VPSにgenericドライバで環境構築する

ローカル環境としてVirtualBoxにUbuntu乗せてdockerでKUSANAGI等を動かして遊んで、いざ本番環境に移行しようといろいろ探していたらdocker-machineなるものを発見してハマった話。の解決編です。

やりたいこと

GMO-VPS上にdocker-machineで接続する(genericドライバ)

docker-machineにはAWS等に簡単に接続するためのドライバが有るのですが、今回実施しようと思ったGMO-VPS向けには特別なドライバがないのでgenericドライバを用いて接続したときのお話です。

さくらVPS等の紹介記事はあるのですが、GMO-VPS向けはなかったので書いてみました。

ポイント

今回何回かハマったのは、見ていたサイトが古いためdocker-machineのバージョンが異なりインストールできなかったことが大きいです。そのため、実際に行うときはdocker-ce、docker-machineのバージョンを考慮し、必要に応じて公式サイトのインストール方法を参考にインストールしたほうが無難です。ネットにある情報だと、バージョンが異なって、エラーが出る等おおいにあります。

今回のやり方の前提条件

GMO-VPS上にUbuntuをクリーンインストールした状態から、一般ユーザーを作って鍵認証設定等をしてローカルのDocker-machineで接続できるようにします。

やり方

サーバ側設定

sudo権限を持つ一般ユーザーを作成

プロンプトは、#:root、$:一般ユーザーとします。

ここでは例としてUSERというユーザーを作成します。

# useradd -m USER
# passwd USER

この状態でsudo権限を与えます。

# usermod -aG sudo USER
もしくは
# gpasswd -a USER sudo

これでユーザーができたので、ユーザーでログインします。

# su - USER

クライアント側設定

公開鍵、秘密鍵を作成する

$ ssh-keygen -t rsa

3回入力を求められます。

最初は、公開鍵、秘密鍵を置く場所です。何も入力しないでEnterするとデフォルト設定になります。デフォルトでOKです。

つぎは、鍵を使用する際のパラフレーズを聞かれます。何も入力せずにEnterでも通りますが、セキュリティが下がるっぽいです。

公開鍵をサーバーに登録する

$ ssh-copy-id USER@IPアドレス

USERは先程、サーバーで作った一般ユーザーです。IPアドレスは先程のサーバーのアドレスになります。

初回の場合はフィンガープリントが表示されるので、"yes"を入力してUSERのパスワードを入力すると鍵が登録されます。

サーバ側設定

公開鍵を有効化する

上記まででsshで接続しようとしたら「sign_and_send_pubkey: signing failed: agent refused operation」と出たので、サーバ側で下記のコマンドを実行しました。

$ ssh-add

これでクライアント側から公開鍵を用いてssh接続ができるはずです。

クライアント側

公開鍵でssh接続テスト

$ ssh USER@IPアドレス

これで特にパスワードを聞かれずに接続できたら成功です。もしできないようであれば、鍵の設定がうまく行っていない可能性があるので確認してください。

サーバ側にdocker-ceを準備

現状、docker-machine実行前にdocker-ceをインストールしておくとうまく行ったのでこの手順を記載しています。もしかしたら、ここは不要かも…

インストール方法は公式サイトで最新バージョンのものをみるのが確実です⇒公式サイト

ここでは公式サイト記載の内容(2019/7/24時点)のコマンドだけを抽出して記載しています。

$ ssh USER@IPアドレス
$ sudo apt-get update
$ sudo apt-get install \<br>    apt-transport-https \<br>    ca-certificates \<br>    curl \<br>    gnupg-agent \<br>    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \<br>   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \<br>   $(lsb_release -cs) \<br>   stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

以上で、最新のdockerをインストールすることができます。

docker-machine実行時にsudoでパスワード入力が必要だとコケるので、パスワード入力をOFFする必要があります。

$ sudo visudo

ここで、下記の一文を追加します。

ユーザ名 ALL=NOPASSWD: ALL

ちょっと危険な設定な気もしますが…

【補足】アンインストールや別バージョンのインストール

アンインストール方法は

$ sudo apt-get purge docker-ce

別のバージョンのインストールは

$ apt-cache madison docker-ce

で、欲しいバージョンを探した上で

$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

<VERSION_STRING>が欲しいバージョンで、例えば「5:18.09.1~3-0~ubuntu-xenial」という形式で指定します。

詳しくは公式サイトをご覧ください。

クライアント側でdocker-machine

続いてクライント側にdocker-machineをインストールします。古いdocker-machineでは、実行する命令がdocker daemonを用いたものになっているため、最新のdocker-ceをインストールしているとコケます。これでハマりました。

インストール方法は公式サイトをご覧ください⇒公式サイト

ここでは公式サイト記載の内容(2019/7/24時点)のコマンドだけを抽出して記載しています。

$ base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo install /tmp/docker-machine /usr/local/bin/docker-machine
$ docker-machine version

これで、…0.16.0…と表示されれば狙い通りです。

この状態までくれば、docker-machineをgenericで正常終了させられるはずです。

docker-machine -D create -d generic --generic-ip-address IPアドレス --generic-ssh-user ユーザ名 好きな名前

createの前に-Dをつけると、デバッグ機能的に処理内容を出力しながら実行します。コケたときに役立つはずです。

SSHのポートを22から変えている場合は別途指示が必要です。方法は、公式サイトを確認ください。

おまけ

今回の件で、Twitterに右往左往していた当時の様子があります。

このツイートに一連の流れが乗っています。誤った判断をしている部分もあるので、見るなら全部目を通すことをおすすめします。

今回のブログはこのツイートをベースにまとめ直しています。

参考

  • https://qiita.com/yuyalush/items/0b0e7aa0da123075bbb7
  • https://teratail.com/questions/119697
  • https://qiita.com/yukari-n/items/d1b17bd37036f120153c
  • https://nishinatoshiharu.com/initial-vps-security-settings/
  • https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7