shipyardというswarmをベースにしたdockerフロントエンド環境がなかなかにイケてたので、IDCFのワンコインIaaSでサクッと”使える”docker環境を作る手順をまとめてみました。デモやトレーニング、あるいはちょっとしたサーバー用途でも使いやすいかな、と思っています。
目標とする環境
- OSはubuntu 16.04.1 LTSを使う
- 個人的に、ですが、しばらく専らCentOSを使っていたのですが、firewalldが如何とも肌に合わないので最近ububtu推進中です。
- dockerは最新版(1.12)を使う
- 新しい版のほうがいろいろ機能が充実していますので、dockerサイトから新しい版を入れます。
- shipyardを入れる
- 思った以上に使い勝手が良いです。セキュリティ面の調整などしてみます。
ubuntu 16.04.1 LTS on IDCF IaaS
まずはIDCFのワンコインIaaSでubuntu 16.04.1 LTS環境を作ります。このバージョンは2016/10/14現在、まだイメージもISOも提供されていませんので、イメージを登録(ダウンロード)してインストールします。イケてるdocker環境にするため、LVM領域を作りますので、インストーラでパーティション構成を変更してセットアップするためISOから起動します。
IDCFの申込方法等は割愛します。不正利用対策のためか、いろいろ事前審査が大変で、使い始めるまでに2日くらいかかりました。
ISOイメージの準備
ubuntuのISOイメージをまずは登録します。「コンピューティング」→「ISO」→『ISO作成』を選択し、Ubuntu 16.04.1 LTSのイメージURLを指定して、ISOを作成します。
イメージのダウンロードからフォーマット変換などを経て、ISOの登録が完了するまでしばらくかかりますので、気長に待ちます。準備が完了すると、完了表示に変わります。
IaaS環境の作成
登録したISOイメージからOS環境を作ります。ポイントは、LVMの空きを作ること。あとからファイルシステム縮小で容量を空けるのはなかなかに骨が折れますので、インストール時にパーティション構成を調整します。
「仮想マシン作成」を選び、スペックを選んでいきます。マシンはもちろんlight.S1、イメージとして先程登録した「Ubuntu 16.04.1 LTS」、ルートディスクは15GBにして、合わせて500円の環境を作ります。SSHキーは適当でも大丈夫です。どうせインストール過程で非rootアカウントを作ってこれを使うことになります。マシン名やグループは適当に。あとは特に触らず作成開始します。
しばらくすると、ステータスが「Running」になりますが、当然OSはまだインストールされていない状態になりますので、サーバー名のリンクをクリックして「コンソール」→「コンソールアクセス」でコンソール画面を開きます。そうすると、インストール画面にアクセスできますので、ここからUbuntuのインストールを進めて行きます。
インストーラは英語で進めることもできるんですが、Locale設定が後々面倒なのでなるべく日本語を選べるところは日本語を選んでいきます。「Ubuntu Serverをインストール」で、普通にインストールを行います。IDCF IaaSはDHCPでホスト名とプライベートIPが降ってくるので、ネットワーク設定は特に気にすることはありません。流石にlight.S1はここはあまり速くありませんので、優しい気持ちで進めましょう。
非rootユーザーの作成やら時刻設定やら進めていくと、パーティション設定メニューに来ますので、ここで「手動」設定を行います。
15GBアサインしたrootボリュームを選択して、個別設定を進めます。
ちょっとここはメニュー操作にコツがありますが、以下のような感じで。
- まず「空き領域」を選択
- 「新しい領域」を選んで、/boot用の500MBのext2パーティションを作ります。
- 予約領域5%が勿体無いので、ゼロにします。
- 起動オプションを「オン」にします。
- 「新しい領域」を選んで、全量でLVM領域を作ります。
- 「論理ボリュームマネージャの設定」を行います。ここでパーティション情報の書き込みが必要になります。
- 「ボリュームグループの作成」を行います。名前は「vg0」くらいにします。先程作成したsda2を選択します。
- 「論理ボリュームの作成」を選択し、名称を「swap」としてswap領域を作ります。容量はメモリ量に合わせて1GBにします。
- 「論理ボリュームの作成」を選択し、名称を「root」としてroot領域を作ります。ここで容量を8Gにします。
- 「完了」で論理ボリュームマネージャーを抜けるとパーティショニング画面に戻ります。
- root用に作った8GBの領域を選んで、パーティション設定を行います。
- 利用方法を「利用しない」から「ext4」にします。
- マウントポイントを「/」(root)にします。
- マウントオプションでは「relatime」をチェックしておきます。
- 予約領域を「1%」にします(結構5%は馬鹿にならない)
- swap用に作った1GBの領域を選んで、パーティション設定を行います。
- 利用方法を「利用しない」から「スワップ領域」にします。
細かなところは適当に調整して良いと思いますが、兎に角LVMに空きを残して、あとでdocker devicemapperで使えるようにしておきます。
パーティション情報の書き込みが行われ、OSインストールが開始されますので、しばらく待ちます。途中、いろいろ聞かれますが、「ソフトウエアの選択」で「OpenSSH Server」を有効にしておくだけで良いと思います。最後にgrubのセットアップ(マスターブートレコーダーへのセットアップ)が完了すれば、OSインストールは完了です。
IaaS環境の初期設定
いろいろとチューニングするところはあるんですが、まずはセキュリティ関連だけ整備しておきます。
IDCF IaaS環境への外部からのアクセスは、デフォルトで1つ付与されているグローバルアドレスからのforwardで行いますので、「仮想マシン」の「IPアドレス」設定から、ファイヤーウォールとポートフォワードで必要なサービスのアクセスを開けていくことになります。まずは管理に必要なSSH(tcp/22)を開けておきます。ちなみにこのIPアドレス設定は、IaaSサーバーを削除(再作成)すると、フォワード設定だけが消えてファイヤーウォールは残ります。
インストール過程で作成した非rootユーザーを用いて、SSHでログイン(パスワード)を行います。すぐに、ssh公開鍵を設定して、パスワードログインを不可にします。
公開鍵をauthorized_keysに追記します。Ubuntu 16.04は従来のRSAに加えてecdsa等の新しい暗号化方式にも対応しますので、これらが使えます。
server:~$ mkdir .ssh server:~$ cat > .ssh/authorized_keys ecdsa-sha2-nistp521 AAAAE2VjZHNh.....LXNoYTItbmlzdHA1MjEAAAA.....IbmlzdHA1MjEAAACFBAHJOt server:~$ chmod 600 .ssh/authorized_keys server:~$ chmod 700 .ssh
sshdはsystemdによって管理されています。
server:~$ sudo vi /etc/ssh/sshd_config ... # Change to no to disable tunnelled clear text passwords #PasswordAuthentication yes PasswordAuthentication no ... server:~$ sudo systemctl reload sshd server:~$ sudo systemctl status sshd
確認として、rootユーザーを指定してsshログインして、「Permission denied (publickey).」と表示されれば、パスワード認証が無効になっています。
タイムゾーンや言語設定等はイントール時に設定しているので特に操作する必要はありません。最後に、パッケージの最新化を行い再起動して終了です。
$ sudo apt update $ sudo apt upgrade -y $ sudo reboot
dockerセットアップ
Ubuntu環境にdockerをセットアップしますが、デフォルトではストレージがloopbackファイルを用いたあまり性能の良くないものになってしまうため、LVMを用いたdevicemapperを使用します。
まずは、docker.comの手順に従い、dockerをインストールします。
$ sudo apt-get install apt-transport-https ca-certificates $ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D $ echo deb https://apt.dockerproject.org/repo ubuntu-xenial main | sudo tee /etc/apt/sources.list.d/docker.list $ sudo apt-get update $ sudo apt-get purge lxc-docker $ apt-cache policy docker-engine $ sudo apt-get update $ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual $ sudo apt-get update $ sudo apt-get install docker-engine
dockerのdevicemapperで使うThin Logical Volumeを作成します。
$ sudo lvcreate -L4G -T -n dockerdata vg0 Logical volume "dockerdata" created. $ sudo lvs -a LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert dockerdata vg0 twi-a-tz-- 4.00g 0.00 1.27 [dockerdata_tdata] vg0 Twi-ao---- 4.00g [dockerdata_tmeta] vg0 ewi-ao---- 4.00m [lvol0_pmspare] vg0 ewi------- 4.00m root vg0 -wi-ao---- 7.45g swap vg0 -wi-ao---- 952.00m
dockerの起動オプションを変更して、LVMを使うようにします。systemdの設定ファイルdocker.serviceの起動コマンドを変更します。
$ sudo vi /lib/systemd/system/docker.service ... #ExecStart=/usr/bin/dockerd -H fd:// ExecStart=/usr/bin/dockerd -H fd:// --storage-driver=devicemapper --storage-opt dm.thinpooldev=vg0-dockerdata ... $ sudo systemctl daemon-reload $ sudo systemctl stop docker $ sudo systemctl start docker $ sudo systemctl status docker
これでdockerがLVMを使うようになりました。
$ sudo docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 1.12.2 Storage Driver: devicemapper Pool Name: vg0-dockerdata Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB ...
一般ユーザーでdockerが使えるよう、自分のアカウントにdockerグループを付与しておくと便利ですが、ここはセキュリティの考え方もあるので適宜設定してください。「docker run hello-world」が動けばOKです。
shipyardインストール
ここからが実はメインだったりするのですが・・・shipyardをセットアップします。shipyardをインストールすることでswarm環境が構成され、GUIでの操作が可能になります。
ズバリ、「Deploy」のページにある、Automatedのコマンド一発で終わりなんですが、Manualのページに書いてある内容を一度は読んでおいたほうが良いです。内部で何が行われるか分かります(tcpソケットを有効にしておくと失敗するとか・・・)。
$ curl -sSL https://shipyard-project.com/deploy | bash -s
これでtcp/8080でshipyardが動き出して、ログイン、操作が可能になります。非常に簡単です。
この画面へのアクセスですが、このままインターネットからアクセス可能にすると、デフォルトアカウントでログイン出来る状態になってしまうため、sshでポートフォワーディングしてアクセスすることをお勧めします。
$ ssh server -L 8080:localhost:8080 -g
これで、クライアント端末で「http://localhost:8080/」にアクセスすることで、shipyardの画面が開きます。ユーザー名とパスワードはデフォルト状態で、インストールスクリプトの最後に表示されるものです(あまりに安易なのでここでは書きたくない)。
ユーザー管理
shipyardは初期状態ではデフォルトの管理者アカウントが1つあるだけです。この状態は危険なので、管理者アカウントの作り直しをします。
画面から行う場合、「ACCOUNTS」タブを開きます。ここからアカウントの追加、削除、パスワードを含めた情報変更ができます。
roleはAdministratorを含め特定のオペレーションのみの権限など複数の定義があり、1つのユーザーに複数の権限を付与することで、様々な権限のアカウントを作ることができます。既存アカウントの情報変更は、虫眼鏡アイコンを押して変更します。
これでセキュリティを高めることもできました。だからと言ってインターネットに晒して大丈夫か?というと微妙なので、基本的にはSSH port forwardingでの操作がお勧めです。SSLやクライアントキー、MFA等に対応してくれると嬉しいような気もしますが(最近MFAが増えすぎてしんどかったりする)。
Shipyardでのdocker操作
コンテナの作成
これでdockerコンテナ環境をGUIから操作できる環境ができましたので、早速コンテナを作ってみます。
コンテナ作成は「CONTAINERS」から「Deploy Container」を操作します。
項目を見ると、再起動ポリシーの設定まで含め、ほぼdockerコマンドで指定できる項目は網羅されているようです。
コンテナの操作
コンテナページの右端のメニュー、または虫眼鏡を押して開いたコンテナ毎の画面から、コンテナの操作ができます。
これも殆どこのメニューからできそうな勢いです。Scaleも可能です。StatsはCPU使用率等の稼働状況が見れますが、長期の統計が見れるわけではなく、topコマンドのように、現時点での状態と、このStats画面を開いてからの傾向が蓄積されて表示されます。
このメニューの中で、特に重宝するのが、LogsとConsoleです。このConsoleだけのためにShipyard使っても良いくらいだと思っています。
ブラウザ上で、docker execができます。フォントがプロポーショナルだったりするのが若干気持ち悪いですがdocker machineに直接ログインしないでここまでの操作ができるというのは非常に便利です。
その他のメニュー
その他にも、IMAGES、NODES等のメニューがあり、docker swarmの機能を一通りWebから操作できます。非常に便利です。個々のオペレーションは割愛します。
API
そしてshipyardはJSON APIにも対応します。若干、痒いところに手が届いてないコマンドもありますが、概ね必要な操作はshipyard経由でできそうです。APIドキュメントを読めば手順はそれほど難しくありません。認証回りだけ、ちゃんと押さえてしまえば、あとはcurlコマンドで自由自在です。
- 認証には、ServiceKeyまたはAuthTokenのいずれかが必要
- AuthTokenの払い出し(初回のみ)はauth/loginにより取得
- ServiceKeyの払い出しはAuthTokenからapi/servicekeysで取得
AuthTokenを使う場合、ヘッダにユーザー名を付与する必要がありますが、ServiceKeyはユーザー名がありません。
$ curl -d '{"username":"admin","password":"xxxxxx"}' http://10.0.0.1:8080/auth/login $ curl -H 'X-Access-Token: admin:xxxxxxxxxxx' http://10.0.0.1:8080/api/servicekeys $ curl -H 'X-Access-Token: admin:xxxxxxxxxxx' -d '{"description":"TEST KEY"}' http://10.0.0.1:8080/api/servicekeys $ curl -H 'X-Service-Key: yyyyyyyyyyyy' -d '{"username":"test","password":"pass",{"name":"admin"}}' http://10.0.0.1:8080/api/accounts
これくらいのテンプレートがあれば、あとはなんとかなります。
これはお手軽で使い勝手の良いdocker環境だ
という感じで、IDCFのワンコインIaaSでのdocker環境作成からshipyardの操作までまとめてみました。まぁ、何も考えずに手順流して作れば、おそらく10分とかからずできそうなものですが、ちょっとカッコ良くしてみたと。LVMベースのdockerってやっぱり速いと思うし。
この環境、簡単なデモ環境やトレーニング環境に使うには非常に良いと感じています。もちろんちょっとしたサービスでも使えるかな。shipyardもIDCF IaaSも、良く出来てるなぁと思いました。
コメント