Deal with persistent storage with Docker volumes

-v /var/lib/mysql 和 Dockerfile 裡的 VOLUME ["/var/lib/mysql"]
僅僅是 mkdir -p 然後「標示」該目錄要作為 volume
讓你可以在其他 container 使用 --volumes-from 來 mount 這個目錄
除此之外沒有做其他事

-v /host/path/:/var/lib/mysql 是把 host 的目錄 mount 進 container
但是不建議這麼做
因為這樣就不 portable 了

無論是 -v 還是寫在 Dockerfile 裡的 VOLUME
volume 都是在 docker run 的時候才建立的
volume 是跟著 container 而不是 image

volume 會一直存在
直到你用 docker rm -v 刪掉最後一個關聯到它的 container 為止

--

要注意的是
如果你寫

VOLUME ["/etc/mysql", "/var/lib/mysql"]
RUN apt-get update && apt-get install -y \
    mysql-server-5.5

因為在安裝 mysql 之前
就先建立了 /etc/mysql/var/lib/mysql 這兩個空目錄
所以 mysql-server 就不會幫你塞那些 config 檔案和執行 mysql_install_db 了

--

官方的建議是各開一個 mysql container 和 mysql data container
好處是之後你要升級 mysql 時
只要用新版本的 mysql container 去 --volumes-from 那個 mysql data container 即可

ref:
http://www.offermann.us/2013/12/tiny-docker-pieces-loosely-joined.html
http://stackoverflow.com/questions/25401951/mysql-installed-and-persisting-data-in-docker-images

如果你只用一個 mysql container 並 VOLUME ["/var/lib/mysql"] 的話
之後再開一個新版本的 mysql container 去 --volumes-from
會因為有兩個 container 都 EXPOSE 3306
所以那個新版本的 container 開不起來

不過
平常開發的話
其實一個 mysql container 也就可以了
只要 mysql container 有 VOLUME ['/var/lib/mysql/'] 目錄
之後要存取 mysql data 時
只需要 --volumes-from mysql_container 即可