天天看點

docker卷挂載與容器内外互相拷貝資料

一、主控端與容器的挂載

docker可以支援把一個主控端上的目錄挂載到鏡像裡。指令如下:

docker run -it -v /mydownload:/download nginx:v1 /bin/bash      

通過-v參數,冒号前為主控端目錄,必須為絕對路徑,冒号後為鏡像内挂載的路徑。

現在鏡像内就可以共享主控端裡的檔案了。

預設挂載的路徑權限為讀寫。如果指定為隻讀可以用:ro, 之後在容器内進行檔案的操作,将報出以下錯誤

$ touch text.txt
touch: cannot touch 'text.txt': Read-only file system      

二、資料卷容器

如果你有一些持續更新的資料需要在容器之間共享,最好建立資料卷容器。

資料卷容器,其實就是一個正常的容器,專門用來提供資料卷供其它容器挂載的。

首先,建立一個普通的資料卷容器。用--name給他指定了一個名(不指定的話會生成一個随機的名子)。

docker run -it -v /mydownload/:/download --name dataVol nginx:v1 /bin/bash      

再建立一個新的容器,來使用這個資料卷。

docker run -it --volumes-from dataVol nginx:latest /bin/bash      

--volumes-from用來指定要從哪個資料卷來挂載資料。

可以看到每個容器中都有挂載目錄/download

$ docker run -it --volumes-from dataVol nginx:latest /bin/bash
$ ls
bin  boot  dev    download  etc  home  lib  lib64  media    mnt  opt  proc    root  run  sbin  srv  sys  tmp    usr  var      

三、容器内外互相拷貝資料

   1、從容器内拷貝檔案到主機上

docker cp <containerId>:/file/path/within/container   /host/path/target        

   <containerId>:/file/path/within/container 表示容器id加具體路徑,

2、從主機上拷貝到容器(用卷挂載或直接拷貝)
 這裡将直接拷貝的方式
 第一步:擷取容器的完整ID:FULL_CONTAINER_ID      
docker inspect -f   '{{.Id}}' {CONTAINER ID}
或
docker inspect -f  '{{.Id}}'  {CONTAINER NAME}      
sudo cp file.txt /var/lib/docker/aufs/mnt/**FULL_CONTAINER_ID/PATH-NEW-FILE          

繼續閱讀