概述
使用docker安裝linux的同學都知道,你在docker提供的倉庫安裝linux系統,你就會體驗到最精簡的、最純凈的linux系統,當然,他會精簡到你連ifconfig
命令都需要自己配置,恰好對於我來說,這並不是我想要的。如果我去使用VMware安裝linux系統,但是我已經使用了docker,就不能使用vmware了,那么你就會問了,docker、vmware難道就不能同時使用?
那么,我告訴你,是的。
問題就出在這里,網上有大把文章談及docker與vmware區別,但是很少有文章說明他們在windows上使用的虛擬技術的區別。
當前 Docker 官方出品的 Windows 客戶端, 叫做Docker Desktop for Windows.而其正常運行的條件之一是系統開啟了 Hyper-V 虛擬化服務. 由上文知 Hyper-V 是 Type-1 的 Hypervisor, 這將使得像 VMware 等作為 Type-2 Hypervisor 的軟件無法運行.
此時矛盾已經出現: 使用 Hyper-V 技術的 Docker 客戶端與其他 Type-2 Hypervisor 不能同時運行, 必須重啟並關閉 Hyper-V 才能再次運行其他的 Type-2 Hypervisor 軟件.
@
那么知道原因后,就要着手解決啊,不想使用docker和VMware來回切換,最初的蠢辦法就是在另一個系統上(我裝了雙系統)使用vmware,在windows使用docker,反正虛擬機也只是在上課的時候用用,但是,回想一下不對啊,這樣不就更麻煩了嗎。
回頭一想,既然docker可以安裝linux系統,那么我可不可以使用自己的鏡像文件給導入進去呢?
我將原來在docker中安裝的linux系統導出,查看其內部構成,這不就是我們常見的那些linux文件嗎。所以我只需要將原有的linux系統壓縮成docker鏡像文件,然后再導入docker,問題不都解決了嗎。
如果,你還沒安裝docker,見:值得學習的應用容器引擎docker安裝
壹:過程
一、打包linux鏡像
打包linux系統就要做到精簡,一些臨時文件不需要,就不用打包,只需要將我們需要的東西打包就可以。使用以下命令,記得加sudo,將linux所有文件打包成system.tar
,保存在tmp目錄下,排除掉一些不需要的目錄,不要將最后面有一個點給忘記了。
tar -cvpf /tmp/system.tar --directory=/ --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot .
二、從linux系統中導出到物理機(windows)
如果你有一個小伙伴,大可在他的電腦里的Vmware完成這第一、二步,然后使用ftp工具導出即可。
打包之后,我將壓縮包導出,因為我里面安裝了hadoop、hbase、zookeeper、hive
等一系列東西,他就是現在的2.57GB大小。
請忽略這一段:(我是從deepin系統中將文件導出到windows中的,這里記錄一下,方便自己以后使用,windows與linux雙系統文件系統不共享,在windows中無法訪問deepin的文件系統,但是在deepin中可以讀取windows文件,不能寫,那么我在deepin(linux)中的壓縮包怎么弄到windows呢,這時候神器出場了,使用linux reader
就可以實現在windows中讀寫deepin的文件系統,這東西很奈斯啊)
三、導入到docker中
在cmd中,導入剛剛壓縮好的壓縮包,這里你必須到system.tar所在目錄,要不然,你直接加上system.tar的絕對路徑,不然肯定會報錯找不到該文件。
docker import system.tar
導入后使用docker images
查看鏡像,會有一個未命名,沒有標簽的鏡像,這時候我們就需要給該鏡像打上標簽,方便日后使用及查看
四、打標簽
使用docker tag
命令為你的鏡像打標簽,后面接鏡像id 以及倉庫名:標簽。
docker tag [鏡像id] linux/centos:hadoop
到這一步,你已經成功了一大半,這時候鏡像已經准備好了,就需要使用鏡像運行一個容器了。
五、運行容器
使用以下命令運行你自己創建的鏡像,注意后面的/bin/bash
不能少。
docker run -t -i [鏡像id] /bin/bash
測試 ,嗯,java還在,那么其他的都還在。
那么,到現在大功就搞成了。
貳:docker相關操作
一、docker save
將鏡像文件保存為本地文件。
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Options:
-o, --output string Write to a file, instead of STDOUT
例子:docker save -o mysql.tar mysql:latest
二、docker import
將容器導出為本地文件
Usage: docker export [OPTIONS] CONTAINER
Export a container's filesystem as a tar archive
Options:
-o, --output string Write to a file, instead of STDOUT
例子:docker export -o mysql.tar
三、docker load
從本地讀取鏡像文件
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
例子: docker load -i mysql.tar
四、docker import
從本地文件創建鏡像
Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Import the contents from a tarball to create a filesystem image
Options:
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Set commit message for imported image
例子:docker import mysql.tar
建議:一般save、load組合使用,export、import組合使用。
作者有話
嗯,截止到我發這篇文章之前,我再次向他妥協了,原因是因為修改了docker中我導入的容器的內容時,重啟后,他並不會生效,並且沒有找到有用的方法解決,如果你有可以解決的方法,歡迎留言告訴筆者,筆者將感激不盡,不過這篇博客仍然可以作為我的筆記方便以后查看,最終我使用的方法是在需要使用虛擬機的時候關閉Hyper -v。
1,如果用docker,
第一步:在控制面板中勾選Hyper -v
第二步:在cmd,以管理員身份運行:
bcdedit /set hypervisorlaunchtype auto
第三步;重啟
2,開啟虛擬機linux
第一步:在控制面板中取消勾選Hyper -v
第二步:在cmd中,以管理員身份運行:
bcdedit /set hypervisorlaunchtype off
第三步;重啟
方法引用:docker和虛擬機不兼容問題