docker簡介
一個開源的應用容器引擎,可以用來打包程序,可以包入依賴環境,這樣只需要提供docker image即可,類似於虛擬機,但是更輕量級。
幾個概念:
Paas,platform as a service,Caas container as a service。
鏡像:文件的層次結構以及包含如何運行容器的源數據,類似虛擬機中安裝系統的iso文件。
容器:從鏡像創建的運行實例,可以被啟動、開始、停止、刪除。 類似於安裝好的虛擬機系統。
倉庫:存放鏡像的倉所,倉庫注冊服務器上有多個倉庫,每個倉庫有多個鏡像,每個鏡像有多個tab。和git做類比的話,dockerhub類似github,里面有很多項目,項目類似於鏡像,每個項目有多次提交,對應鏡像的多個tag
使用目的
1,實現應用隔離,多個應用可能會相互影響,通過使用docker可以使相互分離,比如搭建禪道系統會用到lnamp,而其他的一些也會用到,雖然通過配置也能分割【目前現狀,但是不夠直觀,而且conf文件寫的比較亂,可能是水平差,不過不想花太多精力在這個上面,畢竟配置不是目的】,但是使用docker會更方便整潔,比如本地81端口提供A服務,82端口提供B服務,只需要ngix中配置轉發即可。
2,方便管理,進行一些實驗的時候,總是得記錄當前的一些東西,一旦實驗失敗還需要還原,如果使用docker,只需要根據需要commit備份即可,如果失敗了,重新加載之前的image繼續。
3,方便遷移,在任意一台電腦上,無論是服務器還是本地,進行實驗測試,完成后發布只需要將對應的image移過去即可,之前則是在本地做一遍,好了再在server上做一遍,雖說熟能生巧,可是浪費時間,而且不必要,畢竟根本目的是開發某個功能,不是為了部署和維護。
4,體積小。之前有用過虛擬機,利用快照功能備份,但是文件太大了,難以通過U盤移動拷貝,docker image一般幾十兆到一兩百兆,大的也才一個多G,很輕易可以通過U盤拷貝。
5,鏡像多,DockerHub上有很多公開image,只需要找到合適的鏡像,在上面進行修改即可。
6,占用資源少,如果想要虛擬機流暢運行,至少2G或者4G的內容,16G頂多開四五個虛擬機,而docker可以運行很多個。
局限性
畢竟只是大概的了解了docker,看書中介紹有提到安全性等問題,根據需要決定是否使用,自己目前只是為了做一些實驗學習,所以采用。不過之前初次接觸docker的時候,為了搭建一個服務,一直沒成功,所以直接下了別人的image,結果運行后雖然能實現目的,但是不知道怎么停下來,搜索百度,怎么都停不下來,最終直接刪除了文件,由於docker是封裝好的,如果既能滿足需求,同時悄悄的做一些其他事情,也是很難發現的,不想github一樣,直接提供源碼,如果有后門就有可能被人發現,所以docker最好下載可信度高的,或者直接自己從頭開始搭建。
常用docker命令
docker需要管理員權限運行,下面省略sudo
man docker會給出文檔說明
docker 或者docker /? 或者docker --help 給出幫助文檔
為了下載dockerhub的image,首先需要在dockerhub上注冊。
docker login //進行登錄,用戶名不帶郵箱@以及后面的部分
登錄成后可以在dockerhub上搜索下載
docker search XXX //以XXX為關鍵字在dockerhub上搜索
docker pull AAA:BBB //AAA是image的名字,BBB是tag,如果不指定,則為latest,即下載最新的image
下載后本地就有了鏡像
docker images //查看本地的docker
會列出REPOSITORY TAG IMAGEID CREATED SIZE等信息
docker ps // 查看運行中的container
會列出CONTAINERID IMAGE COMMAND CREATED STATUS PORTS等信息
docker start/stop/restart CONTAINERID //停止某個container,可以只輸入部分,只要能夠做出區分即可,比如container少的時候只輸入一兩位就夠了
docker port CONTAINERID //查看該container port映射關系
docker run 【選項】 IMAGE 【command args】 //從某個鏡像啟動container,如果本地沒有會自動下載
docker commit CONTAINERID repository:tag //當在docker內做出某些修改后,可以用這個命令創建新的image,類似虛擬機的快照功能
docker exec //進入某個container內,如docker exec -it /bin/bash
docker rmi imageid //刪除鏡像
私有dockerhub
之所以搭建私有dockerhub,主要因為是要做的事情都是具體的針對個人的,如果提交到dockerhub上一來浪費公共資源,二來可能不經意間泄露個人信息,而且鑒於前面提到的備份功能,可能會頻繁的commit,而私有dockerhub有在本地搭建,可以提高效率。
由於對docker還處於簡單使用的階段,就直接使用了別人做好的image。
使用sudo docker login,登錄
sudo docker run -d -p 5000:5000 registry,自動下載並啟動registry 容器,通過5000端口映射到container內的5000端口
此時可以通過瀏覽器訪問本地的5000端口XXX:5000/v2/
需要參照https://blog.csdn.net/jiaolongdy/article/details/75389167修改/etc/docker/daemon.json文件,如果不存在則創建一個:
{ "insecure-registries":["myregistry.example.com:5000"] }
重啟
sudo /etc/init.d/docker restart
然后下載鏡像,比如jmoger/gitblit
git docker pull jmoger/gitblit
給這個image打上tag,得到一個新的image:
sudo docker tag jmoger/gitblit 192.168.50.186:5000/gitblit //根據時間情況設置ip
然后就可以提交到自己的私有dockerhub上了
sudo docker push 192.168.50.186:5000/gitblit
可以在docker內進行開發,然后用這種方式同步開發環境。比如做禪道系統的二次開發,在公司內做了一部分,docker提交到自己的dockerhub上,回去后pull下來可以繼續做,無論code還是環境都完全一樣。如果通過git同步code,還需要確保兩邊有同樣的環境,如果通過虛擬機同步,導出導入虛擬機需要不少時間,而且虛擬機需要配置一些東西,安裝必要的軟件之后未必能夠通過U盤攜帶,而且讀寫十幾G甚至幾十G的內容也需要不少時間。
參考資料:
1.docker技術入門與實戰
2.docker入門白皮書