ConoHaのVPSにdockerを入れる

2021年5月23日

前回までにssh ユーザー名@elephantcat.workみたいなことができるようになりました。

次はVPSで新しいサービスを稼働させるべく、dockerを入れます。

なぜdockerか

VPS(Ubuntu)で新しいサービスを動かすなら、直接Ubuntuで動かせばいいのでは?とお思いかもしれません。例えばWebサーバーを入れたいなら、Ubuntuに直接apacheなりのパッケージを入れればいいわけです。メモリが少ない中、あえてdockerのようなコンテナを使っても使用メモリが増えるだけでは?と思ってしまいます。

メモリについてはそのとおりなのですが、例えばapacheを入れて脆弱性を突かれてサーバーで任意のコードを実行できた状況を仮定します。Ubuntuに直にパッケージを入れた場合、任意のコードはUbuntu内のあらゆるリソースにアクセス可能です。もちろん権限とかで制限はできますが、乗っ取られた権限次第です。しかしコンテナ内でapacheを動かしていたなら、コンテナの外のリソースにはどんな権限でも予め決められたアクセスしかできません。

つまり、コンテナ内でサービスを動かした方がセキュリティ的には強固になりやすいからdockerを使う、これが1つの理由です。

もう1つの理由は、ローカルの開発環境と合わせやすいから、です。ローカルの開発環境でもdockerを使用すると、そのdockerイメージや設定はサーバー上だろうと同じアーキテクチャのPCならどこでも同じように動かせます。例えばConoHaのVPSからAWSのEC2に引っ越しとかもdockerなら容易に可能なわけです。また、UbuntuならUbuntuといったディストリビューションのパッケージバージョンに引きずられることもありません。

そして、デメリットに挙げられたメモリ消費量の増加もdockerのようなコンテナなら、必要最低限に抑えられます。例えばVM自体を仮想化して動かすなら大量に消費しますが、カーネルを共通化=コンテナ内でプロセスが動くだけなら各プロセスの消費量は変わらず、コンテナ用の+αの消費があるだけになるだけということです。

あとはコンテナの中でdockerを選ぶ理由ですが、これは単に流行ってるから、というだけです。

dockerのインストール

リポジトリの追加とインストール

VPSはUbuntuを入れたので、

https://docs.docker.com/engine/install/ubuntu/

に従ってインストールするだけです(community editionのstable)。

$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

これでdockerのインストールは完了です。

ユーザー権限でdockerコマンドを使えるようにする

これはセキュリティを考えるとあまりよくありませんが、スクリプトからdockerコマンドを使う場合など、利便性は結構上がります。

https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user

に従って設定するだけです。

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

一度ログインし直してから

$ docker run hello-world

で確認できます。確認できたら、

$ docker ps -a

でhello-worldのコンテナIDを確認してから、

$ docker container rm コンテナID
$ docker image rm hello-world

でゴミが消えます。

docker-composeのインストール

pythonのスクリプトなので、なくても生活できるはずなのですが、現状の私の環境では全ての環境がdocker-compose.ymlに依存してるので重篤です。

https://docs.docker.com/compose/install/

に従ってインストールするのが本当は正解なのですが、私なぜかaptでインストールしてました。

$ sudo apt install docker-compose # 公式ではありません

てっきりdocker公式のリポジトリからインストールしてるのかと思ったら、そこには存在しておらず、ubuntuのリポジトリからインストールしていました。これはいずれちゃんとした調査が必要かもです。

ただ今のところ動作に支障はありません。

まとめ

一部公式の手順でないところがあり、調査を保留してる部分がありますが、dockerを動かせる状態になりました。

次回はdockerで何かのサービスを立てようと思います。