自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

譯文:關(guān)于Docker數(shù)據(jù)容器(data only container)

開發(fā) 開發(fā)工具
數(shù)據(jù)容器就是本身只創(chuàng)建一個volume供其他容器共享,創(chuàng)建完后即退出,不執(zhí)行任何任務(wù)。比如通過以下方式創(chuàng)建一個postgres容器。

[[186127]]

什么是數(shù)據(jù)容器?

數(shù)據(jù)容器就是本身只創(chuàng)建一個volume供其他容器共享,創(chuàng)建完后即退出,不執(zhí)行任何任務(wù)。比如通過以下方式創(chuàng)建一個postgres容器。

  1. docker run --name dbdata postgres echo "Data-only container for postgres" 

該容器運行echo "Data-only container for postgres"即退出,然而只要沒有刪除該容器,該容器/var/lib/postgresql/data的volume(在Dockerfile使用VOLUME指令定義)就會一直存在。

然后我們可以新建若干容器來共享數(shù)據(jù),比如:

  1. docker run -d --volumes-from dbdata --name db1 postgres 

如何創(chuàng)建數(shù)據(jù)容器?

太簡單了,創(chuàng)建任何容器,然后使用-v創(chuàng)建volume即可。但大家一定會想到用最小的鏡像吧,比如hello-world,即

  1. docker run -v /data hello-world 

但這樣是錯誤的! 為什么呢?

我們首先創(chuàng)建一個簡單的鏡像:

  1. FROM debian:jessie 
  2. RUN useradd mickey 
  3. RUN mkdir /foo && touch /foo/bar && chown -R mickey:mickey /foo 
  4. USER mickey 
  5. CMD ls -lh /foo 

構(gòu)建:

  1. docker build -t mickey_foo -< Dockerfile 

運行下:

  1. docker run --rm -v /foo mickey_foo 

輸出:

  1. total 0  
  2. -rw-r--r-- 2 mickey mickey 0 Nov 18 05:58 bar 

運行正常,沒有任何問題。

下面我們嘗試使用busybox來作為數(shù)據(jù)容器:

  1. docker run -v /foo --name mickey_data busybox true 
  2. docker run --rm --volumes-from mickey_data mickey_foo 

輸出:

  1. total 0  
  2. # Empty WTF?? 
  1. docker run --rm --volumes-from mickey_data mickey_foo ls -lh / 
  1. total 68K 
  2. drwxr-xr-x   2 root root 4.0K Nov 18 06:02 bin 
  3. drwxr-xr-x   2 root root 4.0K Oct  9 18:27 boot 
  4. drwxr-xr-x   5 root root  360 Nov 18 06:05 dev 
  5. drwxr-xr-x   1 root root 4.0K Nov 18 06:05 etc 
  6. drwxr-xr-x   2 root root 4.0K Nov 18 06:02 foo 
  7. drwxr-xr-x   2 root root 4.0K Oct  9 18:27 home 
  8. drwxr-xr-x   9 root root 4.0K Nov 18 06:02 lib 
  9. drwxr-xr-x   2 root root 4.0K Nov 18 06:02 lib64 
  10. drwxr-xr-x   2 root root 4.0K Nov  5 21:40 media 
  11. drwxr-xr-x   2 root root 4.0K Oct  9 18:27 mnt 
  12. drwxr-xr-x   2 root root 4.0K Nov  5 21:40 opt 
  13. dr-xr-xr-x 120 root root    0 Nov 18 06:05 proc 
  14. drwx------   2 root root 4.0K Nov 18 06:02 root 
  15. drwxr-xr-x   3 root root 4.0K Nov 18 06:02 run 
  16. drwxr-xr-x   2 root root 4.0K Nov 18 06:02 sbin 
  17. drwxr-xr-x   2 root root 4.0K Nov  5 21:40 srv 
  18. dr-xr-xr-x  13 root root    0 Nov 18 06:05 sys 
  19. drwxrwxrwt   2 root root 4.0K Nov  5 21:46 tmp 
  20. drwxr-xr-x  10 root root 4.0K Nov 18 06:02 usr 
  21. drwxr-xr-x  11 root root 4.0K Nov 18 06:02 var 

Owened by root? WTF???

  1. docker run --rm --volumes-from mickey_data mickey_foo touch /foo/ba 
  1. touch: cannot touch '/foo/bar': Permission denied 

發(fā)生了什么呢?我們的/foo 仍然存在, 但是它是空的并且所有者是root?

讓我們再試試使用我們剛剛構(gòu)建的mickey_foo作為數(shù)據(jù)容器:

  1. ~: docker rm -v mickey_data # remove the old one 
  2. mickey_data 
  3. ~: docker run --name mickey_data -v /foo mickey_foo true 
  4. ~: docker run --rm --volumes-from mickey_data mickey_foo 
  5. total 0 
  6. -rw-r--r-- 1 mickey mickey 0 Nov 18 05:58 bar 
  7. # Yes! 
  8. ~: docker run --rm --volumes-from mickey_data mickey_foo ls -lh / 
  9. total 68K 
  10. drwxr-xr-x   2 root   root   4.0K Nov 18 06:02 bin 
  11. drwxr-xr-x   2 root   root   4.0K Oct  9 18:27 boot 
  12. drwxr-xr-x   5 root   root    360 Nov 18 06:11 dev 
  13. drwxr-xr-x   1 root   root   4.0K Nov 18 06:11 etc 
  14. drwxr-xr-x   2 mickey mickey 4.0K Nov 18 06:10 foo 
  15. drwxr-xr-x   2 root   root   4.0K Oct  9 18:27 home 
  16. drwxr-xr-x   9 root   root   4.0K Nov 18 06:02 lib 
  17. drwxr-xr-x   2 root   root   4.0K Nov 18 06:02 lib64 
  18. drwxr-xr-x   2 root   root   4.0K Nov  5 21:40 media 
  19. drwxr-xr-x   2 root   root   4.0K Oct  9 18:27 mnt 
  20. drwxr-xr-x   2 root   root   4.0K Nov  5 21:40 opt 
  21. dr-xr-xr-x 121 root   root      0 Nov 18 06:11 proc 
  22. drwx------   2 root   root   4.0K Nov 18 06:02 root 
  23. drwxr-xr-x   3 root   root   4.0K Nov 18 06:02 run 
  24. drwxr-xr-x   2 root   root   4.0K Nov 18 06:02 sbin 
  25. drwxr-xr-x   2 root   root   4.0K Nov  5 21:40 srv 
  26. dr-xr-xr-x  13 root   root      0 Nov 18 06:05 sys 
  27. drwxrwxrwt   2 root   root   4.0K Nov  5 21:46 tmp 
  28. drwxr-xr-x  10 root   root   4.0K Nov 18 06:02 usr 
  29. drwxr-xr-x  11 root   root   4.0K Nov 18 06:02 var 
  30. # YES!! 
  31. ~: docker run --rm --volumes-from mickey_data mickey_foo touch /foo/baz 
  32. ~: docker run --rm --volumes-from mickey_data mickey_foo ls -lh /foo 
  33. total 0 
  34. -rw-r--r-- 1 mickey mickey 0 Nov 18 06:11 bar 
  35. -rw-r--r-- 1 mickey mickey 0 Nov 18 06:12 baz 
  36. # YES!!! 

由于我們剛剛使用了相同的鏡像作為數(shù)據(jù)容器鏡像,共享的容器能夠找到共享數(shù)據(jù)。為什么使用busybox不可以呢?由于busybox沒有/foo這個目錄,當(dāng)我們使用-v創(chuàng)建/foo這個數(shù)據(jù)卷時,docker會以默認(rèn)用戶自動創(chuàng)建對應(yīng)的目錄(這里是root),而--volumes-from僅僅是重用存在的卷,而不會對卷自動做任何事情。因此當(dāng)我們嘗試去寫/foo時由于沒有權(quán)限(root所有,mickey用戶).

因此我們應(yīng)該使用和共享的容器相同的鏡像做數(shù)據(jù)容器鏡像?是的!

那我們使用這么大的鏡像不會浪費空間么?

為什么不使用小鏡像作為數(shù)據(jù)容器?

其中一個原因,在上一節(jié)已經(jīng)解釋。遺留的一個問題是使用這么大的鏡像(因為一般的鏡像都會比較大)會不會浪費空間呢?

首先我們需要知道Docker的文件系統(tǒng)是如何工作的。Docker鏡像是由多個文件系統(tǒng)(只讀層)疊加而成。當(dāng)我們啟動一個容器的時候,Docker會加載只讀鏡像層并在其上(譯者注:鏡像棧頂部)添加一個讀寫層。如果運行中的容器修改了現(xiàn)有的一個已經(jīng)存在的文件,那該文件將會從讀寫層下面的只讀層復(fù)制到讀寫層,該文件的只讀版本仍然存在,只是已經(jīng)被讀寫層中該文件的副本所隱藏。當(dāng)刪除Docker容器,并通過該鏡像重新啟動時,之前的更改將會丟失。在Docker中,只讀層及在頂部的讀寫層的組合被稱為Union File System(聯(lián)合文件系統(tǒng))。

因此當(dāng)我們創(chuàng)建了一個debian容器實例時(大約150MB),根據(jù)以上的原理,我們再創(chuàng)建1000個debian鏡像能夠重用原來的只讀層,需要的空間還是150MB.

容器本身并不會占任何空間,除非你修改了內(nèi)容。

因此Docker無論創(chuàng)建一個鏡像的多少實例,都不會占據(jù)更多的空間。

因此實際上,我們?yōu)榱藙?chuàng)建數(shù)據(jù)容器而使用busybox反而會占用更多的空間,這個空間就是busybox的鏡像大小。

實際上我們經(jīng)常這樣使用:

  1. ~: docker run --name mydb-data --entrypoint /bin/echo mysql Data-only container for mydb 
  2. ~: docker run -d --name mydb --volumes-from mydb-data mysql 

上面的實例指行/bin/echo mysql Data-only container for mydb,能夠更容易知道這是一個數(shù)據(jù)容器,利于使用grep查找.

【本文是51CTO專欄作者“付廣平”的原創(chuàng)文章,如需轉(zhuǎn)載請通過51CTO獲得聯(lián)系】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2014-06-03 09:55:34

DockerLinux容器Ubuntu

2021-09-16 10:21:58

topic容器容器信息

2014-09-16 10:34:59

Docker達龍云

2014-09-17 15:44:42

DockerContainer虛擬化

2024-05-09 10:28:46

容器ListElement?

2014-09-18 14:13:54

Docker

2019-10-21 08:31:34

容器微服務(wù)docker

2014-11-11 15:25:00

Dockerambassador云計算

2009-11-23 19:55:20

ibmdwDB2

2025-01-08 09:26:24

KubernetesContainer容器

2018-01-19 10:54:00

容器Kubernetes微服務(wù)

2014-12-23 13:33:35

Dockercontainerimage

2022-03-10 08:24:17

Docker容器SaaS

2009-02-20 17:46:34

計算機英語數(shù)據(jù)庫管理系統(tǒng)簡介

2019-12-10 08:00:46

Kata容器Linux

2015-07-20 14:51:41

Container+聯(lián)騰訊云

2019-07-08 08:59:41

Docker容器主機

2020-08-11 08:59:20

容器虛擬化技術(shù)

2017-08-07 10:04:49

數(shù)據(jù)數(shù)據(jù)治理數(shù)據(jù)管理

2019-07-16 14:44:52

DockerMySQL操作系統(tǒng)
點贊
收藏

51CTO技術(shù)棧公眾號