復習を兼ねて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鍵の生成・公開鍵の転送については、公式を見ると分かりやすい:
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が詳しい:
先頭でも述べたが、docker-machine
は他にも色々ドライバーがあるのでそれらの1つを使うとものすごく楽だと思う。ここでは詳しく書かない。docker-machine create driver conoha
などで検索すればわかるはず。
今回の方法でもそこまでは大変ではないのでいいとは思う。
以上です。
広告