VPS上のDockerで複数サービス運用(MezzanineとかShinyとか)
arakaki docker 2018-09-19 7 のコメント

はじめに

はじめましてarakakiです。

このサイトはプログラミングを学び始めた私がアウトプットする場所として作られました。

そのための要件と対応は以下のとおりです。

■ 自分でサーバーから立てる → VPS
■ 学習用のため、とにかく安く → WebARENA
■ 色々な言語・ツールで様々なサービスを追加できる → docker
■ 主にブログメイン → Mezzanine

 

図にするとこんな感じ。見づらくてスミマセン…

当サイトの構成

 

今回はブログ1本目の記事ということで、当サイトの構築と構成をざっくりまとめていきたいと思います。それぞれの詳細については、記事を改めてまとめる予定です。

 

 

破格のVPS!WebARENA

さて、VPSを探そうとなったらまっさきに出てくるのがさくらのVPSですね。今年の5月にはさくらのレンタルサーバーがより早くなったということで、そのプロモーションムービーである「はやいよ、さくらちゃん」シリーズが話題にもなりました。ということを今調べて知りました。さくらちゃんかわいい。

そんなさくらちゃんを差し置いて私が選んだのはWebARENAというところです。正直聞いたことありませんでしたが、とにかく安い。メモリ 512MBプランで360円(税抜)/月

VPSクラウド 初期料金無料・月額360円~|VPS(仮想専用サーバー)はWebARENA

WebARENAは泣く子も黙るNTTグループに属するNTTPCが運営するサービスなのだそうですがNTTPC自体法人契約がメインターゲットのようなので(申し込みフォームも法人前提の作り)、個人での利用者はそれほど多くないのかも知れません。

とはいえこの料金は魅力的ですし、今のところコントロールパネルの使用感や通信には全く問題ありません。しかも、WebARENAでは“VPS クラウド“と銘打っているように、定額利用のVPSとスケーラブルなクラウドのいいとこ取りのようなサービスとなっているのが面白いです。詳しくはこちら(外部)の記事で紹介されておりますので、今後の選択肢の一つとしてご検討してみてはいかがでしょうか。

 

 

Dockerの導入

ようやく本題ですが、Dockerの導入自体はそんなに難しくありませんし、既に巷間では多くの紹介記事があります。私は下の記事を見ながらインストールしてみました。公式ドキュメントの参照も忘れずに。

上のさくらのナレッジ記事中でdevicemapperについてがよく分からなかったのですが、Device Mapper ストレージ・ドライバの使用 — Docker-docs-ja 17.06.Beta ドキュメントでは以下のように説明されています。

当初の Docker は、Ubuntu と Debian Linux 上で AUFS をストレージのバックエンドに使っていました。(略)残念ながら、AUFS は Linux カーネル上流のメインラインではないため、RHEL は AUFS を扱いませんでした。

(略)

Red Hat 社は Docker 社と協同で新しいドライバの開発に取り組みました。この協調の結果、ストレージ・バックエンドの取り付け・取り外しが可能な(pluggable)Docker エンジンを再設計しました。そして、devicemapperは Docker がサポートする2つめのストレージ・ドライバとなったのです。

なるほど、分からん。ちなみにこの引用はDocker ドキュメント日本語化プロジェクト — Docker-docs-ja 17.06.Beta ドキュメントからですが、公式ではDocker 1.13のアーカイブドキュメントに該当箇所があります(Docker and the Device Mapper storage driver | Docker)。

それで結局これはなんなのか、というと「ストレージドライバである」という答えになるわけですが、では「ストレージドライバとは?」については最新(v18.03)のドキュメントでも詳しく説明されています。要するに「imageやcontainerのlayerを管理するツール」ということなんでしょうが、む、難しい…。今後理解を深めていきたいと思います。

で、そもそもなぜDockerかということなんですが、「vps 複数サービス」とかで検索するといくつかDocker関連の記事がヒットします(本記事もその末席に名を連ねるものです)。そこで紹介されてた構成がまさに私の理想とする形でして、特にサービスを追加・削除するのが容易という点が決め手になりました。以下参照記事のいくつかを。

特に3つ目の複数のWebアプリを〜ではリバースプロキシ(+SSL対応)の解説が大変参考になりました。というかほぼパクりました。この場を借りてお礼申し上げます。

今改めて検索するとこんな記事もあります。図がキレイですね。見習おう…

Dockerを使う利点はいくつもありますが、特にプログラミング初学者としては以下のようなメリットを感じました。

   

「作って壊す」が容易

何をするにも最初のうちは、勝手が分からずに色々設定をイジってみたり手当たり次第に試してみたりと環境がごちゃごちゃしがちです。(ですよね?)

その点Dockerではコマンド一つでまっさらな環境を作るので、VPS自体の環境を汚さずに何度でもやり直すことができます。 

主要なLinux OSを試せる

サーバーサイドでの開発において、Linuxが扱えることは必須だと思います。私もローカルではUbuntu・Debian、当サイトはCent OSといった感じで触れてはいるのですが、やはりいじり倒したいと思ったときにDockerは最適です。というのも、各Linuxディストリビューションが公式でDockerイメージを配布しているのです。

最後のalpineは聞き慣れないかもしれません。私も初耳だったのでgoogle翻訳すると「高山」と出てきました。なんのこっちゃと思って公式サイトを見ると、文字通り高山でした。語源はalps(アルプス)ですが読みは「アルパイン」らしいです。

で、そのAlpine Linuxはなんといっても軽量でDockerコンテナのベースイメージとして絶賛注目されている様子。主要OSSのオフィシャルイメージでもDebianベースとAlpineベースの両方が提供されてたりします。

ちなみに、alpineイメージでは標準UNIXコマンドにbusyboxを使っているのですが、そのbusyboxのオフィシャルイメージも提供されてたりします。

諸々の詳細は別記事に譲りますが、とにかく新しいOSとの出会いで知見を広げられるというのもDockerの魅力の一つのような気がします。 

依存関係の明確化

既に述べたとおり、上のOSイメージを指定してcontainer runするとまっさらな環境が作られます。特定のOSSのオフィシャルイメージであれば、最初からそのソフトウェア(だけ)が入っています。という訳で、当然ながら自分でカスタマイズしようと思うとその環境を構築しなければなりません。

他方で、コンテナイメージは軽量化したいわけです。ビルド時にしか使わないツールなどは削除して、動作するのに必要なライブラリーだけがあればよい。そういった検討を行い、最終的にdocker fileに落とし込むという作業を経ることで、自然と依存関係についての理解が深まります。(はず…です。私はまだそこまでの推敲ができてません…)

 

 

各コンテナ概観

さてさて、本記事はあくまでもイントロ的存在なので、最後に現在動いているコンテナを概観して締めようと思います。

(他の方々の記事を紹介しただけのようになってしまいました…今後頑張ります!)

 

jwilder/nginx-proxy - Docker Hub
jrcs/letsencrypt-nginx-proxy-companion - Docker Hub

既に少し触れましたが、jwilder/nginx-proxyは同一ネットワークに属するコンテナを自動検出してリクエストを振り分けてくれます。jrcs/letsencrypt-nginx-proxy-companionjwilder/nginx-proxyと連動して、これまた自動でSSL証明書を割り当ててくれます。

と書いてみたはいいものの、ほとんど参考にした記事の受け売りです。とにかく便利だ、ということは実感しているところですが、それ以前の不便さを経験していないのでなんとも言えません。やはり人様が作ったものをよく分からず使っているのは気持ち悪い(消化不良という意味で)というか情けないというかよろしくないので、今後しっかり理解した上で一つのコンテナにまとめるなど自分なりにアレンジしてみようと思います。

参考

 

Nginx + uwsgi + Mezzanine

当サイトのメインコンテンツでarakaki.tokyoのドメインが割り振られています。pythonのオフィシャルイメージをベースにして、ウェブサーバーとしてNginx、アプリケーションサーバにuwsgi、そしてDjangoベースのCMSであるMezzanineをインストールしてあります。

正直、一つのコンテナに十把一絡げにしてしまうのはDocker的にどうなのという感じはします(し、データベースは全く触ったことがなかったのでサーバなど立てずにSQLiteで済ませてしまってます)が、Djangoではstaticファイルをウェブサーバーから直接取りに行かせたり(他のフレームワークはどうなのかしら)、ウェブサーバーとuwsgi間ではポート間通信よりもunixドメインソケットの方が速い(らしい)などの事情から、あえてコンテナを分けずにこんな感じになりました。イマイチ正解が分かりません。

さらに白状すると、このコンテナはまだdocker fileに落とし込めてません。コンテナ内での手作業の部分を多く残したまま公開に至っているので、今後早急に手直ししたいと思ってます。

といってもなかなか腰が重い自分自身に発破を掛けるため、以下途中段階でなんとも恥ずかしいdockerfileを載せておきます。

FROM python:3.6-alpine3.7
RUN apk --no-cache add \
        # dev dependencies
        nginx \
        vim \
        tree \
        gcc \
        linux-headers \
        libc-dev \
        sudo \
        # Pillow dependencies
        jpeg-dev \
        zlib-dev \
        freetype-dev \
        lcms2-dev \ 
        openjpeg-dev \
        tiff-dev \
        tk-dev \
        tcl-dev \
        harfbuzz-dev \
        fribidi-dev \
        \
        && pip install mezzanine \
        uwsgi \
        #&& mkdir /run/nginx && touch $_/nginx.pid && echo 1 > $_
        && mkdir /run/nginx && touch /run/nginx/nginx.pid && echo 1 > /run/nginx/nginx.pid
    
CMD sh 

nginx.pidらへんの記述がいきあたりばったり感が否めませんが、今後これを精査して、vps側で永続化しているプロジェクトファイルを適切にマウントして、nginxの設定ファイルのリンクを通して、CMDではnginxとuwsgiを起動させて…等々。

dockerfileだけでなく、mezzanineとuwsgiとnginxの連携でハマった箇所も多々ありますし、mezzanineのテンプレートの編集なんかも含めて、ちゃんとまとめようと思います。

 

shiny-server

shinyはRで簡単にインタラクティブなウェブアプリケーションを作成できるパッケージです。と説明するより実物を見てもらったほうが分かりやすいかと思います。ものによってはだいぶ動きがもっさりしてますが仕様です。

Shiny - Gallery

現時点ではrocker/shinyをrunして動くことが確認できたぐらいの段階で、shiny.arakaki.tokyo/test/ではチュートリアルの最初の最初みたいなのを公開してます。

RやShinyに関してはマニアックな先人達の様々な知見が蓄積されているので、彼らに倣って学習・開発を進めつつ、pythonの可視化ツールと比較などもやっていきたいと思います。

 

 

今後の課題

本記事では自己紹介のようなつもりで当サイトの構成をみてきました。改めて読み返しても、誰かの役に立つような情報はほとんどないですね。ここまで読んでいただいた方には申し訳ないです…。

追々各トピックスごとに詳細をまとめていく予定なので、今後の活躍にご期待ください!

というわけで今後やることを思いつくまま挙げてみます。というか課題しかありません。

  • VPSのセキュリティ関連
    • ログ監視とか侵入・改ざん検出とか
  • Mezzanine関連
    • dockerfileをいい感じにする
    • テンプレートをいい感じにする
    • Djangoについての学習▶urls.pyや処理を書けるようになる
  • Shiny関連
    • そもそもRの学習
    • Shiny-serverのランディングページをいい感じにする。(ディレクトリ内が丸見え)
  • サイト運営
    • PWA対応
    • Google Search Consoleとか
    • amazonの広告載せたい

コメント

承認待ちのコメント 6 年, 3 ヶ月 前

承認待ちのコメント 4 年, 2 ヶ月 前

承認待ちのコメント 3 年 前

承認待ちのコメント 2 年, 11 ヶ月 前

承認待ちのコメント 2 年, 8 ヶ月 前

承認待ちのコメント 2 年, 5 ヶ月 前

承認待ちのコメント 2 年, 4 ヶ月 前

新しいコメント

必須

記入が必要です(公開はされません)

オプション

© 2018 あらがきじゃなくてあらかき
arakaki.tokyo