Docker for Windows で postgres コンテナの Volume マウントを安全にする


はじめに

Docker でコンテナを使ってDBを動かすとき、コンテナを落としてもデータが消えないよう、多くの人はDBのデータディレクトリをホスト側にマウントすると思います。

本記事は PostgreSQL についてですが、他DBでも同様だと思われます。

BAD: ホストOSのDirectoryをマウントする

一番Basicな方法だと思いますが、Windowsですと Permission denied だとか、書き込み時に initdb: could not fsync file Errorが頻発します。頑張ってLinuxの仮想FileSystemをWindows上で再現しているので折り合いが悪い様子。

### (a) コマンド直打ちの場合
$ docker run -d -v ./data:/var/lib/postgresql/data postgres:9.6.3-alpine
### (b) docker-compose.yml の場合
version: '2'
services:
  db:
    image: postgres:9.6.3-alpine
    volumes:
      - ./data:/var/lib/postgresql/data

Windows10 (Docker for Windows) の場合は↓も必要。

GOOD: Named Volume をマウントする

DockerNamed Volume にマウントする方法で安定しました。

### (a) コマンド直打ちの場合
$ docker volume create dbdata
dbdata

$ docker volume ls
DRIVER              VOLUME NAME
local               dbdata

$ docker run -d -v dbdata:/var/lib/postgresql/data postgres:9.6.3-alpine
### (b) docker-compose.yml の場合
version: '2'
services:
  db:
    image: postgres:9.6.3-alpine
    volumes:
      - dbdata:/var/lib/postgresql/data

volumes:
  dbdata:

データを消したい時はこうします。

$ docker volume ls
DRIVER              VOLUME NAME
local               dbdata
local               dockerpostgres_dbdata   # <-- docker-compose で作った方. 勝手にPrefixが付く

$ docker volume rm dbdata
dbdata

参考

今回も Stack Overflow 先生のおかげで助かりました。