Docker | docker-compose の基本 ( 公式チュートリアルより )

[Get started with Docker Compose - Docker Documentation](https://docs.docker.com/compose/gettingstarted/#step-1-setup) より

# 準備

デモ用のレポジトリをクローンする(非公式)。

```bash
$ git clone git@github.com:YumaInaura/study-docker.git

$ cd study-docker/composetest
```

もしくは、以下のファイルを手元にそれぞれ作成する。

## 1. python でウェブサーバーを起動するスクリプト

redis でアクセス回数を記録する。

```app.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.\n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)
```

## 2. python のモジュールをインストールするためのファイル

```requirements.txt
flask
redis
```

## 3. ウェブサーバーのイメージを作るための Dockerfile

```Dockerfile
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```

## 4. ウェブサーバーと Redis サーバーの起動手順を書いた docker-compose.yml

二つのコンテナを実行するための記述。

```docker-compose.yml
version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"
```

# 動作を試す

## compose の実行

```
$ docker-compose up
```

これだけで docker-compose.yml に書かれた手順でコンテナが作成される。

redis と ウェブサーバー、両方が起動しているのが分かる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/14f92641-b494-8420-3cd2-b3d0ea26446a.png)

## コンテナの確認

```
$ docker-compose ps
       Name                      Command               State           Ports
-------------------------------------------------------------------------------------
composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
composetest_web_1     python app.py                    Up      0.0.0.0:5000->5000/tcp
```

## ブラウザで確認

http://localhost:5000/ にアクセスする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ad496f91-98b2-75a5-c9f5-4df2c373826f.png)

## ボリュームの動作確認

docker-compose.yml に書いた `volumes:` で、ローカルとウェブサーバーのディレクトリをマウントしているので、手元からファイルを直接追加したり、削除したり出来る。

ローカルにファイルを作ると

```
echo 'Hello docker compose!' > hello.txt
```

ウェブサーバーにもファイルが出来ている。

```
$ docker exec composetest_web_1 cat hello.txt
Hello docker compose!
```

消すことも出来る

```
$ rm hello.txt
```

```
$ docker exec composetest_web_1 cat hello.txt
cat: can't open 'hello.txt': No such file or directory
```

## ウェブページに表示されるメッセージを変えてみる

ローカルのファイルを直接マウントしているので、手元のエディタも使える。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/59b41e7e-693d-7104-9b60-3a46649e2d7c.png)

### 変更

試しに、メッセージを大文字に変えてみると

```diff:app.py
- return 'Hello world! I have been seen {} times.\n'.format(count)
+ return 'HELLO WORLD! I have been seen {} times.\n'.format(count)
```

### 確認

http://localhost:5000/ でもメッセージが変わっているのが分かる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/142de85a-f665-67c4-4800-0ad5c172cacf.png)

## サービスを停止する

```
$ docker-compose down
```

でサービスの停止(各コンテナの終了)が出来る。

# 環境

- Docker version 17.03.1-ce, build c6d412e








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->