docker-compose 試す

docker-compose試す。

## nginxを起動するシンプルなdocker-compose構成

```Dockerfile
FROM centos:centos8

RUN dnf install -y nginx

CMD nginx -g 'daemon off;'
```

```docker-compose.yml
version: '3'
services:
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - ./hoge:/hoge
```

### 基本操作

```s
// 起動
$ docker-compose up -d
Creating network "docker-compose-test_default" with the default driver
Creating docker-compose-test_web_1 ... done

// コンテナ確認
$ docker-compose ps 
          Name                         Command               State          Ports        
-----------------------------------------------------------------------------------------
docker-compose-test_web_1   /bin/sh -c nginx -g 'daemo ...   Up      0.0.0.0:8000->80/tcp

// 停止
$ docker-compose stop 
Stopping docker-compose-test_web_1 ... done

// 停止&削除
$ docker-compose down
Removing docker-compose-test_web_1 ... done
Removing network docker-compose-test_default

$ docker-compose ps
Name   Command   State   Ports
------------------------------
```

## プロジェクト名
docker-composeにはプロジェクトという概念があり、プロジェクト名を付けることができる。
docker-compose ps コマンドで見たコンテナ名が`docker-compose-test_web_1`になっていたが、コンテナ名はプロジェクト名 + サービス名になる。
プロジェクト名はデフォルトでdocker-compose.ymlがあるディレクトリ名になる。
プロジェクト名の指定は、-pオプションを使うか、COMPOSE_PROJECT_NAME環境変数に定義する。

```s
// -pで指定する。-pを付ける場所に注意。upの後に-pするのではなくdocker-composeの直後に行う
$ docker-compose -p hogeee up -d
Creating network "hogeee_default" with the default driver
Building web
Step 1/3 : FROM centos:centos8
 ---> 0d120b6ccaa8
Step 2/3 : RUN dnf install -y nginx
 ---> Using cache
 ---> fc9418763f55
Step 3/3 : CMD nginx -g 'daemon off;'
 ---> Using cache
 ---> 6d41d3e27b18

Successfully built 6d41d3e27b18
Successfully tagged hogeee_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating hogeee_web_1 ... done


// ps確認。毎回-p付ける必要があることに注意
$ docker-compose -p hogeee ps
    Name                  Command               State          Ports        
----------------------------------------------------------------------------
hogeee_web_1   /bin/sh -c nginx -g 'daemo ...   Up      0.0.0.0:8000->80/tcp

// 停止&削除
$ docker-compose -p hogeee down 
Stopping hogeee_web_1 ... done
Removing hogeee_web_1 ... done
Removing network hogeee_default


// 環境変数で指定する。
$ COMPOSE_PROJECT_NAME=fuga docker-compose up -d
Creating network "fuga_default" with the default driver
Building web
Step 1/3 : FROM centos:centos8
 ---> 0d120b6ccaa8
Step 2/3 : RUN dnf install -y nginx
 ---> Using cache
 ---> fc9418763f55
Step 3/3 : CMD nginx -g 'daemon off;'
 ---> Using cache
 ---> 6d41d3e27b18

Successfully built 6d41d3e27b18
Successfully tagged fuga_web:latest
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating fuga_web_1 ... done

$ COMPOSE_PROJECT_NAME=fuga docker-compose ps 
   Name                 Command               State          Ports        
--------------------------------------------------------------------------
fuga_web_1   /bin/sh -c nginx -g 'daemo ...   Up      0.0.0.0:8000->80/tcp
```

## docker-compose.ymlでimageを指定する

```
version: '3'
services:
    centos8:
        image: centos:centos8
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - ./hoge:/hoge
```


## depends_onによる起動順番制御
depends_onで起動順番を制御できる。起動順番は制御できるが、起動完了を待たないで次の起動に入るのでdb -> webの順番で起動したとしてもdbのセットアップ等が終わる前にwebが起動する可能性がある。その間にwebからdbにアクセスするとエラーになる可能性がある。
回避策としてはこちらに↓
https://docs.docker.com/compose/startup-order/

```
version: '3'
services:
    centos8:
        image: centos:centos8
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - ./hoge:/hoge
        depends_on:
            - centos8
```

確認。centos8 -> webの順番で起動する。削除時は逆になる。
```
$ docker-compose up -d
Starting docker-compose-test_centos8_1 ... done
Starting docker-compose-test_web_1     ... done

// 削除
$ docker-compose down 
Stopping docker-compose-test_web_1 ... done
Removing docker-compose-test_web_1     ... done
Removing docker-compose-test_centos8_1 ... done
Removing network docker-compose-test_default
```


depends_onを逆につける。

```
version: '3'
services:
    centos8:
        image: centos:centos8
        depends_on:
            - web
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - ./hoge:/hoge

```

確認。webから起動するようになった。

```
docker-compose up -d
Starting docker-compose-test_web_1 ... done
Starting docker-compose-test_centos8_1 ... done
```


## volumesを使う
コンテナ間で共有のvolumeを使う。
↓とりあえずdocker-composeでvolumeを作成してみる。

```
version: '3'
services:
    centos8:
        image: centos:centos8
        depends_on:
            - web
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - ./hoge:/hoge

volumes:
    hoge:
```


↓ volumeが作成される。

```
$ docker-compose up -d 
Creating network "docker-compose-test_default" with the default driver
Creating volume "docker-compose-test_hoge" with default driver
Creating docker-compose-test_web_1 ... done
Creating docker-compose-test_centos8_1 ... done

$ docker volume ls
DRIVER    VOLUME NAME
local     docker-compose-test_hoge
```

サービスでvolumeをマウントする。

```
version: '3'
services:
    centos8:
        image: centos:centos8
        depends_on:
            - web
        volumes:
            - hoge:/hoge
    web:
        build: .
        ports:
            - 8000:80
        volumes:
            - hoge:/hoge

volumes:
    hoge:

```