? 進入docker的世界

最近學習Machine Learning發(fā)現(xiàn)好多人都用docker骇陈,之前一直聽說但是感覺和自己無關踩窖。但是現(xiàn)在發(fā)現(xiàn)原來docker是個這么方便的東西,可以跨平臺(不分什么版本的linux,甚至mac和windows也行)運行乒融。所以這里開一篇來記錄學習感受古戴。

參考:Docker 完全指南
參考: Gitbook - Docker — 從入門到實踐

不提那些難懂的術語欠橘,大白話就是:
一個Docker就是一個Linux的Live CD系統(tǒng),跟USB系統(tǒng)一樣现恼,有完整的系統(tǒng)文件目錄和程序肃续。

我們可以在這個與外界隔離的便攜系統(tǒng)里隨便讀寫操作,只是每次進入它時候述暂,都會恢復最開始的樣子痹升,像什么事都沒發(fā)生一樣。
我們可以像定制Live CD或WinPE一樣畦韭,定制這個小系統(tǒng)里面默認裝什么軟件疼蛾。一旦定制好了,就是不可更改的艺配,非常穩(wěn)定察郁。

理解Docker的邏輯

一開始發(fā)現(xiàn)很亂很難理解,覺得所有人都把它說的太復雜了转唉。直到后來發(fā)現(xiàn)皮钠,其實它的運行邏輯很簡單。
實際上赠法,可以把Docker看成是給電腦安裝Linux系統(tǒng)時的Live CD麦轰,或者是給Windows用USB安裝系統(tǒng)時的WinPE。這樣會方便理解一點。

回想下自己在給PC或是虛擬機上安裝Linux系統(tǒng)時款侵,都會有個Live CD選項末荐。也是就是你可以什么都不安裝,直接進入系統(tǒng)新锈,所有的工具都能用甲脏,所有的軟件都能安裝,所有的配置也可以改妹笆。只不過你重啟過后块请,一切修改的地方都恢復原樣了。

每篇攻略都會提到這三個基本概念:

  • 鏡像 Image
    相當于一個系統(tǒng)光盤的ISO鏡像文件拳缠,是只讀的墩新。你可以直接進入image中各種操作沒有障礙,感覺就像進入Live CD系統(tǒng)了脊凰。只是所有操作都會在退出時消失抖棘,下次進image時候還是初始的樣子。
  • 容器 Container
    就像給"ISO文件"加了一層可讀寫的外衣狸涌,所有的變動都會保存在Container里切省,而image還是image,不會變帕胆。就像你可以隨便換衣服朝捆,但是身體不會變。
  • 倉庫 Repo
    一般指的Dockerhub懒豹,就是一個像Github的網(wǎng)站芙盘,只不過不是收集代碼,而是收集各種image鏡像脸秽。你可以隨意上傳下載各大廠商或個人制作的鏡像儒老。

安裝Docker

Docker分CE和EE兩個版本,一個社區(qū)公開免費记餐,一個商業(yè)付費驮樊。

參考官方:About Docker CE

Ubuntu上安裝Docker

參考官方安裝步驟:Get Docker CE for Ubuntu

準備工作:

#安裝SSL相關,讓apt通過HTTPS下載:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加docker的GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#檢查key是否相符(9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88)
sudo apt-key fingerprint 0EBFCD88

#添加docker的apt下載源
sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#更新源
sudo apt-get update

安裝docker:

$ sudo apt-get install docker-ce

卸載Docker:

$ sudo apt-get remove docker docker-engine docker.io

Mac上安裝Docker

直接下載app:

image

樹莓派上安裝Docker

樹莓派是基于ARM架構(gòu)的片酝,和PC不同囚衔。所以即使樹莓派上能做一些docker鏡像,也不能在別的PC上運行雕沿。反過來別的PC上的docker鏡像练湿,也不能在樹莓派上運行。
如果需要找樹莓派專用的鏡像审轮,那就在Dockerhub上搜索ARMRpi相關就能找到了肥哎。
有一個叫Hypriot的倉庫制作了非常多樹莓派專用docker辽俗,可以參考下。

樹莓派安裝Docker贤姆,最難的在于正確的選擇源和添加GPG-key榆苞,才能找到版本適合的docker并下載。這個過程是非常繁瑣且很難有統(tǒng)一方案的霞捡。
另外:官方的一鍵安裝版本已經(jīng)失效了。必須手動操作薄疚。

參考另一篇筆記:樹莓派安裝Docker

運行Docker

image

從Image鏡像創(chuàng)建一個Container容器:

# 新建一個Container容器(如果本地有image則直接從它創(chuàng)建碧信,如果沒有則從網(wǎng)上下載)
# 進入docke的shell -t,即進入虛擬的一個系統(tǒng)街夭,有自己的/root文件系統(tǒng)結(jié)構(gòu)

$ docker run -it <repo>:<tag> <CMD>

#如:
$ docker run -it jekyll/jekyll:latest bash

# 為container指定名稱(而不是只用ID來引用)
$ docker run -it --name <NAME> <image-ID>

查看已有的:

# 查看已有的images
$ docker images

# 查看已創(chuàng)建的containers
$ docker container ls -a

運行一個已有的Container:

# 先啟動container
$ docker container <ID> start

# 運行(掛載)container砰碴,掛載后自動進入容器里的shell
$ docker attach <ID>

# 或者一句話完成(--attach)
$ docker start -a<ID> 

刪除已有的:

# 刪除image
$ docker rm <Image-ID>

# 刪除container
$ docker rm <Container-ID>

無需sudo執(zhí)行docker

為了每次執(zhí)行docker不需要總是輸入sudo,我們需要為docker創(chuàng)建一個用戶組板丽,并授予權(quán)限才行:

# 創(chuàng)建docker用戶組
sudo groupadd docker

# 把當前用戶加入到docker用戶組
sudo gpasswd -a $USER docker

# 更新當前用戶組變動(就不用退出并重新登錄了)
newgrp docker

掛載Host主機上的文件夾

我們肯定不會滿足于docker只訪問自己的小世界里的文件系統(tǒng)(什么數(shù)據(jù)都沒有)呈枉,所以有必要讓它能訪問外界Host主機上的一些文件夾。比如我有一個docker是作為下載機用的埃碱,那么我肯定得讓它把下載好的東西存到我的主機上猖辫,要不然就白下載了。

參考:Docker學習---掛載本地目錄

掛載文件夾是在docker運行鏡像的命令里就指定的(利用-v參數(shù)):

$ docker run -it -v <HOST-PATH>:<DOCKER-PATH> ubuntu64 /bin/bash

#或者作為只讀掛載 (:ro)
$ docker run -it -v <HOST-PATH>:<DOCKER-PATH>:ro ubuntu64 /bin/bash

注意砚殿,掛載的雙方都必須是絕對路徑啃憎。

映射Docker里的端口到Host主機上的端口

如果Docker里運行的是Web服務比如Nginx,里面有一個網(wǎng)站似炎,那你必須得把”虛擬機“里的端口映射到外部才能正承疗迹看到網(wǎng)頁。

映射是在運行docker命令時指定的羡藐,比如把里面的80端口映射到外面的8888端口贩毕,命令如下:

$ docker run --name webserver -d -p 80:8888 nginx

然后你在主機上的瀏覽器訪問http://localhost:8888,就可以看到nginx里的網(wǎng)頁了仆嗦。

image

Docker鏡像保存更改

直接在鏡像上改動的內(nèi)容辉阶,會在退出時全部消失。但是我們經(jīng)常需要把這些變動保存下來欧啤。

Docker保存這些變動的機制就是——生成另一個只讀鏡像睛藻。(-_-!)

雖然正常看來邢隧,這不太好吧店印。但實際上,這很好倒慧!
Docker鏡像實際上是非常小的按摘,所以生成另一個鏡像也沒有多費事包券。而且這種機制保證了每個鏡像的不可隨便修改的性質(zhì),這一點就極大的避免了混亂炫贤。

Docker保存更改有兩種方式:

  • docker commit:就像git commit一樣溅固,把每次改動作為一個commit提交,可以追溯歷史
  • Dockerfile:這是從頭build構(gòu)建一個鏡像的配置文件兰珍,把你想改動的地方(如安裝一個程序)寫成一句bash命令侍郭,加到Dockerfile這個文件里,它就會按照你的要求執(zhí)行所有的命令掠河,然后生成一個新的鏡像亮元。

Commit可以追溯歷史,但是變動了哪些地方是對外界黑箱的唠摹。
Dockerfile確實明明白白寫清楚有哪些改變爆捞。

所以一般情況下,正式構(gòu)建一個鏡像勾拉,都是用Dockerfile的煮甥。

"docker commit" 將變動過的Container保存為鏡像

參考:利用 commit 理解鏡像構(gòu)成

docker commit命令,可以將容器的存儲層保存下來成為鏡像藕赞。換句話說成肘,就是在原有鏡像的基礎上,再疊加上容器的存儲層找默,并構(gòu)成新的鏡像艇劫。以后我們運行這個新鏡像的時候,就會擁有原有容器最后的文件變化惩激。

慎用docker commit:

由于命令的執(zhí)行店煞,還有很多文件被改動或添加了。這還僅僅是最簡單的操作风钻,如果是安裝軟件包顷蟀、編譯構(gòu)建,那會有大量的無關內(nèi)容被添加進來骡技,如果不小心清理鸣个,將會導致鏡像極為臃腫。
此外布朦,使用 docker commit 意味著所有對鏡像的操作都是黑箱操作囤萤,生成的鏡像也被稱為黑箱鏡像,換句話說是趴,就是除了制作鏡像的人知道執(zhí)行過什么命令涛舍、怎么生成的鏡像,別人根本無從得知唆途。而且富雅,即使是這個制作鏡像的人掸驱,過一段時間后也無法記清具體在操作的。雖然 docker diff 或許可以告訴得到一些線索没佑,但是遠遠不到可以確保生成一致鏡像的地步毕贼。這種黑箱鏡像的維護工作是非常痛苦的。
而且蛤奢,回顧之前提及的鏡像所使用的分層存儲的概念鬼癣,除當前層外,之前的每一層都是不會發(fā)生改變的啤贩,換句話說扣溺,任何修改的結(jié)果僅僅是在當前層進行標記、添加瓜晤、修改,而不會改動上一層腹纳。如果使用 docker commit 制作鏡像痢掠,以及后期修改的話,每一次修改都會讓鏡像更加臃腫一次嘲恍,所刪除的上一層的東西并不會丟失足画,會一直如影隨形的跟著這個鏡像,即使根本無法訪問到佃牛。這會讓鏡像更加臃腫淹辞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俘侠,隨后出現(xiàn)的幾起案子象缀,更是在濱河造成了極大的恐慌,老刑警劉巖爷速,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件央星,死亡現(xiàn)場離奇詭異,居然都是意外死亡惫东,警方通過查閱死者的電腦和手機莉给,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廉沮,“玉大人颓遏,你說我怎么就攤上這事≈褪保” “怎么了叁幢?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漂洋。 經(jīng)常有香客問我遥皂,道長力喷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任演训,我火速辦了婚禮弟孟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘样悟。我一直安慰自己拂募,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布窟她。 她就那樣靜靜地躺著陈症,像睡著了一般。 火紅的嫁衣襯著肌膚如雪震糖。 梳的紋絲不亂的頭發(fā)上录肯,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音吊说,去河邊找鬼论咏。 笑死,一個胖子當著我的面吹牛颁井,可吹牛的內(nèi)容都是我干的厅贪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雅宾,長吁一口氣:“原來是場噩夢啊……” “哼养涮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起眉抬,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贯吓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吐辙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣决,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年昏苏,在試婚紗的時候發(fā)現(xiàn)自己被綠了尊沸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡贤惯,死狀恐怖洼专,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情孵构,我是刑警寧澤屁商,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站颈墅,受9級特大地震影響蜡镶,放射性物質(zhì)發(fā)生泄漏雾袱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一官还、第九天 我趴在偏房一處隱蔽的房頂上張望芹橡。 院中可真熱鬧,春花似錦望伦、人聲如沸林说。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腿箩。三九已至,卻和暖如春劣摇,著一層夾襖步出監(jiān)牢的瞬間珠移,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工末融, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剑梳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓滑潘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锨咙。 傳聞我的和親對象是個殘疾皇子语卤,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Docker — 云時代的程序分發(fā)方式 要說最近一年云計算業(yè)界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,535評論 15 147
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一酪刀、Docker 簡介 Docke...
    極客圈閱讀 10,501評論 0 120
  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,752評論 1 21
  • 一粹舵、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,389評論 0 27
  • 前端時間做Vue項目的時候,要用到圖片壓縮處理骂倘,網(wǎng)上查閱了資料后眼滤,發(fā)現(xiàn)并不能滿足實際的業(yè)務需求;于是历涝,自己結(jié)合網(wǎng)上...
    Cryptic閱讀 21,857評論 20 36