0911_docker學習(7)

是格子啊 2021-08-15 17:02:28 阅读数:778

本文一共[544]字,预计阅读时长:1分钟~
0911_docker docker

數據共享

docker 可以用來隔離環境,讓容器內和容器外的環境互不幹擾(其實還是會有影響的),那麼運行在容器內的程序,可能會產生數據,那麼這些數據默認也是在這個容器內的,那麼如何從容器外獲取這些數據呢?要是我想銷毀這個容器,那容器裏面的數據,會不會也被銷毀嘛?要是我想昇級容器,數據是不是得進行遷移呀?

Linux 的文件系統是一棵樹,上面可以通過創建掛載點的方式,將存儲介質掛載到文件系統上,從而能够訪問磁盤裏的數據。

同樣的,每一個容器都有 MNT namespace 和 文件樹,那麼同樣能够創建掛載點,將主機上面的存儲介質掛載到容器的掛載點上面,當容器內部向特定的掛載點寫入數據,等同於在主機上面寫入數據。這樣數據就能够保存在主機上面。

docker 裏面有三種常用的存儲方式:

  • Bind mounts
  • In-memory storage
  • Docker volumes

image.png

Bind mounts

Bind mounts 是將主機上某個路徑掛載到容器內部的某個路徑上,從而達到數據共享的效果。不僅可以掛載目錄,也能够掛載文件。它也存在一些問題,它依賴與主機上的路徑,如果主機上面沒有相應的路徑,那麼它將不能掛載成功。另外一個問題是,它會增加與其他容器沖突的可能性,容器之間可能會搶占文件的使用權。 因此,最好在通用平臺或硬件池中避免這些類型的特定綁定。

# 我當前的絕對路徑是 /home/zhui/playground/
cat > ./example.html << EOF Hello Docker, How are you ? EOF
touch ./example.log
cat > ./example.conf <<EOF server {  listen 80;  server_name localhost;  access_log /var/log/nginx/custom.host.access.log main;  location / {    root /usr/share/nginx/html;    index index.html index.htm;  } } EOF
LOG_SRC=/home/zhui/playground/example.log
LOG_DST=/var/log/nginx/custom.host.access.log
CONF_DST=/etc/nginx/conf.d/default.conf
CONF_SRC=/home/zhui/playground/example.conf
HELLO_SRC=/home/zhui/playground/example.html
DEFAULT_DST=/usr/share/nginx/html/index.html
docker run -d --name nginx-web \
--mount type=bind,src=${CONF_SRC},dst=${CONF_DST},readonly=true \
--mount type=bind,src=${LOG_SRC},dst=${LOG_DST} \
--mount type=bind,src=${HELLO_SRC},dst=${DEFAULT_DST} \
-p 80:80 nginx:latest
複制代碼

image.png

In-memory storage

大多數的服務軟件,比如 web 應用程序,裏面可能會使用私鑰、數據庫密碼、API key、或者一些敏感的配置文件,需要一些空間臨時進行緩沖。

這種情况下,把這些數據寫到主機文件裏面就不太合適了,那麼可以將這些緩存數據,寫到內存裏面。


# 例子
docker run --rm --mount type=tmpfs,dst=/tmp --entrypoint mount alpine:latest -v
# 例子
docker run --rm --mount type=tmpfs,dst=/tmp,tmpfs-size=16k,tmpfs-mode=1770 --entrypoint mount alpine:latest -v
複制代碼

上面的命令,能够創建一個 tmpfs 的空設備(docker 自己定義並創建),並將其掛載到容器的 /tmp 目錄下,容器內對 /tmp 目錄下的操作,都將放入主機的內存中,從而保護敏感文件。

Docker volumes

volume(卷) 跟 bind mounts 是有區別的,最大的一點區別是容器實例能够在不知道主機的文件系統的情况來,通過卷來共享數據。

卷的其中一個特性是能够共享對數據的訪問,而且卷的生命周期是獨立於容器的,也就是說,即使某個容器使用了某個卷,當這個容器被銷毀,使用的卷依然存在,而且能够被其他容器所使用。


# 創建卷
docker volume create --driver local --label example=location location-example
# 查看所有卷
docker volume ls
# 查看卷的信息
docker volume inspect  location-example
# 查看 Mountpoint 發現他是由 docker 自動生成的
ocker volume inspect --format "{{json .Mountpoint}}" location-example
# 删除所有未被使用的卷
docker volume prune
# 删除卷
docker volume rm location-example
# 先創建一個卷
docker volume create --driver local --label example=cassandra cass-shared
# 容器上使用卷
docker run -d --volume cass-shared:/var/lib/cassandra/data --name cass cassandra:2.2
# 删除容器後,volume 依然存在
docker container rm -f cass
docker volume ls
複制代碼

卷可以有名字(對人類友好),也可以是匿名的,當它是匿名卷時,它的名字,就是一大串的哈希字符。 通常生成匿名卷的方式是直接使用了 docker volume create(不帶其他參數),或者是 docker rundocker create 時不指定卷名。

docker 還提供 volumees-from 參數,能够直接從其他容器(被稱為數據卷容器)那裏獲取數據,實現數據共享。


# 生成一個匿名卷
docker volume create
# 直接在創建容器實例時,同時創建匿名卷
docker run --name fowler \
--mount type=volume,dst=/library \
\alpine:latest touch /library/{1..4}.txt
# 通過 --volumes-from 參數關聯卷
docker run --name reader \
--volumes-from fowler \
alpine:latest ls -l /library/
複制代碼

其他參考

Docker 基礎知識 - 使用綁定掛載(bind mounts)管理應用程序數據

## 數據卷容器

版权声明:本文为[是格子啊]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815170211227E.html