程式語言初學者 Docker 入門第六章 —— 資料管理 Data Volumes

 查看容器內應用程式產生的資料,對資料進行持久化儲存,甚至多個容器之間進行資料共用

容器中管理資料主要有兩種方式:

  • 資料卷 (Data Volumes)

    容器內資料直接對應到本地主機環境

  • 資料卷容器 (Data Volume Containers)

    使用特定容器來維護資料卷

資料卷

  • 特性:
    • 容器之間共用和重用,容器間傳遞資料將變得有效率且方便
    • 資料修改會立即生效,無論是容器內操作還是本機上操作
    • 資料卷的更新不會影響到 image ,把應用程式資料分離去耦合
    • 一直存在,直到沒有容器使用,便可安全移除

1. 建立資料卷

docker create docker run-v 參數 會在主機端建立一個目錄並掛載到容器內,一次使用多個 -v 可以掛載多個資料卷目錄

$ docker run -d -P --name web -v /webapp training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at <https://docs.docker.com/registry/spec/deprecated-schema-v1/>
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
5184ea726932e76e00a84d89cefeed19a6a68be6edb9e02da33fdbd695278e4a

<aside> 💡 -P 將容器服務的連接埠對外開放,隨機對應到本機上的連接埠 用 training/webapp image 新建一個 web 容器,並新增一個資料卷掛載到容器的 /webapp 目錄

</aside>

$ docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                         NAMES
5184ea726932   training/webapp   "python app.py"   4 minutes ago   Up 4 minutes   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   web

2. 掛載一個本機目錄作為資料卷

*推薦 -v 也可以指定掛載一個本地端的已存在目錄到容器中作為資料卷,若本機預掛載目錄不存在,則會自動建立此目錄

使用者可以放置一些程式或資料到本機目錄中,然後在容器內運行和使用

容器掛載目錄:絕對路徑

本機掛載目錄:相對路行 / 絕對路行

如果目錄不存在 Docker,會自動建立

$ docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

<aside> 💡 掛載主機的 /src/webapp 目錄到容器的 /opt/webapp 目錄用 training/webapp image 新建一個 web 容器,並新增一個資料卷掛載到容器的 /webapp 目錄

</aside>

Docker 掛載資料卷預設:可讀寫 (rw)

可指定成為讀 (ro)

$ docker run -d -P --name web -v /src/webapp:/opt/webapp:or training/webapp python app.p

資料卷容器 (Data Volume Containers)

如果使用者需要在多個容器之間共用一些持續更新的資料,最簡單的方式是使用資料卷容器。

也是容器

目的:專門用來提供資料卷供其他容器掛載

建立一個資料卷容器 dbdata,並在其中新增一個資料卷掛載到 /dbdata

$ docker run -it -v /dbdata --name dbdata ubuntu

example:

$ docker run -it -v /home/seraphine/workspace/ccclub-api:/ccclub_api --name ccclub_dbdata ubuntu
$ docker start ccclub_dbdata # 啟動 container
$ docker exec -it ccclub_dbdata /bin/bash # 進入 container

在其他容器中使用 --volumes-from 來掛載 dbdata 容器中

example:

docker run -it --volumes-from ccclub_dbdata --name db1 ubuntu
docker run -it --volumes-from ccclub_dbdata --name db2 ubuntu
$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
e23548ee3711   ubuntu    "/bin/bash"   18 minutes ago   Up 12 minutes             ccclub_dbdata
$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS     NAMES
1f5fdc05fabd   ubuntu         "/bin/bash"              13 seconds ago   Exited (0) 5 seconds ago              db2
79137ff83a8b   ubuntu         "/bin/bash"              35 seconds ago   Exited (0) 22 seconds ago             db1
e23548ee3711   ubuntu         "/bin/bash"              18 minutes ago   Up 12 minutes                         ccclub_dbdata

容器 bd1 bd2 都掛載 ccclub_dbdata 資料卷到 /ccclub_api 目錄。

此時任何一方在該目錄下的寫入,其他容器都可以看得到

exapmle: 在 ccclub_dbdata /ccclub_api 底下新增 test.py

$ docker exec -it ccclub_dbdata /bin/bash
root@e23548ee3711:/# ls
bin  boot  ccclub_api  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e23548ee3711:/# cd ccclub_api/
root@e23548ee3711:/ccclub_api# ls
Dockerfile  README.md    api_project  courses             entrypoint.sh  manage.py  pytest.ini     requirements.txt  students
Makefile    __init__.py  conftest.py  docker-compose.yml  lint.py        projects   questionnaire  setup.cfg         users
root@e23548ee3711:/ccclub_api# touch test.py
root@e23548ee3711:/ccclub_api# ls
Dockerfile  README.md    api_project  courses             entrypoint.sh  manage.py  pytest.ini     requirements.txt  students  users
test.py     Makefile    __init__.py  conftest.py  docker-compose.yml  lint.py        projects   questionnaire  setup.cfg

去 db2 底下查看

docker start db2
docker exec -it db2 /bin/bash
root@1f5fdc05fabd:/# cd ccclub_api/
root@1f5fdc05fabd:/ccclub_api# ls
Dockerfile  README.md    api_project  courses             entrypoint.sh  manage.py  pytest.ini     requirements.txt  students  users
test.py     Makefile    __init__.py  conftest.py  docker-compose.yml  lint.py        projects   questionnaire  setup.cfg

可以多次使用 --volumes-from 從多個容器掛載多個資料卷,也可從其他已掛載資料卷容器來掛載資料卷。container 不需要保持在執行

$ docker run -d --name db3 --volumes-from db1 training/postgres
$ docker exec -it db3 /bin/bash       
root@6c18d435c6fc:/# ls
bin  boot  ccclub-api  dev  etc  home  lib  lib64  media  mnt  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@6c18d435c6fc:/# cd ccclub-api/
root@6c18d435c6fc:/ccclub-api# ls
Dockerfile  __init__.py  courses	     lint.py	pytest.ini	  setup.cfg
Makefile    api_project  docker-compose.yml  manage.py	questionnaire	  students
README.md   conftest.py  entrypoint.sh	     projects	requirements.txt  users

刪除掛載容器

資料卷不會被刪除,必需要刪除最後一個還掛載的容器時用 docker rm -v新版也可以使用 docker system prune

利用資料卷容器來搬移資料

  1. 備份

    docker run --volumes-from ccclub_dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /ccclub-api
    

    用 ubuntu image 建立 name 為 worker 的 container。用 --volumes-from 讓 worker 掛載 ccclub_dbdata 容器的資料卷(ccclub_dbdata 容器內的 /ccclub-api 目錄)

    worker 啟動後,使用 tar cvf /backup/backup.tar /ccclub-api command 來將 /ccclub-api 底下的內容備份為容器內的 /backup/backup.tar,即 Host 主機目前執行目錄下的 backup.tar

  2. 恢復 (restore)

    如果要將資料恢復搬移到一個容器:

    1. 先建立一個帶有資料卷的容器 dbdata2:

      docker run -v /ccclub_dbdata --name dbdata2 ubuntu /bin/bash
      
    2. 建立另一個新容器掛載 dbdata2 的容器,使用 untar 解壓縮備份檔案到掛載的容器卷中

      docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
      

Comments

Popular posts from this blog

《 Imgproxy 使用分析一:圖片下載速度優化分析:Akamai CDN vs Imgproxy 效能比較》

《 Akamai + S3 與 CloudFront + Imgproxy + S3 使用分析二:壓縮圖片設計流程:檔案大小 vs 載入時間的權衡》

PostgreSQL 具有的 NoSQL 特性