freedom-man.com

ブログは俺のセーブポイント

Tag: docker (page 1 of 2)

Dockerを使ったCLIツール配布

homebrewやcurl -sL {url} | shなどの/usr/local/binに置く以外にもdockerを使って配布できますよ、という備忘録。

Continue reading

Salesforceのデータバックアップ用Dockerfile作ったので公開してみた

Apex書くのに飽きたため業務の効率を上げるため、Salesforceの各オブジェクトごとの

レコードをCSVでフルバックアップするスクリプト書いてDockerfileにしてみました。

S3の設定をすれば各csvをgzip化して、S3にアップロードするようにもなっていたり。

DataLoader使えば良いじゃん説がありますがJavaとXMLの設定がめんどかった

+herokuみたいなone offでクリーンなエクスポートをしてみたかったってのが動機っす。

 

完成品はこちら

Dockerhubにも登録してます→tzmfree/sfdc-exportjs

 

使い方は、ログ用のディレクトリを作成して

環境変数セットしたDocker走らせるだけ

 

ボリュームで指定したディレクトリ(ホスト側に作ったディレクトリ)にログとかCSVファイルが格納される仕様っす。

CSVファイルをごにょりたい場合はdocker run後の処理でそのCSVを煮るなり焼くなりすればOK。

スケジュール起動したい場合はホスト側のcrondでdocker runごとブン回してください。

以下はDockerfileの備忘っす。

Dockerfileの書き方

MAINTAINERは作った人の名前。

FROMはベースとなるDockerイメージ。

今回ベースとしているphusion/baseimageはDocker使う時のハマりどころを色々と回避してくれてる

ベースイメージで、sshdとかcrondとかも初期装備されてる便利なDockerイメージ。

Dockerfileでよく使うのはRUNとADD。

RUNは実行するコマンドで大体パッケージインストールやgit clone等のセットアップ系を行います。

ADDは実行ディレクトリ配下にある特定のファイルをアップロードする操作で

今回はエクスポート担当のNode.jsスクリプトをアップロードしてます。

Dockerhubへの登録とか

今回はgithubやbitbucketにpushしたら自動的にビルドしてDockerhubにアップロードしてくれる

Automated Buildという機能を利用しました。

設定は超簡単で、Dockerhubにログイン後にAdd Repositoryのボタンから

Automated Buildを選択して

dockerhub_automatedbuild1

gitのサービス選んで

dockerhub_automatedbuild2

リポジトリ選んで

dockerhub_automatedbuild3

テキトーに設定するだけ

dockerhub_automatedbuild4

あとはgithubとかのリモートリポジトリ側にwebhookの設定が自動で追加されるっぽいので

pushしたら都度ビルドしてくれます。

ただし通常のwebhookによる自動化と同様、README上げただけでもビルド走ります。

雑感

今更ですがherokuone-off dynoの考え方が良いなーと思っていて

環境変数の設定変更だけで色んな環境に対応できたり

Immutableで環境自体汚さなかったりするのが個人的には美しく感じます。

まぁ、この量のスクリプトならnpm install && node *** で事足りる感じもしますが…。

Dokku Alternative触ってみる。

Dokku AlternativeというOSSを使うと、Dockerを利用して

herokuみたいなPaaSを作れるということなので試してみましたー。

Dokku Alternativeは本家のDokkuに色々と機能を追加したOSSみたいです。

 

参考URLはこちら↓

Dokku Alternative·個人用PaaSにどうぞ。Dokkuに便利な機能を追加 MOONGIFT

Herokuのように簡単に使えるDockerベースのPaaS | KRAY Inc

Dockerを使ったミニPaaSのdokkuをパワーアップさせた「Dokku Alternative」を試す – さくらのナレッジ

 

今回はまっさらなVMに入れてみます。

1. Ubuntuインスタンスを立ち上げる

今回はDigitalOceanで立ち上げました。

スペックはメモリ512MBの一番安いプランで、OSはUbuntu 14.04×64を選択。

Dokku-altはUbuntu 14.04 LTSにしか対応してないっぽいです。

dokku-ubuntu-digitalocean

立ち上げたら、セキュリティ系の諸々の初期設定をした後、スワップファイルの設定をしてください。

これをしないとメモリ不足でインストールがコケます。

設定したら、以下のコマンドでswap領域が有効になっているかを確認

/etc/fstabにも登録しておきます

2. Dokkuのインストール

インストールは超簡単で以下のコマンドを実行するだけ。

インストールが成功すると初期設定用のサーバが立ち上がるので

http://{サーバーのIP or ホスト名}:2000にアクセスして設定を行います。

dokku-setup

IPアドレスだとアプリに対してサブドメイン形式のURLをアサインできません。

DNSレコードを設定するか、hostsファイル弄るかでホスト名でアクセスできるようにすれば

サブドメイン形式({アプリ名}.{サーバーのホスト名})が利用できます。

公開鍵は、git pushするときのsshの秘密鍵に対応する公開鍵を入力すればOK。

設定はこれだけ!

3. アプリをpushしてみる。

あと、テキトーなアプリをpushすればデプロイできちゃいます。

デプロイすると、http://{アプリケーション名}.{2で指定したサーバのホスト名}のURLでアクセスできます。

 

アプリはdockerで動いているので、デプロイするとdockerのインスタンスが立ち上がっているのを確認できます。

サーバにリモートログインしてdokkuコマンドを叩くと、アプリの作成や削除、DBインスタンスの作成等

dokkuのアプリ設定を色々と弄れます。

4. 管理用コンテナを作成する

このままでもgit pushだけでデプロイできる素晴らしい環境なんですが

DBコンテナ作って既存のアプリに紐付けたり、既存のアプリを削除したりするには

CUIでの操作になるため、ちょっと面倒です。

幸いdokku-altには管理画面用のコンテナがあり、以下のdokkuコマンドでインストールできます。

インストールがうまくいくと、http://dam.{ホスト名}のURLで管理画面UIにアクセスできます。

最初はUserが居ないとエラー画面が表示されるので

サイドメニューのUsersの[Add User]ボタンから、適当にユーザを作成して、ログインを行います。

dokku-manager-first

dokku-adduser

ダッシュボードを開くと、ホストサーバが表示されているので、設定マークをクリックします。

※Deploy New Appは押しても何も起こりませんでした…。

dokku-dashboard

Sync Appsを押すと、既にデプロイされているアプリと管理アプリ自体のコンテナが表示されます。

dokku-hosts

ここでアプリケーションの追加・削除したりできます。

Deploy Git Appで任意のgitリポジトリからデプロイ出来そうな雰囲気ですが

鍵の設定がよくわからず、断念orz

dokku-gitapp

よく見ると、Webhookはこれから対応するような文言が見当たるのでCIとかにも対応しそうな感じ。

 

今回は先ほど作成したnodeアプリのコンテナにMongoDBのコンテナをつなげてみます。

まずは、Add DBからDBコンテナを作成します。

dokku-adddb

初回はDBコンテナのイメージを取得するせいか、Ajaxのタイムアウトエラーが出たんですが

その場合でもちゃんとコンテナが作成されていました。

DB用のコンテナ作成後は対象のアプリのリンクをクリックします。

dokku-dev1

Add DB Linkをクリックして先ほど作成したMongoDBのコンテナとリンクさせます。

dokku-addlink

これでNode.jsのアプリからMongoDBに接続することが可能になりました。

接続情報はサーバ側で以下のコマンドを叩くことで確認することが可能です。

(もしかしたらGUIでの方法もあるのかも)

接続情報をソースにベタ書きするのはアレなので、コンテナ内の環境変数にセットします。

Add Configからキーバリューで値をセットします。

dokku-setdbconfig

こんな感じになります。

dokku-aftersetdbconfig

あとはソースコードの修正をします。

まずはNode.jsからmongo叩くためにパッケージをインストール

こんな感じでindex.jsを修正

あとはgit pushすると新しいアプリが立ち上がって

WebアプリにアクセスするとMongoDBにレコードが差し込まれます。

コマンドラインからMongoDBにアクセスするには

でMongoDBの対象コンテナ(イメージ=ayufan/dokku-alt-mongodb)のIDを確認して

でコンテナのプライベートIPアドレスを取得。

あとはプライベートIPを使って、MongoDBに接続すればOK。

こんな感じでドキュメントを取得できます↓

5. SSLの設定

Dokku-altの管理画面ですが、デフォルトのままだと非SSLで

クレデンシャル晒している状態なのでSSL対応します。

今回は検証用ということで、オレオレ証明書で。

キー、証明書を作ったら dokkuコマンドで、管理用Webアプリに登録します。

keyを登録した時点でコンテナが再起動してSSLが有効になります。

その他注意点

以下のようにdokkuコマンドを使ってアプリ再起動したときには

dockerのコンテナは起動しているものの

フォワーディング(ホストOSのnginxで受け取ってコンテナにフォワーディング)の設定が

されないようで、アクセスしようとすると500エラーが返って来てしまいます。

この場合は、以下のコマンドでリビルドすれば、適切にフォワーディングされるようになりました。

 感想

dokkuはシングルホストなのでスケールしないし、可用性的に問題が有ったりするので

商用には厳しい感じですが、アプリを検証したりプロトタイプ作ったりするような

簡単な用途には有用な気がします。

DigitalOceanの$5/monthのプランでもそれなりに動いていますし。

herokuとかのPaaSに移行するとしてもremoteリポジトリ変えるだけなので楽ちんです。

ただしherokuと違ってスケジューラやone-offなコンテナはありません。

ホスト側自由にいじれるんで、どうしても使いたい場合はcronとかシェルで対応しちゃえばOKですw

DockerのPrivateなリポジトリをs3に作る

Dockerはhttps://index.docker.io/にPublicなリポジトリを持てるんだけど

docker-registryっていうのをdockerイメージを使えば

Privateなリポジトリを超簡単に持てる&S3に永続保持できるらしいので試してみた。

 

Publicなところに、AWSのClientIDとかSecretKeyとかうっかり保存しそうな私みたいな人には超オススメ。

 

やりかたは超簡単でregistry立ててpushするだけ!

1. docker-registryをpullしてコンテナー化

registryもdockerで提供されているっていう。

 

2. registryのconfigファイル設定

 

config.ymlはこんな感じで。(S3の例)

 

サンプルは何故かs3_encryptとs3_secureが2つずつあったので

1つずつ削除しました。(ちゃんと動いているので多分OKだと思います。)

storage_pathは実際にS3に格納される時のサブディレクトリを指定します。

上記の例だと、test-docker/images/ ディレクトリ直下に実際のimageやらrepositoryが配置される感じです。

環境によって向き先を変更できるみたいで、例ではprod(本番)環境の設定をしています。

 

3. registryをcommitして再度立ち上げ

 

ここで環境変数SETTINGS_FLAVORをprodに設定しておかないとダメ。

ここで設定しない場合はデフォルトdevになって、

上記のconfig.ymlだとdevの定義が書いていないので楽勝でエラーになります。

(私の場合、”Config error: `secret_key’ is not set”というエラーが出て小一時間ハマりましたorz)

 

4. 既存のimageにtagを付けてpushする

とかでimageIDを調べた後

でtagを付けて

でpush!ここでs3にイメージが保存されます。

 

pullとかpushするときには明示的にRegistryにホスト名とポートを指定しないと

docker公式のrepositoryやユーザのpublic repositoryが置いてあるindex.docker.ioを利用して

明示的に指定した場合は対象のregistryを利用する形になります。

 

つまり、docker pull ubuntu って書くと

index.docker.ioにホスティングされたregistryから公式imageのubuntuを取得し

docker pull tzmfree/ubuntuって書くと、index.docker.ioの

ユーザtzmfreeのpublic repositoryからimageを取得します。

 

一方、docker pull localhost:5000/tzmfree/ubuntu とホストとポートを指定すると

localhost:5000のregistryからtzmfree/ubuntuというimageを取得します。

 

pushするためにはimageにlocalhost:5000というreigstryの指定が必要だから

docker tagでタグを付けてます。

(私もここらへんよくわかんないですが、とりあえずこういう書き方になるっていうことで!)

 

あと、tzmfreeというユーザ指定部分ですが、ユーザ名なので短い名前だったりすると

Invalid namespace name (tzm), only [a-z0-9_] are allowed, size between 4 and 30

って感じで怒られます。

imageの名前は何でも良いですが、付けるtagの名前はここらへんの命名規則に従う必要があるみたいです。

 

これでprivateなimageもデプロイ出来ます!

しかもimageはS3に永続的に保持される!

 

ちなみにDockerfile使えばbitbucketとかのprivateレポジトリ使えば

registryを使わずにprivateなimageをデプロイできるみたいです。

本当はgitとかでDockerfile管理しつつコードとして保持しておいて

imageをs3とかに保持しておくのが良いのかもですが

自分用のdockerであればimageオンリーってのは有りだと思います。

 

あと、今回のサンプルだとホストOSのポート5000を開けているので

別PCの別dockerクライアントでもpushできちゃうpublicなregistryになっちゃってるので

private registryにするにはiptablesとかhttps + basic認証とかで適切に対応する必要があります。

 

参考サイト:

docker-registry と Amazon S3 で作る自分だけのコンテナ倉庫(リポジトリ)

社内用Docker Registryを立てる

Private Docker Registryを、あっさりセットアップする

dockerコンテナで動くmysqlを永続化してみる【Zabbix編】

今回はdockerコンテナで動くmysqlデータをホストOS上にセーブすることで、

commitしなくてもデータを維持する!ということをしてみます。

 

今まではコンテナ落とす度にちゃんとcommitしないと、次に起動するときにデータが無くなり

Immutable Infrastructureとは程遠い感じになっていたので

サーバーは機能だけを提供して、データは別にするという疎結合な感じにするっていうのがモチベーション。

 

本日の参考サイトはこちら↓

http://www.zabbix.jp/documents/installation/install-rpm

http://cpw.hatenadiary.jp/entry/2013/08/20/220306

 

考え方としては、ホストOSにmysqlデータを格納してそれをコンテナがマウントして使うって感じ。

docker+zabbixの回で既にmysql-serverがインストールされているので、そのデータ移行もやってみます。

 

1. ホストOSに任意のディレクトリを作成。

コンテナにマウントさせる共有ディレクトリを作成します。

前者はダンプファイル共有用、後者はmysqlデータ格納用になります。

 

2. docker run でコンテナ作成。

1で作成した共有ディレクトリの内、ダンプファイル共有用のディレクトリをマウントしてコンテナを作成します。

 

これでホストOSの/home/tzm/docker/shareディレクトリがコンテナの/shareでアクセス出来るようになります。

 

3. mysqlのダンプを取ってマウントしたディレクトリ内に格納してコンテナを落とす。

 

4. mysqlデータ共有ディレクトリをマウントして再度コンテナ起動。

 

今回はzabbix使うのでポート転送は443と10051を指定。

1で作成した共有ディレクトリも全てマウント。

 

5. コンテナ内でmysqlの初期化及び設定を行う。

mysqlの初期化

 

mysql起動

 

ダンプファイルのディレクトリに移動してmysqlにログイン。パスワードも設定。

 

zabbixデータベース、zabbixユーザを作成してdumpデータをzabbixデータベースにインポート

 

これでマウントしたコンテナ内で作成されるmysqlデータは

ホストOSの/home/tzm/docker/mysqlに格納されてcommitせずともデータが永続化します。

Older posts

© 2017 freedom-man.com

Theme by Anders NorenUp ↑