如何將Docker容器復(fù)制/轉(zhuǎn)移到另一個主機?
譯文【51CTO.com快譯】由于Docker容器是小小的軟件盒子,你可以將它們從一臺計算機復(fù)制和轉(zhuǎn)移到另一計算機。然而這不常討論,可能是由于大企業(yè)自行構(gòu)建庫,可以定制自己的映像,并在它們覺得合適時跨服務(wù)器分發(fā)。但如果你只是偶爾需要移動一個或多個容器,沒必要搞得這么復(fù)雜。
你可能在本地計算機上使用Docker實例,決定將它轉(zhuǎn)移到功能更強大的服務(wù)器上。或者你可能只想在多臺計算機上部署定制的容器,對容器進行“復(fù)制粘貼”。其他時候你可能對云計算提供商不滿意,想另換一家。無論是什么情況,都有一個很簡單的過程,下面會詳細(xì)介紹。
保存來自源主機的容器映像
不需要先停止容器,但強烈建議這么做。你將對Docker實例中的數(shù)據(jù)創(chuàng)建快照。如果這么做時實例在運行,最終出現(xiàn)在快照中的一些文件有可能不完整。想象一下有人上傳了一個500MB的文件。上載250MB后,你發(fā)出docker commit命令。上傳隨后繼續(xù),但是當(dāng)你在另一臺主機上恢復(fù)該Docker映像時,500MB中只有250MB可用。
所以,如果可以,先停止實例。
- docker stop NAME_OF_INSTANCE
Docker容器由普通的初始映像構(gòu)建。隨著時間的推移,你將自己的更改添加到該基本映像。容器內(nèi)運行的進程也可能保存自己的數(shù)據(jù)或進行其他更改。想保留這一切,你可以將此新狀態(tài)提交到新映像。
注意,如果實例目前在運行中,該操作會在其內(nèi)容保存期間暫停該實例。如果向容器添加了大量數(shù)據(jù),此操作需要較長時間才能完成。如果這是個問題,可以輸入docker commit -p=false NAME_OF_INSTANCE mycontainerimage而不是下一個命令,避免這個暫停。然而,除非絕對必要,否則別這么做。在這種情況下,創(chuàng)建數(shù)據(jù)不一致/不完整的映像的可能性會加大。
在本教程中,為因此生成的映像選擇了普通名稱:mycontainerimage。如果你愿意,可以更改此名稱。如果更改名稱,記得在遇到它的所有后續(xù)命令中替換它。
- docker commit NAME_OF_INSTANCE mycontainerimage
現(xiàn)在,將此映像保存到文件,并壓縮它。
- docker save mycontainerimage | gzip > mycontainerimage.tar.gz
接下來,使用你青睞的文件傳輸方法,將mycontainerimage.tar.gz復(fù)制到想把容器遷移過去的那個主機。
將容器映像加載到目標(biāo)主機上
登錄到你已將映像轉(zhuǎn)移過去的主機后,將其導(dǎo)入到Docker。
- gunzip -c mycontainerimage.tar.gz | docker load
由于你從未在這里初始化該容器,還無法用docker start啟動它。相反,你首次運行該Docker實例時,發(fā)出在過去使用的同一個命令。現(xiàn)在唯一的區(qū)別是你最后會使用“mycontainerimage”,而不是在過去使用的任何映像。
下一個命令只是一個例子;除非適用于你,否則別復(fù)制粘貼該命令。(首次運行映像時不需要特殊參數(shù))
- docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
相比之下,在下面這個命令示例中,需要參數(shù)--publish將主機上的端口80轉(zhuǎn)發(fā)到容器上的端口80:
- docker run -d --name=http-server --publish 80:80 mycontainerimage
之后,你可以使用docker stop和docker start命令正常停止和啟動該容器。
無需創(chuàng)建文件即可傳輸映像
有時你可能想跳過創(chuàng)建mycontainerimage.tar.gz文件這一步。也許你沒有足夠的磁盤空間,因為容器里面有大量數(shù)據(jù)。你可以保存、壓縮、傳輸和解壓縮映像,并將映像加載到目標(biāo)主機上,一個命令即可搞定。運行前面討論的docker commit命令后,你可以使用:
- docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
它在Windows上應(yīng)該也管用,因為現(xiàn)在有內(nèi)置的SSH客戶端(PuTTY不再必不可少)。
然后,繼續(xù)使用適用于你情況的docker run命令。
結(jié)束語
作為偶爾移動容器的臨時方案,docker save和docker load很棒。但請記住,如果你經(jīng)常移動容器,可能應(yīng)該改而構(gòu)建自己的專有庫。
原文標(biāo)題:How to Copy/Move a Docker Container to Another Host,作者:Alexandru Andrei
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】