ラベル Docker の投稿を表示しています。 すべての投稿を表示
ラベル Docker の投稿を表示しています。 すべての投稿を表示

2015年11月9日月曜日

MongoDBをDokcerに隔離してマニュアル操作する

まずは、MongoDBのコンテナを作成します。

$ docker pull mongo

Latestは3.2です。
早いです。
11月5日に MongoDB Blog でアナウンスされたばかりです。3系の最新版ということになります。
軽く主な変更点に触れておこうと思います。

1)注目はストレージエンジンです。負荷状況に応じた最適化の選択肢の設定を行いやすくなった点です。これにより複数のストレージ稼働でのスケールがより柔軟になり運用の負担を軽減します。
2)ドキュメントバリデーションも強化されました。
3)インデックス作成時にフィルタをかけることによりメモリ容量を節約する。
4)BIコネクタ (BI Connector) が導入されました。

主なところをリストしてみました。
BIコネクタの導入は簡易なBI分析に向けて、ビッグデータ的な大がかりではないようなちょっとしたことがいろいろ可能になるような夢を感じますね。

では、pullしたmongoDBコンテナを起動します。

$ docker run --name mongo-sampler -d mongo:latest

さて、起動したら念のため ps で確認してみてください。
クライアントを起動してMongoDBを扱いたいわけですが、ホスト側のローカル環境にはMongoのコマンドは存在しません。
そのために、クライアントの役割を演じるコンテナをひとつ起動します。

$ docker run -it --link mongo-sampler:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/sample-db"'

MongoDBの操作が終わればクライアントのコンテナは必要なくなるので -rm でオプションを設定して、これからログインするコンテナを抜けると同時に終了するように設定します。
--link で既に起動してある MongoDB のコンテナに接続します。
sh -c でシェルスクリプト経由で、$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT のコマンドを実行します。内容は、Dockerで自動的に生成される環境変数でMongoDBのIPアドレスとポート番号を参照するようにします。
最後の sample-db は MongoDB に作成するデータベースです。

先のDockerコマンドを実行するとMongoDBのコンテナにログインするので、作成されたデータベースを使ってみます。

> use sample-db
switched to db sample-mongo

データを投入します。

> db.records.insert({_id:1,title:"MongoDBへテストレコードを投入する。",number:100})
WriteResult({ "nInserted" : 1 })
> db.record s.insert({_id:2,title:"続いてレコードをもう1件投入します。",number:101})
WriteResult({ "nInserted" : 1 })

検索します。

> db.record s.find()
{ "_id" : 1, "title" : "MongoDBへテストレコードを投入する。 ", "number" : 100 }
{ "_id" : 2, "title" : "続いてレコードをもう1件投入します。 ", "number" : 101 }

更新します。

> db.books.update({ _id:2 }, { $set : { title: "上書きします。" } })

確認します。

> db.record s.find()
{ "_id" : 1, "title" : "MongoDBへテストレコードを投入する。 ", "number" : 100 }
{ "_id" : 2, "title" : "上書きします。 ", "number" : 101 }

削除します。

> db.books.drop()
true
> db.record s.find()
>
> exit
bye

そしてプロセスを抜けたので、クライアントのコンテナは消滅しました。
NoSQLを実感してください。

2015年10月1日木曜日

Docker - 削除系のTips2題

Docker でいろいろ試行錯誤をしていると、さて。。となることがよくあります。
そんなときの軽いTips2題。

$ docker imgaes
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none>  <none>  c395172a74e5  8 hours ago  1.151 GB
<none>  <none>  05a17381460b  8 hours ago  1.151 GB
<none>  <none>  eb3ce0796961  8 hours ago

と、こんな状況に陥ることがまれにあります。
そんなときは、以下のコマンドで <none> のイメージをきれいに削除できます。

$ docker images | awk '/<none/{print $3}' | xargs docker rmi

では、すべてのイメージを一気に片付けたい場合は

$ docker images | awk '{print $3}' | xargs docker rmi

で、一気にきれいになくなります。
必ず使うコマンドなので、メモしておくとよいです。

2015年9月29日火曜日

Dockerfile から Dockerコンテナを生成しよう

今回は、Dockerfileを記述して、Dockerコンテナを生成するプロセスを体験します。
目指すのは、Webサーバを起動して動作を確認する、です。

まず、任意のディレクトリに Dockerfile という名前のファイルを作成して、以下のような記述をします。

FROM ubuntu:14.04
MAINTAINER kenny <kenny@mail.com>
RUN apt-get install -y nginx
ADD index.html /usr/share/nginx/html/

FROM で コンテナを作るにあたりベースになる環境として、Ubuntu14.04を使います。
MAINTAINER は見てのとおり作成者です。
コンテナをビルドするときに、上から順番に命令が走るわけですが、RUN でコマンドを実行します。
上の例では、nginxをインストールしています。非対話モードで走らせなければならないため -y オプションを追加しておきます。
次の ADD コマンドで、/usr/share/nginx/html に index.html を配置します。

たったこれだけです。
もちろん、必要最小限のコードしか記述していませんが、基本はこんな感じです。
これだけで、index.html を表示するWebを起動することができるわけです。

さて、index.html の中は空なので、このままでは結果を確認できません。

$ echo 'Hello!' > index.html

これでOK!

では、コンテナをビルドしてイメージを作ります。
$ docker build -t kenny/nginx:0.5 .

名前は適当でも構いませんが、慣習として <username>/<imagename> のように付与するのが推奨されます。
-t オプションでタグをつけます。上の例では 0.5 です。
注意点をひとつ。
最後の .(ドット)は忘れやすいので、注意です。最後の引数は、Dockerfileの配置したパスを指定します。つまり、このコード例では、カレントディレクトリで作業していることになります。

結果をリストします。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
kenny/nginx 0.5  f5468aac82bb  18 seconds ago  206.9 MB
ubuntu 14.04  91e54dfb1179  5 weeks ago  188.4 MB

ここまできたらあとは起動してコンテナを生成します。
docker run -d -p 80:80 --name nginx1 kenny/nginx:0.5 /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
18c2ceb92246540662d390550334b0c1f75e4437aa7fd66766ca2ffec25c6f8e

--name で nginx1 という名前をつけて、-d でバックグランドで動作します。
-p で80番ポートを常時リッスンして、ホスト側で80番でアクセスできます。

ためしに、curlコマンドで確認してみます。
$ curl localhost:80
Hello!

想定したとおり Hello! が得られました。
ブラウザで localhost:80 でアクセスしても、当然、同じ結果が得られます。

2015年9月19日土曜日

DockerでWordPressを起動してみる

ubuntu に Docker をインストールしてある前提で話を進めます。
Dockerイメージではなく、Dockerfileを使ってビルドする方法をとってみます。

$ docker build --rm -t (name)/wordpress git://github.com/jbfink/docker-wordpress.git

(name)の部分は適当な名前を付与して構いません。
これを実行することにより必要なイメージをダウンロードしてビルドします。

次に、以下のコマンドを実行します。
$ docker run --name wordpress1 -d -p 8080:80 -p 2022:22 (name)/wordpress

(name)は適当に付与した名前です。たとえば、sample という名前をつけたなら、sample/wordpress というDockerイメージができあがるわけです。
そして、wordpress1という名前をコンテナに付与しています。
加えて、80番(HTTP)と、22番(SSH)のポートをホストの 8080番に、2022番に、それぞれルーティングするように設定します。

これで完了です。
では、http://localhost:8080/ にアクセスしてみてください。



WordPress のインストール画面が表示されます。
簡単ですね。

では、WordPressをインストールしちゃいます。


サクッと完了です。

では、Dockerコンテナを終了してみます。
$ docker stop wordpress

これで、さきほどのURLにアクセスしてみてください。画面は表示できないはずです。
もう一度、再開するには
$ docker start wordpress

さて、ここからがポイントです。
コンテナは終了すると破棄されます。つまり、インスタンスを失い次に起動したときは新しいインスタンスで立ち上がります。
したがって、コンテナの中で設定された内容は永続化されません。
それでは困ってしまうので、現在の状況を別のコンテナとして記録します。

$ docker ps -a

上記のコマンドで現在のコンテナプロセス(起動しているもの、停止しているものも共に)がリストされます。その中から、さきほど停止したコンテナのIDに注目します。
そのうえで、以下のコマンドを実行します。

$ docker commit (CONTAINER ID) wordpress2:test

これで、さきほどのWordPressコンテナをコミットしました。
その上で、コンテナのイメージをリストします。

$ docker images

REPOSITPRYが wordpress2、TAGが test というイメージがリストされたでしょうか。
これで、さきほど停止、または 中断したときの状態からコンテナを起動することができるようになります。