「2時間でマスターしちゃう Docker&Elasticsearch ハンズオン 入門」に参加した
Dockerの勉強会に行ってきたのでメモしておく。人生初めての勉強会参加。
この勉強会では、Dockerの基礎とElasticsearchについて少しだけ触れた。
まとめていたらすごい長くなってしまった。あと、まだ資料が届いていないため、内容を変えるかもしれない。(2017/10/21 19:54)
Docker
DockerはVMよりも無駄が少ない。
VMの場合、仮想OSを立ち上げてその環境に必要なソフトをインストールするため、無駄な部分(自分が必要としていない部分)まで構築されてしまう。しかし、Dockerの場合、DockerEngineという層の上に必要なソフトのみを構築できるため、無駄な部分がほとんどない。
Dockerの利点
Dockerfileを共有できる 例えば、あるプロジェクトに新メンバーが参画したときにDockerfileを共有して実行してもらうだけで環境構築が簡単にできる。といったことが実現できる。
マシン固有の問題がなくなる Docker上で開発を行うことで、マシンの環境に関係なく開発を行える。
- コンテナごとに環境変数を設定できる 環境変数を分けることができるため、別のコンテナで同じ環境変数を使うときに、問題が起きにくくなる。
用語
Dockeイメージ
コンテナを作るためのもの。プログラミングで例えると、クラスのようなもの。設計書。
Dockerコンテナ
イメージを元に作ったもの。プログラミングで例えるとインスタンスのようなもの。また、1つのイメージから何個でもコンテナを作ることが出来る。それぞれのコンテナは独立している。
MySQLのイメージから複数のコンテナを作成した場合、それぞれのコンテナごとにデータを格納する領域がある。みたいな
DockerHub
DockerHubとはGitHubのような感じでみんなが作ったイメージが公開されている。Dockerを使い始めの頃はここからダウンロードすると良いらしい。pull コマンドでイメージをダウンロードできる。
Dockerのインストール
ここの Get Docker のボタン Docker Community Edition for Mac でダウンロードする。
ダウンロードしたら Docker.dmg をダブルクリックし、クジラを Applications にドラッグする。
なんか表示されたらそれっぽいのを選択していく。
上のバーにクジラが表示されればインストール完了。
起動している状態でバージョンを確認
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
コマンド
Dockerを扱うためのコマンドをざっと説明
docker ps コマンド
$ docker ps
起動しているコンテナの一覧を表示する。
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a
オプションで起動していないコンテナも表示する。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker pull コマンド
$ docker pull {pullするイメージの名前}
DockerHubからイメージをダウンロードする。
例) MySQL 5.6 のイメージをダウンロード
$ docker pull mysql:5.6
...
Status: Downloaded newer image for mysql:5.6
docker images コマンド
$ docker images
一覧を表示する。イメージはIMAGE ID
で識別されている。IMAGE ID
が同じであれば、同じものということになる。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.6 5f0b301e2e86 4 days ago 299MB
docker run コマンド
$ docker run {REPOSITORY}
イメージからコンテナを生成し実行する。
images コマンドのREPOSITORY
を指定することで生成と起動を行える。また、mysql:5.6
のようにTAGを指定することもできる。
例) pull した mysql5.6 のイメージを起動してみる。
$ docker run -d -e MYSQL_ROOT_PASSWORD=password --name mysql5.6 mysql:5.6 6c309c073067378bea743132451aa35eb9d68a1967f4782cc9064a7d11c36152
※勉強会のときにはコピペだったため、この文がどういう意味なのか調べてみた
よく使うDockerコマンド - Qiitaを参考にした。
-d, --detach オプション
バックグラウンドで実行する。
-e、--env オプション
-e {変数名}={値}
環境変数を設定する。今回の場合、MUSQL_ROOT_PASSWORD
という環境変数にpassword
という値を設定している。
--name オプション
--name {コンテナの名前}
コンテナに名前をつける。今回はコンテナの名前をmysql5.6
にしている。
docker start コマンド(勉強会のときにはなかったけど)
$ docker start {コンテナ}
すでにあるコンテナを起動して、起動したコンテナを表示する。{コンテナ}
はdocker ps -a
のCONTAINER ID
かNAMES
を指定する。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6c309c073067 mysql:5.6 "docker-entrypoint..." About an hour ago Exited (0) 15 minutes ago mysql5.6 $ docker start mysql5.6 mysql5.6
docker run
コマンドで名前を設定していた場合にはmysql5.6
のように名前で指定できる。
docker exec コマンド
$ docker exec {コンテナ} {コマンド}
実行中のコンテナで新しいコマンドを実行する。コマンド
はコンテナのカレントディレクトリで実行される。
例) mysql5.6に接続し、コンテナ上で /bin/bash を実行する
$ docker exec -it mysql5.6 /bin/bash
※勉強会のときにはコピペだったため、この文がどういう意味なのか調べてみた
-t, --tty オプション
コンテナ用のコンソールを生成する?みたいな
疑似TTYを割り当てる。TTYとはログインしているコンソールに割り当てられている識別子。
詳しくはこちら
新しい識別子を作成しているということになる。別の接続をしているということ?
以下のように実行したら、動かなくなったため新しい接続をしているということかな???(TTYについてはもうちょっと調べないと...)
$ docker exec -i mysql5.6 /bin/bash
-i, --interactive オプション
接続されていなくてもSTDINを開いたままにする。
なんのことか理解できなくて、-i
オプションを抜いてみた結果、コンテナから抜けたあとにホスト側?のバッシュが反応しなくなった。「ホスト側?の標準入力を開いたままにするかどうか」ということ。Ctrl+Cで再開できるけど、念のためつけておこう。
$ docker exec -t mysql5.6 /bin/bash root@6c309c073067:/# exit // Ctrl+Cで再開可能
docker stop コマンド
$ docker stop {コンテナ}
起動しているコンテナを停止させる。
例) mysql5.6という名前のコンテナを停止させる。
$ docker stop mysql5.6
mysql5.6
docker rm コマンド
$ docker rm {コンテナ}
コンテナを削除する。rm コマンドの前には stop コマンドでコンテナを停止させること。停止していないとエラーが出て、削除できない。
例) mysql5.6という名前のコンテナを削除する。
$ docker rm mysql5.6
docker rmi コマンド
$ docker rmi {イメージID / REPOSITORY ID:TAG}
イメージを削除する。
例) mysqlのイメージを削除したい場合
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.6 5f0b301e2e86 4 days ago 299MB
$ docker rmi 5f0b301e2e86
もしくは
$ docker rmi mysql:5.6
全てのイメージとコンテナを削除したいとき
Dockerの Preferences > Reset(爆弾マーク) > Remove all data > Delete で全て削除できる。
Dockerの機能
Dockerfileを自作する
DockerHubからダウンロードではなく、自分だけのDockerfileを作成することもできる。また、それをDockerHubに公開することもできる。
コンテナを組み合わせて使うことができる
データベース用のコンテナ、サーバー用のコンテナ、アプリケーション用のコンテナ...のように組み合わせて使用することのほうが多いらしい。
Docker Compose
Docker Composeについてはよく理解していない!!
- YAMLで記述
- 複数のDockerfileをまとめて管理する。
- 起動、終了、削除など
- それぞれのイメージを繋げる役割
LAMPのComposeを使ってみる。
$ git clone https://github.com/naga3/docker-lamp.git
docker-lamp $ tree . ├── README.md ├── docker-compose.yml ├── html │ └── index.php ├── mysql │ ├── Dockerfile │ └── my.cnf └── php ├── Dockerfile └── php.ini
Compose の使用
$ docker-compose up -d
YAMLに記述された順序で起動する。
Elasticsearch
Elasticseachについてはメモをそのまま
- 全文検索のDB
- Google検索のようなもの
- 自分のアプリに入れることができる
- すべてJSON形式のデータ(取得するのも、JSONで書かないといけない!!WHEREとかも)
- 中途半端な知識で使うのと、そのプロジェクトは炎上します!!!
普通のDBとの違い
どのようなデータを入れるか定義しないため、柔軟に使える
使い方
- ログ解析でKibana使うとか
デメリット
- 最初はJSONで書くのめんどくさい。
- データベース直接接続するのはめんどくさい。
Kibana
Dev Toolsの画面で、簡単にデータを入れることができる。
_index
データベース名
_type
テーブル名
_id
自動的に振られる一意のID