程式語言初學者 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
利用資料卷容器來搬移資料
-
備份
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 -
恢復 (restore)
如果要將資料恢復搬移到一個容器:
-
先建立一個帶有資料卷的容器 dbdata2:
docker run -v /ccclub_dbdata --name dbdata2 ubuntu /bin/bash
-
建立另一個新容器掛載 dbdata2 的容器,使用 untar 解壓縮備份檔案到掛載的容器卷中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
-
Comments
Post a Comment