Docker ComposeのVolumeにNFSを指定する

最近教えてもらった技なのですが、Docker ComposeのVolumesにはNFSストレージをマウントすることができるようです。

やってみたので、忘れないようにメモ。ちなみに、今回は[Growi](https://growi.org/)というOSSのWikiを動かす例です。

Docker Composeのバージョンは以下。

```
$ docker-compose -v
docker-compose version 1.21.2, build a13347
```

---

Growiは公式で`docker-compose.yml`を公開しているので、まずはそちらをもらって来ました。

[weseek/growi-docker-compose: growi-docker-compose - The fastest way to boot GROWI](https://github.com/weseek/growi-docker-compose)

こちらにあります。

```yml
version: '3'

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 127.0.0.1:3000:3000    # localhost only by default
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      # - FILE_UPLOAD=local    # activate this line if you use local storage of server rather than AWS
      # - MATHJAX=1            # activate this line if you want to use MathJax
      # - PLANTUML_URI=http:// # activate this line and specify if you use your own PlantUML server rather than public plantuml.com
    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:3.4
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    image: elasticsearch:5.3-alpine
    environment:
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
    command:
      - sh
      - -c
      - "./bin/elasticsearch-plugin list | grep -q analysis-kuromoji || ./bin/elasticsearch-plugin install analysis-kuromoji;
        ./bin/elasticsearch-plugin list | grep -q analysis-icu || ./bin/elasticsearch-plugin install analysis-icu;
        /docker-entrypoint.sh elasticsearch"
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - es_plugins:/usr/share/elasticsearch/plugins
      - ./esconfig:/usr/share/elasticsearch/config

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:
  es_plugins:
```

だいぶ長いですが、こんな感じになっています。

現状、`volumes`には特に値が設定されていないので、ホストの`/var/lib/docker/volumes`以下に保存されます。

これを以下のようにすることで、保存先をNFSストレージに変更することができます。

```yml
volumes:
  growi_data:
    driver_opts:
      type: nfs
      o: "addr=192.168.1.2,hard,rsize=1048576,wsize=1048576,nfsvers=4"
      device: ":/volume1/wiki-data/growi_data"
  mongo_configdb:
    driver_opts:
      type: nfs
      o: "addr=192.168.1.2,hard,rsize=1048576,wsize=1048576,nfsvers=4"
      device: ":/volume1/wiki-data/mongo_configdb"
  mongo_db:
    driver_opts:
      type: nfs
      o: "addr=192.168.1.2,hard,rsize=1048576,wsize=1048576,nfsvers=4"
      device: ":/volume1/wiki-data/mongo_db"
  es_data:
    driver_opts:
      type: nfs
      o: "addr=192.168.1.2,hard,rsize=1048576,wsize=1048576,nfsvers=4"
      device: ":/volume1/wiki-data/es_data"
  es_plugins:
    driver_opts:
      type: nfs
      o: "addr=192.168.1.2,hard,rsize=1048576,wsize=1048576,nfsvers=4"
      device: ":/volume1/wiki-data/es_plugins"
```

このような感じ。`o`にはNFSマウントするときのオプションを渡すことができます。

あとは通常通り`docker-compose up`してあげることで、自動的にマウントされてそちらを使ってくれます。