Dockerfile數據管理

本文介紹Docker內部以及容器間的數據管理,在容器中管理數據主要有兩種方式:python

  • 數據卷(Volumes)
  • 掛載主機目錄(Bind mounts)

數據卷

數據卷是一個可供一個或則多個目錄使用的特殊目錄,它繞過UFS,能夠提供不少有用的特性:web

  • 數據卷能夠在容器之間共享共用
  • 對數據卷的修改會立馬生效
  • 對數據卷的更新,不會影響鏡像
  • 數據卷默認會一直存在,即便容器被刪除

注意: 數據卷 的使用,相似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷docker

建立一個數據卷

sudo docker volume create my-vol

查看全部的數據卷:ubuntu

docker volume ls

DRIVER              VOLUME NAME
local               my-vol

在主機裏使用以下命令能夠查看指定數據卷的信息:bash

sudo docker volume inspect my-vol

[
    {
        "CreatedAt": "2018-01-12T15:09:40+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

啓動一個掛載數據卷的容器

在用docker run命令的時候,使用--mount標記來將數據卷掛在到容器裏,在一次的docker run中能夠掛載多個數據卷app

下面建立一個名爲 web 的容器,並加載一個 數據卷 到容器的 /webapp 目錄。webapp

sudo docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

查看數據卷的具體信息

在主機裏使用如下命令能夠查看 web 容器的信息測試

docker inspect web

數據卷 信息在 "Mounts" Key 下面設計

"Mounts": [
{
    "Type": "volume",
    "Name": "my-vol",
    "Source": "/var/lib/docker/volumes/my-vol/_data",
    "Destination": "/app",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
    }
]

刪除數據卷

sudo docker volume rm my-vol

數據卷 是被設計用來持久化數據的,它的生命週期獨立於容器,Docker 不會在容器被刪除後自動刪除 數據卷 ,而且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷 。若是須要在刪除容器的同時移除數據卷。能夠在刪除容器的時候使用 docker rm -v 這個命令。無主的數據卷可能會佔據不少空間,要清理請使用如下命令code

無主的數據卷可能會佔據不少空間,要清理請使用如下命令

docker volume prune

掛載主機目錄

掛載一個主機目錄做爲數據卷

使用 --mount 標記能夠指定掛載一個本地主機的目錄到容器中去。

sudo docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

上面的命令加載主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄。這個功能在進行測試的時候十分方便,好比用戶能夠放置一些程序到本地目錄中,來查看容器是否正常工做。本地目錄的路徑必須是絕對路徑,之前使用 -v 參數時若是本地目錄不存在 Docker 會自動爲你建立一個文件夾,如今使用 --mount 參數時若是本地目錄不存在,Docker 會報錯

Docker 掛載主機目錄的默認權限是 讀寫 ,用戶也能夠經過增長 readonly 指定爲 只讀 。

docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
    training/webapp \
    python app.py

加了 readonly 以後,就掛載爲 只讀 了。若是你在容器內 /opt/webapp 目錄新建文件,會顯示以下錯誤

/opt/webapp # touch new.txt
touch: new.txt: Read-only file system

查看數據卷的具體信息

在主機裏使用如下命令能夠查看 web 容器的信息

docker inspect web

掛載主機目錄 的配置信息在 "Mounts" Key 下面

"Mounts": [
    {
        "Type": "bind",
        "Source": "/src/webapp",
        "Destination": "/opt/webapp",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

掛載一個本地主機文件做爲數據卷

--mount 標記也能夠從主機掛載單個文件到容器中

docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
    --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
    ubuntu:17.10 \
    bash

這樣就能夠記錄在容器輸入過的命令了。

相關文章
相關標籤/搜索