以前有據說過docker,可是一直沒有使用過。最近終於下定決定使用了一下docker,感受docker用於跨操做系統的軟件工具使用仍是比較友好的。html
本文忽略的部分Linux軟件包安裝的過程,須要讀者有必定Linux操做基礎,具備軟件包查找與安裝能力。docker
在使用docker時,首先須要安裝docker。安裝完成後,經過從dockerhub上下載不一樣系統環境的image,而後運行相應的image,完成docker的運行操做。shell
在docker的運行的過程,是經過docker命令調用image進行的運行,image運行的實體叫作container。image和container的關係比較像網吧系統的關係,網吧系統開機會加載操做系統,而且用戶能夠在操做系統中進行操做和修改;當系統關機重啓後,再次開機的系統不會保留用戶的更改,會還原成本來最初的系統狀態。docker的過程與之相同,在docker使用image啓動的container中,用戶在container所作的操做並不會保存下來,而是會在用戶退出的時候清除。macos
若是用戶但願保存下container中的修改,則須要將container保存成一個新的image,實現對修改的保存;或者使用共享磁盤的形式,將外部系統的目錄共享到container內部,共享磁盤上的修改會被保留。ubuntu
docker官方提供了image的下載渠道dockerhub,地址爲:https://hub.docker.com。vim
以Ubuntu爲例,在dockerhub上,能夠找到Ubuntu的image下載頁面【https://hub.docker.com/_/ubuntu】,在該頁面中能夠看到不少不一樣的Ubuntu的版本信息,經過api
docker pull ubuntu
能夠完成對Ubuntu最新image的下載,也能夠經過tag頁面中根據tag尋找到所需的image,對指定的image進行下載。例以下載Ubuntu 1804的image,命令以下:bash
docker pull ubuntu:18.04
下載完成後,本地經過docker images命令能夠看到所下載的鏡像了。框架
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 7698f282e524 4 weeks ago 69.9MB
因爲這個鏡像只是一個最小的系統環境,包含了軟件包安裝命令apt,因此這個鏡像很小。若是後續須要裝更多的軟件包,而且建立新的image,新的image的尺寸會變大。工具
使用docker運行image的命令以下:
docker run ubuntu:18.04 bash
上面的命令是經過docker調用了ubuntu:18.04image中的bash。可是該命令一閃而過,沒有留下任何痕跡。這並非運行錯誤,而是由於bash運行完成以後退出了。若是不但願運行後退出,而是留在終端裏,能夠經過下述命令來進行執行:
docker run -it ubuntu:18.04
上述命令運行完成後,能夠停留在shell中,該shell是docker所運行的Ubuntu image的container的shell,能夠看到命令提示以下:
root@7ab5341e698c:/#
進入container後,用戶爲root,容器編號爲7ab5341e698c,停留的目錄爲「/」。接下來,就能夠在容器內進行各類操做了,能夠經過apt命令去安裝本身所需的軟件。
!!注意!!
退出容器時,若是直接使用exit命令會致使容器退出,全部容器內部的更改將會丟失。若是隻是想離開窗口而不退出容器,須要使用「ctrl + p,ctrl + q」這組命令來離開容器,容器將會在後臺保持運行。容器在後臺運行的狀態能夠經過「docker ps」進行查看,例如:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ab5341e698c ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour vigilant_kapitsa
經過上述命令能夠看到,容器在後臺運行,命令的ID爲「7ab5341e698c」。若是但願再次進入到容器中,則能夠經過attach命令再次進入到容器中。例如:
docker attach 7ab5341e698c
再次返回容器中,會繼續看到容器內部shell的執行狀態。若是返回容器中時,容器內部的shell正在執行命令,則會在shell處卡住。在shell處卡住時,經過「ctrl + c」命令可以結束當前命令的運行,也能夠經過「ctrl + z」命令將執行的程序掛起,須要時經過「fg」恢復掛起程序的運行。
須要注意的是,在容器運行時,多個窗口經過attach命令鏈接容器,會進入到同一個shell中,致使shell的搶佔,因此要儘可能使用多個attach操做鏈接同一個container。
在docker運行過程當中,安裝好所需的軟件工具後,能夠經過「docker diff containner」命令看到有哪些修改,例如:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7ab5341e698c ubuntu:18.04 "/bin/bash" About an hour ago Up About an hour vigilant_kapitsa $ docker diff 7ab5341e698c C /root C /root/.viminfo A /root/.vimrc
經過上述命令,能夠看出在容器中,新增了viminfo和vimrc文件。爲了保存這些修改,能夠經過commit命令將container保存成一個新的image。命令以下:
docker commit -m "Add vimrc and viminfo" 7ab5341e698c myubuntu_1804:v0.1
經過上述命令,實現經過container 7ab5341e698c建立了一個名字爲myubuntu_1804,tag爲v0.1的image。下次運行docker的時候,能夠直接運行該image。運行命令以下:
docker run -it myubuntu_1804:v0.1
經過該image運行的container中,包含了以前對viminfo和vimrc的更改,實現了對原容器的保存。
在MacOS上,默認使用的文件系統是不區分大小寫的,這對於Linux編譯來講會出現問題,因此須要建立一個區分大小寫的擴展磁盤來存儲buildroot項目文件。
在MacOS上,經過磁盤管理工具,能夠在原有磁盤上新增一個添加到原磁盤上的卷宗。該卷宗能夠與原磁盤共享存儲空間,同時具備獨立的磁盤格式。
新增卷宗時,將磁盤格式設置爲「APFS區分大小寫」,便可建立出一個新的區分大小寫的卷宗。至此,MacOS上的磁盤準備工做就緒。
Buildroot是一個Linux平臺上快速構建嵌入式Linux系統的框架,它可使用menuconfig進行配置,實現快速構建Linux工具鏈、rootfs等環境的工具。
從Buildroot的官方網站上能夠下載到Buildroot的源碼包,網址在:https://buildroot.org/download.html。下載完成後進行解壓縮,便可獲得Buildroot的工做目錄。
在該目錄中,存在configs目錄,其中包含了默認的config信息,能夠經過默認配置快速實現構建。
下文中,將使用」qemu_mips64el_malta_defconfig」做爲默認配置,來講明Buildroot的基本使用方法。
爲了可以在docker內部使用Buildroot,能夠經過使用共享磁盤的形式將Buildroot掛載到docker內部,而不用將Buildroot放在容器的文件系統內部。這樣可以很方便的保留Buildroot的編譯結果,而不用經過保存container的形式去保存變動。
因爲使用了共享磁盤做爲Buildroot的存儲環境,因此須要注意的是:
該磁盤必須是區分大小寫的,!!不然部分軟件包編譯會報錯!!
該磁盤必須是區分大小寫的,!!不然部分軟件包編譯會報錯!!
該磁盤必須是區分大小寫的,!!不然部分軟件包編譯會報錯!!
能夠經過如下命令將共享目錄掛載到container內部:
docker run -it -v ${PWD}:/dockershare myubuntu_1804:v0.1
上述命令中,${PWD}指的是當前目錄(全路徑),」/dockershare」指的是container內部能夠看到的共享目錄路徑(全路徑)。上述命令執行完成後,便可將當前目錄掛載到docker container內部,也能夠經過將${PWD}替換成其餘全路徑,實現指定路徑的掛載。
須要注意的是,外部路徑必定是存儲了Buildroot的路徑,而且該路徑中能夠存放區分大小寫的文件。
經過加載共享磁盤的方式進入容器後,能夠進入」/dockershare/buildroot-2019.05」路徑(本文下載的是2019.05版本的Buildroot),在該路徑中,能夠經過直接調用defconfig的形式進行快速配置,如:
make qemu_mips64el_malta_defconfig
配置完成後,須要調整部分選項信息,則能夠經過」make menuconfig」進入菜單,進行修改。
這裏能夠將默認的軟件包下載倉庫調整爲Buildroot的備份倉庫,這樣能夠加快下載速度,避免部分軟件包沒法下載的狀況。調整的配置路徑以下:
│ Symbol: BR2_PRIMARY_SITE [=http://sources.buildroot.net] │ │ Type : string │ │ Prompt: Primary download site │ │ Location: │ │ -> Build options │ │ -> Mirrors and Download locations 將該值設置爲「http://sources.buildroot.net」
修改完配置後,便可經過ecs進行後退,到最後一層退出時提示保存配置信息,保存便可。
在配置完成後,便可進入編譯步驟。編譯命令以下:
make source # 提早將軟件包所有下載,可省略 make # 進行編譯
上述編譯步驟中,」make source」是能夠省略的。可是經過「make source」能夠將編譯所需的所有軟件包進行下載,後續進行編譯便可,減小了編譯過程當中因爲軟件包沒法下載致使的編譯暫停。「make source」能夠不執行,這樣在編譯的過程當中,須要編譯某個軟件包時再下載,也是能夠的。
Buildroot能夠「make」命令完成編譯,編譯完成後,在output目錄下存放着編譯結果。至此,所有操做結束。