1.創(chuàng)建volume
- Docker 1.9之后引入新的子命令,
docker volume,可以對volume進行創(chuàng)建、查看和刪除。
$ sudo docker volume create --name vol_simple
- 使用docker run或docker create創(chuàng)建容器時,也可以使用-v標簽為容器添加volume。
$ sudo docker run -d -v /data ubuntu
- 以下命令創(chuàng)建制定名字volume,并掛載到容器中到/data目錄下
$ sudo docker run -d -v vol_simple: /data ubuntu
- 使用docker volume inspect查看volume到信息
$ sudo docker volume inspect vol_simple
2.掛載volume
- 使用如下命令創(chuàng)建并掛載volume
$ sudo docker volume create --name vol
$ sudo docker run -d -v vol: /data ubuntu
- 將宿主機上到目錄掛載到容器中,文件夾必須使用絕對路徑,如果宿主機中不存在/host/dir,將創(chuàng)建一個空文件夾。如果鏡像中原本存在/container/dir文件夾,該文件夾下原有到內(nèi)容將被隱藏,以保持與宿主機中到文件夾一致。(以主機內(nèi)容為主)
$ sudo docker run -v /host/dir:/container/dir ubuntu
- 掛載單個文件,文件必須使用絕對路徑,文件不存在/host/file,則創(chuàng)建一個同名空目錄。掛載后文件內(nèi)容與宿主機到文件一致,也就是說如果容器中原本存在/container/file,該文件將被隱藏。(以主機內(nèi)容為主)
$ sudo docker run -it -v /host/file:/container/file ubuntu
- 主機到文件或文件夾作為volume掛載時,可以使用:ro指定volume為只讀,z和Z指定為是否共享,默認為z,即共享該volume
$ sudo docker run -it -v /host/dir:/container/dir:ro
3.使用Dockerfile添加volume
1.使用VOLUME指令向容器添加volume,如果鏡像中存在/data文件夾,這個文件夾中到內(nèi)容將全部復制到宿主機對應到文件夾下。(以容器內(nèi)容為主)
VOLUME /data
使用VOLUME可以添加多個volume:VOLUME ["/data1","/data2"].
2.需要注意到是,在Dockerfile中使用VOLUME指令之后到代碼,如果嘗試對這個volume進行修改,這些修改都不會生效。例如:
FROM ubuntu
RUN useradd foo
VOLUME /data
RUN touch /data/file #不生效
RUN chown -R foo:foo /data #不生效
正確為:
#改變對volume文件夾修改對順序
FROM ubuntu
RUN useradd foo
RUN mkdir /data && touch /data/file && chown -R foo:foo /data
VOLUME /data
或者
# 將修改操作放到CMD或者ENTRYPOINT指令中
FROM ubuntu
RUN useradd foo
VOLUME /data
CMD touch /data/file && chown -R foo:foo /data
4.共享volume
- 在docker run或者docker create創(chuàng)建容器時,可以使用--volumes-from標簽使得容器與已有的容器共享volume。
$ sudo docker run --rm -it --volumes-from vol_simple ubuntu
- 如果一些數(shù)據(jù),比如配置文件、數(shù)據(jù)文件等,要在多個容器之間共享,一種常見的做法時創(chuàng)建一個數(shù)據(jù)容器,其他容器與之共享volume。
如下:首先創(chuàng)建一個掛載了volume的數(shù)據(jù)容器vol_data,該容器僅僅輸出一條提示后就停止運行以避免浪費資源;接下來的兩個容器與這個數(shù)據(jù)容器共享這個volume;如此就將需要共享數(shù)據(jù)的容器進行較好的解耦。
$ sudo docker run --name vol_data -v /data ubuntu echo "data-only"
$ sudo docker run -it --name vol_share1 --volumes-from vol_data ubuntu
$ sudo docker run -it --name vol_share2 --volumes-from vol_data ubuntu
5.刪除volume
- docker volume rm <volume_name>
- docker rm -v <container_name>
- 在運行容器時使用docker run --rm,--rm標簽會在容器停止運行時刪除容器以及容器所掛載的volume