進入docker的世界

2021-09-12 23:57:24 字數 4732 閱讀 9131

最近學習machine learning發現好多人都用docker,之前一直聽說但是感覺和自己無關。但是現在發現原來docker是個這麼方便的東西,可以跨平台(不分什麼版本的linux,甚至mac和windows也行)執行。所以這裡開一篇來記錄學習感受。
參考:docker 完全指南

參考: gitbook - docker — 從入門到實踐

不提那些難懂的術語,大白話就是:

乙個docker就是乙個linux的live cd系統,跟usb系統一樣,有完整的系統檔案目錄和程式。

我們可以在這個與外界隔離的便攜系統裡隨便讀寫操作,只是每次進入它時候,都會恢復最開始的樣子,像什麼事都沒發生一樣。

我們可以像定製live cd或winpe一樣,定製這個小系統裡面預設裝什麼軟體。一旦定製好了,就是不可更改的,非常穩定。

一開始發現很亂很難理解,覺得所有人都把它說的太複雜了。直到後來發現,其實它的執行邏輯很簡單。

實際上,可以把docker看成是給電腦安裝linux系統時的live cd,或者是給windows用usb安裝系統時的winpe。這樣會方便理解一點。

回想下自己在給pc或是虛擬機上安裝linux系統時,都會有個live cd選項。也是就是你可以什麼都不安裝,直接進入系統,所有的工具都能用,所有的軟體都能安裝,所有的配置也可以改。只不過你重啟過後,一切修改的地方都恢復原樣了。
每篇攻略都會提到這三個基本概念:

相當於乙個系統光碟的iso映象檔案,是唯讀的。你可以直接進入image中各種操作沒有障礙,感覺就像進入_live cd_系統了。只是所有操作都會在退出時消失,下次進image時候還是初始的樣子。

就像給"iso檔案"加了一層可讀寫的外衣,所有的變動都會儲存在container裡,而image還是image,不會變。就像你可以隨便換衣服,但是身體不會變。

docker分ce和ee兩個版本,乙個社群公開免費,乙個商業付費。
參考官方安裝步驟:get docker ce for ubuntu

準備工作:

# 新增docker的gpg key

curl -fssl | sudo apt-key add -

#檢查key是否相符(9dc8 5822 9fc7 dd38 854a e2d8 8d81 803c 0ebf cd88)

sudo apt-key fingerprint 0ebfcd88

sudo add-apt-repository "deb [arch=amd64] $(lsb_release -cs) stable"

#更新源

sudo apt-get update

安裝docker:

$ sudo apt-get install docker-ce
解除安裝docker:

樹莓派是基於arm架構的,和pc不同。所以即使樹莓派上能做一些docker映象,也不能在別的pc上執行。反過來別的pc上的docker映象,也不能在樹莓派上執行。

如果需要找樹莓派專用的映象,那就在dockerhub上搜尋armrpi相關就能找到了。

有乙個叫

hypriot的倉庫製作了非常多樹莓派專用docker,可以參考下。

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

[站外上傳中...(image-e81557-1548159126389)]

從image映象建立乙個container容器:

# 進入docke的shell -t,即進入虛擬的乙個系統,有自己的/root檔案系統結構

$ docker run -it :#如:

$ docker run -it jekyll/jekyll:latest bash

# 為container指定名稱(而不是只用id來引用)

$ docker run -it --name

檢視已有的:

# 檢視已有的images

$ docker images

# 檢視已建立的containers

$ docker container ls -a

執行乙個已有的container:

# 先啟動container

$ docker container start

# 執行(掛載)container,掛載後自動進入容器裡的shell

$ docker attach # 或者一句話完成(--attach)

$ docker start -a

刪除已有的:

# 刪除image

$ docker rm # 刪除container

$ docker rm

為了每次執行docker不需要總是輸入sudo,我們需要為docker建立乙個使用者組,並授予許可權才行:

# 建立docker使用者組

sudo groupadd docker

# 把當前使用者加入到docker使用者組

sudo gpasswd -a $user docker

# 更新當前使用者組變動(就不用退出並重新登入了)

newgrp docker

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

掛載資料夾是在docker執行映象的命令裡就指定的(利用-v引數):

$ docker run -it -v :ubuntu64 /bin/bash

#或者作為唯讀掛載 (:ro)

$ docker run -it -v ::ro ubuntu64 /bin/bash

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

如果docker裡執行的是web服務比如nginx,裡面有乙個**,那你必須得把」虛擬機器「裡的埠對映到外部才能正常看到網頁。
對映是在執行docker命令時指定的,比如把裡面的80埠對映到外面的8888埠,命令如下:

$ docker run --name webserver -d -p 80:8888 nginx
然後你在主機上的瀏覽器訪問http://localhost:8888,就可以看到nginx裡的網頁了。

直接在映象上改動的內容,會在退出時全部消失。但是我們經常需要把這些變動儲存下來。
docker儲存這些變動的機制就是——生成另乙個唯讀映象。(-_-!)

雖然正常看來,這不太好吧。但實際上,這很好!

docker映象實際上是非常小的,所以生成另乙個映象也沒有多費事。而且這種機制保證了每個映象的不可隨便修改的性質,這一點就極大的避免了混亂。

docker儲存更改有兩種方式:

commit可以追溯歷史,但是變動了哪些地方是對外界黑箱的。

dockerfile確實明明白白寫清楚有哪些改變。

所以一般情況下,正式構建乙個映象,都是用dockerfile的。

參考:利用 commit 理解映象構成

docker commit命令,可以將容器的儲存層儲存下來成為映象。換句話說,就是在原有映象的基礎上,再疊加上容器的儲存層,並構成新的映象。以後我們執行這個新映象的時候,就會擁有原有容器最後的檔案變化。

慎用docker commit:

由於命令的執行,還有很多檔案被改動或新增了。這還僅僅是最簡單的操作,如果是安裝軟體包、編譯構建,那會有大量的無關內容被新增進來,如果不小心清理,將會導致映象極為臃腫。

此外,使用 docker commit 意味著所有對映象的操作都是黑箱操作,生成的映象也被稱為黑箱映象,換句話說,就是除了製作映象的人知道執行過什麼命令、怎麼生成的映象,別人根本無從得知。而且,即使是這個製作映象的人,過一段時間後也無法記清具體在操作的。雖然 docker diff 或許可以告訴得到一些線索,但是遠遠不到可以確保生成一致映象的地步。這種黑箱映象的維護工作是非常痛苦的。

而且,回顧之前提及的映象所使用的分層儲存的概念,除當前層外,之前的每一層都是不會發生改變的,換句話說,任何修改的結果僅僅是在當前層進行標記、新增、修改,而不會改動上一層。如果使用 docker commit 製作映象,以及後期修改的話,每一次修改都會讓映象更加臃腫一次,所刪除的上一層的東西並不會丟失,會一直如影隨形的跟著這個映象,即使根本無法訪問到。這會讓映象更加臃腫。

進入erlang的世界

今天開始研究用erlang實現大型併發服務的方法,以期充分利用它的高併發 高可靠特性來實現我們網路應用服務,達到 電信級服務 的要求。根據網上的介紹,寫了乙個簡單的測試程式test.erl,卻不知道預設可以放在 我用c test 命令編譯報告檔案找不到,後來發現要把它放到bin目錄去 預設是cean...

進入Django的世界

首先,確保自己的電腦已經安裝好了python環境,如果不清楚自己是否已經安裝了python,你可以開啟命令列視窗或者是linux終端輸入python命令進行驗證 administrator ubuntu python 上面出現的資訊說明python環境已經安裝,ok,那麼我們可以正式開始動工了。dj...

進入php的世界

php php hypertext preprocessor 單個單詞的首字母縮寫,是一種網路站點伺服器端的指令碼語言 它是開源免費的,使用非常廣泛,而且非常容易使用 其他的伺服器端指令碼語言還有asp等。php可以於執行於各種平台,包括windows linux unix和mac等,而且它能夠相容...