TIL

Today I Learned. 知ったこと、学んだことを書いていく

「2時間でマスターしちゃう Docker&Elasticsearch ハンズオン 入門」に参加した

Dockerの勉強会に行ってきたのでメモしておく。人生初めての勉強会参加。

この勉強会では、Dockerの基礎とElasticsearchについて少しだけ触れた。

まとめていたらすごい長くなってしまった。あと、まだ資料が届いていないため、内容を変えるかもしれない。(2017/10/21 19:54)

Docker

DockerはVMよりも無駄が少ない。

VMの場合、仮想OSを立ち上げてその環境に必要なソフトをインストールするため、無駄な部分(自分が必要としていない部分)まで構築されてしまう。しかし、Dockerの場合、DockerEngineという層の上に必要なソフトのみを構築できるため、無駄な部分がほとんどない。

Dockerの利点

  1. Dockerfileを共有できる 例えば、あるプロジェクトに新メンバーが参画したときにDockerfileを共有して実行してもらうだけで環境構築が簡単にできる。といったことが実現できる。

  2. マシン固有の問題がなくなる Docker上で開発を行うことで、マシンの環境に関係なく開発を行える。

  3. コンテナごとに環境変数を設定できる 環境変数を分けることができるため、別のコンテナで同じ環境変数を使うときに、問題が起きにくくなる。

用語

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 -aCONTAINER IDNAMESを指定する。

$ 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 の使用

composeのYAMLがあるディレクトリで

$ docker-compose up -d

YAMLに記述された順序で起動する。


Elasticsearch

Elasticseachについてはメモをそのまま

  • 全文検索のDB
  • Google検索のようなもの
  • 自分のアプリに入れることができる
  • すべてJSON形式のデータ(取得するのも、JSONで書かないといけない!!WHEREとかも)
  • 中途半端な知識で使うのと、そのプロジェクトは炎上します!!!

普通のDBとの違い

どのようなデータを入れるか定義しないため、柔軟に使える

使い方

  • ログ解析でKibana使うとか

デメリット

  • 最初はJSONで書くのめんどくさい。
  • データベース直接接続するのはめんどくさい。

Kibana

Dev Toolsの画面で、簡単にデータを入れることができる。

_indexデータベース名 _typeテーブル名 _id自動的に振られる一意のID