WindowsユーザーのためのDockerコンテナー入門【Azure活用編】(2)
Dockerコンテナーの起動・停止と、Cassandraのコンテナーへのcqlsh接続&CQL実行
――Dockerコンテナー実践活用(前編)――
Dockerコンテナーの基本的な使い方(起動・停止)を一通り説明。また、Cassandraのコンテナーにcqlshで接続してCQL文によりテーブル作成やレコード追加を行う手順を解説する。
前回は、Azureクラウド環境にDockerホストを作成し、WindowsからnginxのDockerコンテナーを操作するところまでを解説した。
今回(前編)と次回(中編)と次々回(後編)は、分散キーストアであるApache Cassandra*1のDockerコンテナーを使って、より実践的なDockerの使い方を解説する。
- *1 Apache Cassandra(アパッチ・カサンドラ)は、Facebookで開発された、オープンソースのデータベース(分散型キーストア)である。基本的にはKey-Valueのペアを保管・保存するキーストアのシステムであるが、複数のノードにデータを複製する機構を持つ。これにより、データ量やアクセス数に応じてノードを追加・拡張できるため、急に大きな負荷がかかっても性能を維持することが可能であり、ノードに障害が発生しても生き残っているノードがある限りデータの読み書きが可能である。こういった、障害に対して極めて強い耐性を持っていることがCassandraの特長だ。No SQLの代表格といえるCassandraだが、データを扱うための、CQL(Cassandra Query Language)というSQLライクな言語を提供しているので、一般的なRDBMSとほぼ同じ使い方ができるのも大きな魅力である。
まず今回は、単一のDockerホストにCassandraのコンテナーをロードし、別のコンテナーからCassandraを使う手順を説明する。次回は続編として、ストレージのマッピング方法と、単一のホストに複数のCassandraのコンテナーをロードしてCassandraクラスターを構築する方法を解説。さらに次々回は、Azure Container Serviceを使って、複数のDockerホスト上にCassandraのコンテナーをロードする手順を説明する。
なお前回と同様に、今回~次々回では複数のシェルを使い分ける。記事中で表1の表記が出てきたときは、それぞれシェルを使い分けていることに注意してほしい。
記載例 | シェル | 起動方法 |
---|---|---|
PS> | PowerShell | [スタート]ボタンをクリック→“PowerShell”を入力して検索→[Windows PowerShell]アイコンを右クリックして[管理者として実行] |
CMD> | コマンドプロンプト | [スタート]ボタン→“CMD”を検索→[コマンド プロンプト]アイコンを右クリックして[管理者として実行] |
SSH> | Putty SSHセッション | PowerShellまたはコマンドプロンプトから“putty”を入力して起動 |
Cassandra Dockerコンテナーをロードする
Dockerホストの起動
まずは、Dockerコンテナーをロードする先のDockerホストを起動する(リスト1)。まだ、Dockerホストを作成していない場合は、前回の記事を参考にDockerホストを作成してほしい。
# Azure-cliをASMモードに設定する
CMD> azure config mode asm
# Azureにログインする
CMD> azure login
# Dockerホストを起動する
CMD> azure vm start "<Dockerホスト名>"
|
※Azureへのログイン手順は前回説明している。
※Dockerホスト名は、前回の例では「BldinsDcrHst」としたが、読者独自の実際の名前を指定する必要がある。
Cassandra Dockerコンテナーの起動
次に、Dockerホスト上にCassandraコンテナーイメージを取得して、Cassandraコンテナーを起動する。DockerホストにPuttyで接続し(※前回の例で指定した管理ユーザー名は「builder」)、以下のコマンドを実行する。
# CassandraコンテナーのイメージをPULLする
SSH> docker pull cassandra
# Cassandraコンテナーを起動する
SSH> docker run -d --name some-cassandra cassandra
# Cassandraコンテナーが起動したことを確認する
SSH> docker ps
|
※docker run
コマンドの各オプションについては前回の記事を参照されたい。この例では「some-cassandra」という名前でCassandraコンテナーをサービス(=Dockerプロセス)として実行している。
図1は、リスト2の1つ目のコマンドを実行したときの例である。
Cassandra Dockerコンテナーにcqlshで接続
DockerプロセスとしてCassandraコンテナーが起動したことを確認したら、スキーマの準備とサンプルのテーブルを作成する。
今回は、クライアントとしてcqlsh
を使用する。cqlsh
は、Cassandraの標準クライアントであり、Cassandraとの対話Shellの機能を提供する(SQL Serverのsqlcmd
ユーティリティのようなものと思ってもらえればよい)。cqlsh
もDockerコンテナーとして用意されており、今までに見てきたDockerコンテナーと同じようにdocker run
コマンドを使い起動できる。
まずは、Cassandraコンテナーにcqlshで接続しよう(リスト3)。
# cqlshを起動し、Cassandraコンテナーに接続する
SSH> docker run -it --link some-cassandra:cassandra --rm cassandra cqlsh cassandra
|
このコマンドの基本フォーマットはdocker run [各オプション] イメージ名 [コマンド] [引数...]
となっており、
・-it
/--link some-cassandra:cassandra
/--rm
はオプション(※各オプションの詳細は表2を参照)
・cassandra
はDockerコンテナーイメージ名
・cqlsh cassandra
はコマンドとその引数
を意味する。注意してほしいのは、--link
オプションで「some-cassandra」という名前のCassandraコンテナーに「cassandra」という別名を付与してリンクしており、その別名をcqlsh
コマンドの引数で使用しているという点だ(※コマンドの前の「cassandra」も同じつづりで混同しやすくなっているが、こちらは別名ではなくイメージ名なので注意。例えば別名を「csdr」などに変えるならdocker run -it --link some-cassandra:csdr --rm cassandra cqlsh csdr
というコマンドラインになる)。
このコマンドライン例の意味をまとめると、
・標準入力を受け付ける状態で(-it
オプション)
・かつ、some-cassandra
コンテナー(別名:cassandra
)にリンクした状態で(--link
オプション)
・(--rm
オプションにより、既存の場合はいったんコンテナーを削除したうえで)
・cassandra
イメージのコンテナー(=以降で説明する『cqlsh』の実体)を起動し
・リンク状態のsome-cassandraコンテナー(別名:cassandra
)にcqlsh
コマンドで接続する
となる。
ここで使用したオプションは以下の通り。いずれもよく使うオプションであり、この後の解説でも登場するので覚えてほしい。
オプション | 意味 | 説明 |
---|---|---|
-it | 標準入力を受け入れる | cqlsh のように、コンテナー起動後にユーザーの何らかの入力を必要とする場合に指定する |
--link 接続先のコンテナー名:別名 | 接続先のコンテナー名を指定する | Dockerではコンテナー間通信をする場合、コンテナーの名称を指定する必要がある。: の後に別名を指定する |
--rm | コンテナーを起動するときに、既存のコンテナーがあれば削除してから起動する(docker rm -v コンテナー名 コマンドと同じ効能) |
Dockerコンテナーは、コンテナーを停止したときに、非活性なコンテナーとして残存する(これには、データが保持されるのでデバッグしやすいというメリットがある。詳しくは次回を参照)。ただしクライアントのコンテナーの場合は、何度も起動し直すことになるため逆に残存することがデメリットになるので、このオプションを使用することをお勧めする |
※docker run
コマンドにはこれ以外のオプションも用意されている。詳しくは前回の記事を参照。
Cassandraコンテナーにcqlsh
で接続できたら、help
コマンドを実行し、どのようなコマンドが使えるか確認しておこう(図2)。
CQLを使ったテーブル作成とレコードの追加・参照
次に、CQLというCassandra独自のクエリ言語を使い、キースペース(=データベース)とテーブルを作成する(リスト4)。なお、CQLの文法の説明については、ここでは割愛するので、詳しくは「The Cassandra Query Language (CQL)(英語)」を参照してほしい。
# キースペースの作成
cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor':1};
# キースペースに移動
cqlsh> use mykeyspace;
# テーブルの作成
cqlsh:mykeyspace> create table posts (
id int primary key,
title varchar,
content text,
created_at timestamp
);
# レコードの追加
cqlsh:mykeyspace> insert into posts (id,title, content, created_at) values (1, 'test', 'test entry.', dateof(now()));
# テーブルの参照
cqlsh:mykeyspace> select * from posts;
# cqlshの終了
cqlsh:mykeyspace> exit
|
リスト4を実行すると、Cassandraコンテナーにテーブルが作成され、そこにデータを格納できたことを確認できたと思う。
システム構成図:cqlsh接続できるCassandraコンテナー
ここでコンテナーの関係を整理する。
前回の「図19 ポート開通後のシステム構成のイメージ」と見比べると、今回はCassandraコンテナー(名前:「some-cassandra」、別名:「cassandra」)と「cqlsh」コンテナーが起動され、その2つのコンテナーがリンクされており、cqlsh
ユーティリティを通じてCQLのコマンドが実行できる状態であることが分かる。
図3の「Cassandra」と「cqlsh」は、Dockerホスト上で起動している、それぞれ別のコンテナーである。この2つのDockerコンテナー間の通信は、Dockerホスト内の仮想ネットワークで行われる。Dockerコンテナーはデフォルトでは、Dockerホストの外から接続できないので注意してほしい。
最後に
Dockerコンテナーの基本的な使い方(起動・停止)を一通り解説した。また今回は、Cassandraコンテナーにcqlsh
で接続してCQL文によりテーブル作成やレコード追加などの基本的な操作を行った。
次回は、実運用で必要となる、ストレージのマッピングについて説明し、単一のホストでCassandraクラスターを構築する方法を解説する。
1. Dockerとは? Dockerホストの作成から、Dockerコンテナーのロードまで
Dockerの概要やそれが必要な理由、仮想マシンとの違いを解説。初めてDockerを使うWindowsユーザーに向けて、AzureにDockerホストを作成してSSH接続し、Dockerコンテナーを起動・停止する方法を説明する。
2. 【現在、表示中】≫ Dockerコンテナーの起動・停止と、Cassandraのコンテナーへのcqlsh接続&CQL実行
Dockerコンテナーの基本的な使い方(起動・停止)を一通り説明。また、Cassandraのコンテナーにcqlshで接続してCQL文によりテーブル作成やレコード追加を行う手順を解説する。
3. Dockerコンテナーへのストレージのマッピングと、複数コンテナーのロード(単一ホスト)
実運用で必要となる「ストレージのマッピング」(Dockerホストのストレージを利用/Azure File Storageを利用)を解説。さらに、単一のホストに複数のCassandra DockerコンテナーをロードしてCassandraクラスターを構築する方法を説明する。
4. Azure Container Service+Docker Swarmで、複数Dockerホストから成るクラスターの構築
Azure Container ServiceでDocker Swarmを使い、複数のDockerホスト上にCassandraコンテナーをロードする手順を説明する。