VPS上のcentosにDockerをdocker-machineでセットアップ

復習を兼ねてVPS上でDockerをセットアップする。

本当はdocker-machineの対応ドライバで簡単にセットアップできるが、方法を思い出しておきたいのもあって、defaultドライバでセットアップを行う。

その手順をメモしておきたい。

更新事項

  • 2022/10更新: 変更したsshポートをfirewallに設定するコマンドを追記した。

環境

  • centos7
  • docker-machine version 0.16.2
  • VPSはconoha
  • ローカルではmacOS使用

Docker導入前にすること

Docker以前に準備しておかなければならないことを書いていく。なお、VPSはサーバー立ち上げ済みで、OSはcentos7を選択した。

VPS上でユーザーの作成など

最初に、VPS上でユーザーを作成しておく。conohaのブラウザコンソール上で行なった。

# in VPS
# ユーザーの作成
$ useradd USERNAME
# パスワード設定
$ passwd USERNAME
# 後々のため、USERNAMEをwheelグループに所属させる
$ usermod -a -G wheel USERNAME

rootではないユーザーを作成し、それで操作する。

ローカルで秘密鍵・公開鍵の作成とVPSへの転送(不要かも)

次に、ローカルでRSAの秘密鍵・公開鍵を作成して、VPSに公開鍵を移しておく。既存のを使い回すのはやめておく。

# in local
$ ssh-keygen -t rsa -b 4096
# ファイルパスとパスフレーズを指定するよう促される
# ~/.ssh/id_rsaを作成したとする。(~/.ssh/id_rsa.pubも一緒に作成される)

# 作成した公開鍵をVPSへ移す。
$ ssh-copy-id -i ~/.ssh/id_rsa <USERNAME>@<HOST>

SSH鍵の生成・公開鍵の転送については、公式を見ると分かりやすい:

What is ssh-keygen & How to Use It to Generate a New SSH Key?
Ssh-keygen is a tool for creating new authentication key pairs for SSH. Such key pairs are used for automating logins, s...

docker-machineで鍵を転送してくれているようなので、この段階は不要かもしれない。 しかし、ブラウザのコンソールは若干使いづらいので個人的にはこの手順を踏んでもいいとは思う。どこでも使えるのは便利ではある。

リモートログインするときは、

# in local
$ ssh -i ~/.ssh/id_rsa <USERNAME>@<HOST>
# -iオプションの指定は以下を事前に実行しておけば、省くことができる
$ ssh-add ~/.ssh/id_rsa

でパスフレーズを入力すればログインできる。

なお、パスフレーズはssh-addを事前に実行して-iオプションも含めて省略できる。(2022/10追記)

以降のVPSでの操作は上コマンドでローカルからログインして行なっている。

パスワードログインの停止

続いて、セキュリティ向上のため、SSHでパスワードログインをできないようにしておく。

# in VPS
# SSHでのログインを制限
$ vim /etc/ssh/sshd_config
...
PermitRootLogin no
PermitEmptyPasswords no
PasswordAuthentication no
# 以下はもしyesだと上の設定の意味がないようなのでnoであることを確認する
ChallengeResponseAuthentication no
...

# sshdをリスタート
$ service sshd restart

これでアクセス手段が公開鍵方式のログインに限定される。

必要なポートを解放

docker-machineが使う2376ポートを開けておく必要がある。ついでにSSHに使うポートも22から他のものへ変更するのもいいだろう。(ここでは22ポートについては割愛)

firewall-cmdにおけるsshサービスのポートに新しいssh用ポートを追加する例を追記した。初期の22ポートはそのままにしても削除してもいいと思う(削除するなら--remove-port 22/tcpにて)。(2022/10追記)

# in VPS
$ sudo firewall-cmd --permanent --zone=public --add-port 2376/tcp
# add ssh port for ssh service
$ sudo firewall-cmd --permanent --service=ssh --add-port <new_ssh_port>/tcp
$ sudo firewall-cmd --reload

sudoersを編集

docker-machine createでは、パスワードを求められる処理も行うので、その確認で処理が止まってしまうことがある。 エラーメッセージで気づくことはできるが、処理を停止してくれるまで時間がかかるので、先に対処しておいたほうがいい。

コマンドの実行でパスワードの確認が入らないようにsudoersを編集しておく。 ユーザー単位で変更するのはあれなので、wheelグループを利用するのが一般的作法。そのために、上の方でwheelグループにUSERNAMEを入れた。

編集にはvisudoを使うのがルール。保存時に構文チェックしてくれる。

# in VPS
$ sudo visudo
...
## Allows people in group wheel to run all commands
#%wheel ALL=(ALL)       ALL  # この行はコメントアウト

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL  # この行はコメントアウトを外す
...

createが終われば不要なので、戻す(後述)。

Dockerを用意する

docker-machine createコマンドでDockerのインストールもしてくれるようなので、設定がうまくいっていれば下記のコマンドで準備完了になる。はず。もしエラーが発生して処理が完了しなければ、その時のエラーメッセージを読み解き、必要であればそれをウェブ検索などして解決する。

# in local
# 指定IPアドレスのサーバーをセットアップ
$ docker-machine create -d generic --generic-ip-address <IP_ADDRESS> --generic-ssh-user <USERNAME> --generic-ssh-key <SSH_KEY_PATH> --generic-ssh-port <SSH_PORT> <MACHINE-NAME>

<USERNAME>は最初の方で作成したユーザーネーム。rootを指定するのは好ましくない。

<SSH_KEY_PATH>は上の方で、~/.ssh/id_rsaとしたもの。docker側でローカルの~/.docker/machine/machines/にコピーしてくれる。docker-machin ssh <MACHINE_NAME>でサーバーにログインする時にも使われる。

<MACHINE-NAME>docker-machine lsなどで表示されるホスト名。_が使えない。Allowed hostname chars are: 0-9a-zA-Z . -となるのでこれらが有効な文字のようだ。

途中で失敗して原因を修正してから、もう一度トライするときは、docker-machine rm <MACHINE-NAME>で削除する必要があるので、間違って消してはいけないものを消さないように注意。

後片付け

ユーザーをwheelグループに入れたが、セットアップ完了後はもう不要になるはずなので、USERNAMEの所属グループを直し、visudoを戻す。

# in VPS
# rootでやったほうがいいと思うので、rootユーザーに変更
$ su -
# グループからUSERNAMEを取り除く
$ gpasswd -d USERNAME wheel
# sudoersを戻す
$ visudo
...
## Allows people in group wheel to run all commands
%wheel ALL=(ALL)       ALL  # アンコメント

## Same thing without a password
#%wheel  ALL=(ALL)       NOPASSWD: ALL  # コメントアウト
...
# rootを抜ける
$ exit
# 元のユーザーをログアウト
$ exit

後々もし必要と判明すれば、もう一度設定する。

動作確認

最後にDockerが動くか確認する。hello-worldする。

# in local
# docker環境をセットアップ
$ $(docker-machine env <MACHINE-NAME>)
# hello-worldイメージを走らせる
$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
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.
    (amd64)
 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 ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

ヨシ。

Tips

見慣れないコマンドをみることもある。そういうときは、man <command>でマニュアルを読んでおこう。 見慣れないオプションなども同じだ。 解説が載っているはずなので、じっくり読んでみるべき。

大体のVPSがそうだとは思うが、サーバーをシャットダウンすればイメージが保存できる。これを利用すれば、復元が面倒な作業も大胆に実行できて便利だと思う。私はイメージの保存はしてみたが再構築は行わなかったので、機会があれば使ってみるのもいいと思う。

もし必要なら、他のポートの開放なども行えば、大体のVPSの用途はできるんじゃないかと思う。 firewalldの公式docsが詳しい:

Documentation
Welcome to the firewalld project homepage! Firewalld provides a dynamically managed firewall with support for network/fi...

先頭でも述べたが、docker-machineは他にも色々ドライバーがあるのでそれらの1つを使うとものすごく楽だと思う。ここでは詳しく書かない。docker-machine create driver conohaなどで検索すればわかるはず。 今回の方法でもそこまでは大変ではないのでいいとは思う。

以上です。


広告

Bitly
タイトルとURLをコピーしました