---
# System prepended metadata

title: 'Docker/k8s 輪読会 ch2.4~2.6 :whale:'
tags: [docker]

---

###### tags: `docker`

# Docker/k8s 輪読会 ch2.4~2.6 :whale:


## :white_check_mark: 今回の目標

* LinuxとDockerコマンドを復習する
* docker-composeで実行する
* ch3: [実用的なコンテナの構築とデプロイ](https://hackmd.io/@rhHzPg4WS26yfiXdOaOMTg/HJCnty4pS)

## :no_entry: 注意事項

* Docker CEのインストールおよび設定を終えている前提です
* docker-composeのインストールが完了している前提です
* 本の内容通りに進まないため、本の内容は各自で復習してください
* 発表者はDockerの素人です、お許しください :bow: 

2章後半[ソース](https://github.com/nakajima1412/docker-k8s/tree/master/ch2)

## 復習: Linux & Docker コマンドの練習

### Linux環境の構築
---


![](https://i.imgur.com/fSDAOon.png)

下記のDokcerfileを作成し、Linuxのコマンドを色々叩きましょう

1. イメージの指定
2. aptで`htop tree`パッケージをインストール
3. bash 起動

バックスラッシュは改行しても1行のコマンドとするためのものです

==Dockerfile==
```dockerfile=
FROM debian:stretch-slim
RUN apt update && apt install -y \
htop \
tree
CMD ["/bin/bash"]
```
Dockerfileのあるディレクトリでイメージを作成します
docker build [オプション] [イメージ名] [パス]

```bash
$ docker build -t debian-ex .
```

imageができているか確認

```bash
$ docker images                                         

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian-ex           latest              ae41d24b056a        12 seconds ago      71.8MB
```

docker run -[オプション] [イメージ名] [実行内容] でコンテナ内に入ります

```bash
$ docker run -it debian-ex bash
```

docker内に入ると次のようなコンソールが表示されます

```bash
root@97b10cc4b4bc:/# 
```

### Linuxコマンドの演習
---
Docker内のコンソール上で色々なコマンドを叩いてみましょう
コマンドを意味と関連付けると覚えやすいと思います
参考：[Linuxコマンドは単語の意味を理解するとグッと身近なものになる](https://qiita.com/tetsuya/items/46888bb4dfc8a6bfef02)

* top, htop
実行中のプロセスをグラフィカルに表示するコマンド
サーバの障害発生時にはまず叩くコマンド
※普通は`top`を使いますが、イメージのなかにないです:innocent:
```bash
root@97b10cc4b4bc:/# htop
```
停止するのは`ctrl + C`

* ls, tree
`ls`:ディレクトリの一覧を表示するコマンド,
オプションによって色々できる
`tree`:木構造表示

```bash
root@97b10cc4b4bc:/# ls
root@97b10cc4b4bc:/# ls -a #all オプション
root@97b10cc4b4bc:/# ls -lt #long format + time sort オプション
root@97b10cc4b4bc:/# tree #表示終了は q を押す
```

* cd
ディレクトリ移動するコマンド
`change directory` の略語と思われます

```bash
root@97b10cc4b4bc:/# cd etc
root@97b10cc4b4bc:/# ls #etc内のファイルを確認
```

* cat, less
ファイルの中身を確認するコマンド
※今回のイメージには`less`コマンドはありません

```bash
root@97b10cc4b4bc:/# cat /etc/os-release
```

* exit
サーバから出るコマンド

```bash
root@97b10cc4b4bc:/# exit
```
実行後は通常のコンソールに戻ります

```bash
$ 
```

### Linux 環境の破棄

Linuxコマンド演習で作成した環境を破棄します

* 全コンテナの確認

```bash
$ docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                            NAMES
5eb5503bddcf        debian-ex           "bash"                   23 minutes ago      Exited (0) 13 minutes ago                                                    cocky_kalam
97b10cc4b4bc        debian-ex           "bash"                   About an hour ago   Exited (0) 23 minutes ago                                                    wizardly_thompson
```

* 停止中のコンテナの破棄

途中で `y` を入力

```console
$ docker container prune

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5eb5503bddcf9863383605388100a268f7be920fb9521951bb24c1ac942f4921
97b10cc4b4bc6e9564c2daf38e0cbf13dae25d9965dbf8bc9c726d04573d118a

Total reclaimed space: 348B
```
* イメージの確認

```bash
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
debian-ex           latest              f8d60d795e4d        About an hour ago   72.9MB
```

* イメージの削除
```bash
$ docker image rm debian-ex

Untagged: debian-ex:latest
Deleted: sha256:f8d60d795e4d4b6f7d473b2a491c0c84ea243fc58e2df45d42a7049f22e93d17
Deleted: sha256:a803bac52663f792af1a270ddfdf4f70e1b21f7aa4d3a46896d8b9d9ca0437cb
Deleted: sha256:c2b8c1ff1294a0342cf8322478573997d18cf0ab581741344fe233ac6dd20481
```

### Dockerfile作成演習1 :steam_locomotive:
---

slパッケージをインストールしたイメージを作成し、このイメージからslコマンドを実行するコンテナを実行してください。

* Dockerfile

| 項目       | 内容                |
| ---------- | ------------------- |
| イメージ   | debian:stretch-slim |
| CMD        | /usr/games/sl       |

* ヒント

下記のDockerfileの空欄部分を完成させる　

==Dockerfile==

```dockerfile=
FROM 
RUN 
ENV TERM xterm #環境変数の設定
CMD [""]
```

実行するもの

```bash
$ apt update
$ apt install -y sl
```

### 解答例


```dockerfile=
FROM debian:stretch-slim
RUN apt update && apt install -y sl
ENV TERM xterm
CMD ["/usr/games/sl"]
```

```bash
docker build -t sl .
docker run --rm sl
```

### Dockerfile作成演習2 :fish: 
---

asciiquariumパッケージをインストールしたイメージを作成し、このイメージからslコマンドを実行するコンテナを実行してください。

* Dockerfile

| 項目       | 内容                |
| ---------- | ------------------- |
| イメージ   | fedora:latest |
| ENTRYPOINT | /usr/bin/asciiquarium  |

* ヒント

実行するもの

```bash
$ dnf install asciiquarium
```

ENTRYPOINT: P42をみてください

### 解答

```dockerfile=
FROM fedora:latest
RUN dnf install -y asciiquarium
ENTRYPOINT /usr/bin/asciiquarium
```

```bash
$ docker build -t fish .
$ docker container run -it fish 
```

## 2.5 Docker Compose でマルチコンテナを実行する

Composeはysml形式の設定ファイルで、複数のコンテナ実行を一括で管理できます。
また、ネットワーク、依存関係、環境変数を設定することができます。

### yamlファイル
---

[Get started with Docker Compose](https://docs.docker.com/compose/gettingstarted/)を例に解説します。
全体のコードは[こちら](https://github.com/nakajima1412/docker-k8s/tree/master/ch2/ex5)においておきます。

==dcoker-compose.yml==

```yaml
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
```

* version
docker-composeのバージョンを指定します。

```yaml
version: '3'
```

* services
起動コンテナを定義します。
今回は`web`,`redis`の2つの起動を定義しています。


```yaml
services:
  web:
  redis:
```

コンテナイメージは、次の`image`か`build`によって指定する必要があります。

* image
コンテナを起動するDocker imageを指定します。
redisは公式のイメージを指定しています。

```yaml
image: "redis:alpine"
```

* build
Dockerfileをもとに`$ docker build -f `を実行します。

```yaml
build: .
```

* ports
ポートフォワーディング行います。
`ホストのポート:コンテナのポート`を指定します。
dockerコマンドの場合、 `-p 5000:5000` オプションと同一です。

```yaml
ports:
  - "5000:5000"
```

* volume
ボリュームをマウントします。

```yaml
volumes:
  - .:/code
```

* environment
起動するコンテナの環境変数を定義します。
今回はflaskの環境設定をしています。

```yaml
environment:
  FLASK_ENV: development
```

### コンテナの起動

```bash
$ docker-compose up
```
`ctrl` + `C` でコンテナ内から抜けることができます。

オプションで`-d`をつけることで、バックグラウンドで起動できます

```bash
$ docker-compose up -d
```

### コンテナの停止・削除

```bash
$ docker-compose down
```

### テキストの内容を実行

ch2.5の内容を実行してみましょう（homework）

```yaml=
version: "3"
services:
  echo:
    image: example/echo:latest
    ports:
    - 9000:8080
```


## docker-compose実行演習

[Dockerfile作成演習1](https://hackmd.io/xjO0dMYJTPeVhE76r41Xbg?view#Dockerfile%E4%BD%9C%E6%88%90%E6%BC%94%E7%BF%921-)で作成した`sl`イメージを用いて、docker-composeを実行してください。

dokcer-compose


| 項目      | 内容      |
| -------- | -------- |
| service     | 3     |
| 起動コンテナ | sl      |
| イメージ     | sl     |


### 解答例

```bash
$ docker-compose up
```

[ソースファイル](https://github.com/nakajima1412/docker-k8s/tree/master/ch2/ex6)

