天天看點

docker通過模闆建立鏡像以及容器、倉庫和資料管理

1.既然是通過模闆建立鏡像,那麼首先肯定得先下載下傳一個模闆,位址如下:

<a href="http://openvz.org/Download/templates/precreated">http://openvz.org/Download/templates/precreated</a>

打開以上網址選擇一個模闆進行下載下傳,我這裡下載下傳的是<code>centos-6-x86-minimal.tar.gz (signature)</code>,可以複制下載下傳連結到LInux上下載下傳,也可以直接通過windows下載下傳,下載下傳完之後上傳到Linux上就可以了,由于是國外的網站如果沒有加速器的話可能會下載下傳得比較慢。

2.我是在windows上下載下傳的,我下載下傳完之後上傳到了Linux的使用者家目錄下,接着就是導入該鏡像,指令如下:

3.導入完成後可以使用以下指令檢視導入的鏡像:

将該鏡像啟動為容器,并進入到容器中,檢視核心資訊:

如上,可以看到兩者使用的Linux核心其實是同一個,除了主機名不同之外都是一樣的,是以說docker是基于Linux核心的原因就在這。

4.既然能夠将檔案導入為鏡像,那麼也就能把現有的鏡像,導出為一個檔案,指令如下:

test_centos.tar是導出來的檔案名稱,test_centos則是鏡像名稱。

5.我們還可以用該檔案恢複本地鏡像,可以使用以下兩個指令:

6.使用以下指令可以把自己的鏡像上傳到dockerhub官方網站上去,但前提是需要先注冊一個使用者,後續如果有需求再研究吧:

1.使用以下指令可以建立一個容器,但該容器并沒有啟動,就好比在VMware裡建立了一個虛拟機一樣:

2.啟動該容器:

啟動容器後,可以使用 docker ps 檢視到,有start 就有stop以及restart,之前我們使用的docker run 相當于先create再start。

3.當我們使用run時不加-d選項也可以進入一個虛拟終端裡面:

我們依然可以裡面運作一些指令,使用指令exit或者ctrl + d 也可以退出該bash,但是當退出後這個容器也會進入停止狀态,這就是不加-d的效果。

4.docker run -d可以讓容器在背景運作,例如:

5.--name 選項可以給容器自定義名字,如果不指定該選項則是一個随機字元串:

6.--rm 選項可以讓容器退出後直接删除,在這裡指令執行完容器就會退出:

7.docker logs 可以擷取到容器的運作曆史資訊,用法如下:

8.docker attach 可以進入一個背景運作的容器,指令格式如下:

9.但是attach指令不算好用,比如我們想要退出終端,就得exit了,這樣容器也就退出了,還有一種方法,指令格式如下:

以上指令可以臨時打開一個虛拟終端,并且exit後,容器依然運作着,這個指令之前我們已經使用過多次了。

10.删除容器指令:

container_id是ps的時候檢視到的,這樣就可以把container删除,如果是運作的容器,可以加-f,例如:

11.我們可以導出某個容器,然後将該容器遷移到其他機器上,指令格式如下:

12.導入指令如下,其實就是将檔案導入為鏡像,一開始我們就使用過了:

我們pull鏡像時都是從docker的公共上pull的,push也是如此。但是企業中不可能都将自己的鏡像都放到公共倉庫上,是以我們需要建立一個自己的私有倉庫。

1.下載下傳registry 鏡像,registy是docker官方提供的一個鏡像,我們可以用它來建立本地的docker私有倉庫:

2.然後将 registry 鏡像啟動為容器:

指令說明:将registry鏡像啟動容器,-p會把容器的端口映射到主控端上,如果不映射到主控端上的話,外部是無法直接通路容器的端口的,: 左邊為主控端監聽端口,: 右邊為容器監聽端口,這個端口可以自定義。

3.使用telnet可以通路該端口:

4.使用curl也可以通路該端口:

由于我們還沒有上傳鏡像,是以傳回的資料是空的。

5.下面我們來把其中一個鏡像上傳到這個私有倉庫:

沒有使用https的協定下,隻能修改docker的配置檔案:

修改完成後繼續push:

輸出結果如上,push成功。

6.使用curl指令可以檢視私有倉庫裡的鏡像:

然後我又上傳了一個鏡像,這時候私有倉庫裡就有兩個鏡像了:

7.如果要拉取鏡像則使用以下指令:

也就是把push換成pull就可以了,是以打标簽那一步很關鍵,如果你ip或端口寫錯了的話,是無法進行pull的。

容器是由鏡像啟動的,那容器裡面産生的資料存儲在了哪裡?容器關閉、删除時資料都會被如何處理?容器裡面産生的資料都存儲在docker的資料目錄下,我這裡的資料目錄路徑為:/var/lib/docker/containers/,containers下的目錄都以容器ID命名,其中包含這個容器的所有配置檔案。 config.json檔案中最後幾個Volumes屬性即為容器資料檔案的存儲目錄。而當容器關閉、删除時,容器的資料都會一并的删除掉。這就意味着資料不具有持久性,如果一些重要的資料也被删除則會帶來一定的損失,要解決這個問題就是把容器的資料寫入到主控端的磁盤上,這樣不管是容器被停止或删除,資料都不會丢失。

1.挂載本地主控端的目錄到容器裡,這将會讓這個容器成為一個資料卷容器:

指令說明:-v 用來指定挂載目錄,: 前面的/data/為主控端本地目錄,: 後面的/data/為容器裡的目錄,如果容器裡沒有data目錄,會在容器中自動建立。

然後來測試一下是否能夠正常寫入到主控端的磁盤上:

2.挂載資料卷:

其實我們挂載目錄的時候,可以指定容器name,如果不指定就随機定義了。比如上面我們沒有指定,它就生成了一個名字為lucid_kilby,這個名字可以使用指令 docker ps 指令看 NAMES 那一列:

docker通過模闆建立鏡像以及容器、倉庫和資料管理

挂載資料卷:

這樣,我們使用centos6鏡像建立了新的容器,并且使用了 lucid_kilby 容器的資料卷

我們可以進入這個新容器裡檢視data目錄:

如上,可以看到,這個新容器的data目錄裡也有我們之前建立的test目錄,這是因為我們建立這個容器時挂載了資料卷,是以現在 lucid_kilby 就是作為一個資料卷容器存在。

3.另一種定義資料卷容器的方式,這種方式不會挂載本地主控端的目錄,而是讓多個容器之間互相共享資料:

有時候,我們需要多個容器之間互相共享資料,類似于linux裡面的NFS,是以我們就可以搭建一個專門的資料卷容器,然後其他容器直接挂載該資料卷。

首先建立一個資料卷容器:

注意:這裡的/data/是容器的data目錄,并非本地主控端的data目錄。

然後讓其他容器挂載該資料卷:

如果資料卷容器共享的是data目錄,而普通容器想要共享的是home目錄或其他目錄,可以把原本的目錄更名,然後軟連結data目錄即可,例如:

<code>[root@9aee52df082a /]# ln -s /data/ /home # 然後軟連結data目錄</code>

<code></code>

<code>本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/2069220,如需轉載請自行聯系原作者</code>