Dockerとdocker-composeを最低限の知識でお遊び程度に使う

どっかーわかんない！！！
ざっくり自分向けメモですのであしからず。

大まかな流れとしては
Dockerfileを書く→ビルドをするとイメージが出来上がる→イメージを元にコンテナを立ち上げる。

# Dockerfile
Dockerfileを作ることでイメージを自作できる。

`FROM`にベースとなるイメージ名書く。
`RUN`はイメージをビルドするときにコンテナに実行させるコマンドを書く。
`CMD`はコンテナが起動したあとにコンテナに実行させるコマンドを書く。
`COPY`や`ADD`はホストからファイルを取り込むことができる。

もちろんコレだけじゃないけど、僕はコレくらいでもの足りる程度のことしかしてないのでコレだけ。

```dockerfile:Dockerfile
# DockerHubにあるubuntuイメージを元にする
FROM ubuntu

# コンテナのなかでコマンド実行
RUN apt-get -y update && apt-get install -y python3-pip python3-dev vim

# flaskが使いたいので
RUN pip3 install flask

# ホストにあるpythonのスクリプトを持ってくる
COPY src/ /opt/

# コンテナでFlaskを使ってるPythonのやつを動かす
CMD python3 /opt/app.py

```

# build

```bash
$ docker build -t <イメージ名> <Dockerfileのあるパス>

# 作業ディレクトリにあるなら...
$ docker build -t <イメージ名> .
```

`-t`オプションをつけることでイメージに任意の名前をつけることができる。
名前つけないとわかりにくいしつけるべきだと思う。

ビルドして得られたイメージは`/var/lib/docker`とかそのへんのシステムのとこに置かれている。
イメージのパスは把握してなくてもよさそう。

作成・取得したイメージは`docker images`コマンドで確認できる。
名前つけないといい加減に与えられた英数字のIDを使う羽目になってメッチャめんどくさいので名前つけような。

## ちなみに
`-f`オプションでDockerfileの名前を指定できる。

```bash
$ docker build -t <イメージ名> -f <Dockerfileの名前> <Dockerfileのあるパス>
```

# run
さて、イメージも作れたしコンテナ起動すっかぁ〜！
`docker run`コマンドでコンテナを作成する。

```bash
$ docker run -it --name <コンテナ名> <イメージ名> <起動後に実行したいコマンド>
```

`-i`オプションはコンテナの入力にホストの入力を繋いでくれる。
`-t`オプションはコンテナのターミナルをホストのターミナルに繋いでくれる。

作られたコンテナもイメージと同じようにシステムのディレクトリに保存される。
コンテナは名前がかぶると「名前かぶっとるんやが？」とコンテナを上書きせずにキレる。

同名のコンテナを再度作るときは削除した後に`docker run`をする必要がある。

## 消したり、一覧見たり

```bash
# コンテナの様子をみる（-aオプションで動いていないやつも表示）
$ docker ps -a

# コンテナ削除
$ docker rm <コンテナ名>

# イメージ削除
$ docker rmi <イメージ名>
```

## オプション系

### --rm

`docker rm`でわざわざ消すのめんどっちーってときは`--rm`オプションをつけることで回避できる。

```bash
$ docker run -it --name <コンテナ名> --rm <イメージ名>
```

### -d

フォアグラウンドに来んなや！！って思うときは`-d`オプションをつける。（デタッチ）

```bash
$ docker run -itd --name <コンテナ名> <イメージ名>
```

デタッチしたやつにつなぎたいときはコレを唱える。

```bash
$ docker exec -i -t <コンテナ名> bash
```

### -p

`-p`オプションでホストとコンテナ内のポートを繋げられる。

```bash
$ docker run -itd -p <ホストのポート>:<コンテナのポート> --name <コンテナ名> <イメージ名>
```

# コンテナのなかで動かしてるFlask製webページにアクセスする

```bash
# コンテナをうごかす
$ docker run -itd -p 30000:80 --name <コンテナ名> --rm <イメージ名>
```

で、ホストのブラウザとかで`localhost:30000`にアクセス。

# docker-compose
docker-composeは複数のdockerコマンドをdocker-compose.ymlに書いて`docker-compose up`一発でコンテナが全部動くようにしよう！的なノリのヤツ。
image名とか、開けるポートとか、ビルドするDockerfileのパスとかをまとめてdocker-compose.ymlに書いてあげる。

そうすると、コンテナを起動したいときに` docker run -itd -p 30000:80 --name <コンテナ名> --rm <イメージ名>`とか打つことなく、`docker-compose up`だけで済むのだ。くぅ〜怠惰ァ〜！！
あとは、複数個コンテナを立ち上げる必要がある場合

示した例をdocker-compose.ymlに書いてみるとこうなる。

```yml
version: '2'

services:
  <コンテナ名>:
    image: <イメージ名>
    build: <Dockerfileのあるパス>
    ports:
      - "<ホスト側のポート番号>:<コンテナ側のポート番号>"  # ホスト側とコンテナ側のポートを繋いでくれる
    command: <コンテナ起動後に実行させたいコマンド>
```

他にもオプションは色々あるけど、とりあえずこの程度で。
.ymlファイルの記述にはタブ文字が使えない。タブ文字を含めてしまうとコマンド実行時に「知らない文字あるんやが？」とエラーが出るので気をつけよう。

コイツを使って起動するときのコマンドはこんな感じ。

```sh
# イメージをビルド
docker-compose build

# 起動
docker-compose up

# バックグラウンドで起動
docker-compose up -d

# イメージをビルドし、起動
docker-compose up -build -d

# docker-compose.ymlが別名のときはコレを使うとよし
docker-compose -f <docker-compose.ymlのパス> up -build -d

# 止める
docker-compose stop

# docker-compose.ymlにかかれているコンテナを削除
docker-compose rm

# 停止、削除を一気にやる
docker-compose down

# それに加えてイメージも消しちゃう
docker-compose down --rmi all
```

Dockerコマンドと同じく`-d`オプションはバックグラウンドで、`-build`オプションでイメージをビルドしつつコンテナを立ち上げることができる。
`-build`オプションをつけることで、Docker周りの作業中の起動テストが行いやすくなるんじゃないかな。

# 参考にしたサイト
さくらのナレッジさんの記事を読んでとりあえず使えるようになりました。ありがとうございます。

[さくらのナレッジ Docker入門](https://knowledge.sakura.ad.jp/13265/)
[Dockerのイメージファイルの格納場所](https://qiita.com/tifa2chan/items/b9607d80fb58476e4ef5)
[ねここくぶろぐ Dockerイメージ、コンテナの場所](https://www.neko6.info/archives/1979)
[Dockerfileを極めて、Dockerマスターになろう！](https://qiita.com/soushiy/items/0945bcbc7ecce4822985#%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%96%87)
[Dockerコンテナのシェルの中に入る](https://qiita.com/__cooper/items/4740c24666299c366044)
[Docker ドキュメント日本語化プロジェクト](http://docs.docker.jp/index.html)

2018/11/15 誤字訂正しました。編集リクエストありがとうございます。