標籤:筆記 版本 操作 分享 mct 下載 若是 stdout 轉寄
一、前言
Docker容器已經發布許久,但作為一名程式員如今才開始接觸,實在是罪過……
在此之前,我還沒有對Docker進行過深入的瞭解,對它的認識仍停留在:這是一種新型的虛擬機器。這樣的層面。今天就我的初次體驗進行記錄。聲明一點:以下內容大部分是主觀片面的,另有來自百度的(嗯,就是百度)。要是有什麼說的不對,或者是理解有問題的地方,還請大家告訴我,先謝謝大家了。
二、環境
我的基礎運行環境是運行在Win10專業版HyperV虛擬機器中的CentOS7-Minimal版本。新裝的虛擬機器,保證運行環境不受奇奇怪怪的東西影響。
CentOS安裝Docker簡潔明快:sudo yum install docker -y。等著就行……安裝內容如下:
四、啟動Docker服務
與安裝一樣簡潔明快:sudo systemctl start docker。如果沒有報錯,那就是啟動完成了。(我喜歡用systemctl,反正只要能啟動服務,你想咋啟動就咋啟動。)命令沒有回顯,我就不了。
五、擷取容器鏡像
Docker提供鏡像搜尋命令(search),方便你快速找到自己想要的鏡像。當然,鏡像的源你可以自己配置,預設是docker.io。我只打算找一個CentOS的鏡像,所以預設的源就行。搜尋命令如下:
可以看到,搜尋到好多鏡像。最後兩列字面意思我沒理解,但是應該是標記官方鏡像和開發人員上傳的鏡像。我選擇第一個,標記著“官方的”,應該沒有裝任何其他的東西。
嗯,接下來就是下載(pull)鏡像了。命令如下(渣渣網速):
可以看到,預設下載的是最新的(latest)。當然,你可以下載其他非最新的版本,具體操作請查詢pull命令的相關參數。我只要最新的(傲嬌臉)。這個鏡像大小也是6 。這麼小,估計真的是什麼都沒裝吧(還是壓縮了?)……
上面是下載完成後顯示的資訊。
六、建立容器
接下來就是從剛下載的鏡像建立一個容器了。新的容器的所有內容都會從鏡像裡拷貝(那個改是拷貝吧)。
聲明:由於輸入sudo太麻煩,所以下面的示範都用root使用者執行。
建立容器(run)命令就比較複雜了,參數較多:
如上,我來一個一個解釋:
-itd:這是 -i -t -d 的簡寫。-i 表示保持開啟標準輸入資料流(stdin),無論是否串連到此容器。-t 為容器分配一個虛擬tty。-d 表示後台模式運行容器,即容器啟動後將斷開與當前終端的串連。(之後會示範怎麼再連回來)。
--name:這是為容器起一個名字,之後與容器的互動需要用到,當然用容器的Id也是可以的(就是run命令後那個巨長的回顯)。當然,不寫的話也會有預設的名字。
-v:表示掛載宿主機(這個稱呼對嗎?)目錄到容器的目錄(宿主機目錄路徑:容器目錄路徑)。當然可以設定讀寫屬性,這個就不說了,可以自行探索。
-p:表示映射(連接埠轉寄?)主機連接埠至容器連接埠(主機連接埠:容器連接埠)。這個參數可以重複出現,映射多個連接埠。這個參數也有許多情況,也請自行探索。
centos:這個是本地鏡像名稱(centos),必須是已經下載(pull)到本地的鏡像。當然,若是本地沒有,Docker會執行search並詢問你是不是要下載。
/bin/bash:這個是本次啟動的鏡像要執行的任務。這個門道比較多,我在後面會說一下。
此處省略了-a參數。-a參數可以指定串連准輸入資料流(STDIN)、標準輸出資料流(STDOUT)和標準錯誤流(STDERR),預設好像是都串連。可以顯式使用,以串連指定的流。
以上就是命令的相關解釋,是我自己配合百度理解的,要是有不對的,請大家留言哦。
七、查看容器
使用docker ps -a 命令可以查看當前存在的所有容器:
如上,我只運行了一個容器。命令顯示了容器的ID、使用的鏡像、啟動並執行命令、建立時間、已耗用時間、連接埠映射、名稱。
八、串連容器
串連容器有多種辦法。在宿主機中使用Docker的attach命令,即可串連到容器:
如上,就已經串連到容器了。可以看到命令列資訊的變化。
我使用了ps命令查看了容器中的進程。可以看到一個ID為1的進程,這個進程就是run命令最後的那個參數。Run命令所指定的任務進程Id一定是1 。我們使用attach命令串連的也是這個命令的標準輸入輸出資料流(錯誤流我不知道串連了沒)。由於run指定的命令是bash,所以attach也是串連到了bash,這樣就能隨意操作容器了。
關閉串連很容易想到,就是退出bash:exit。
但是、但是、但是,這樣退出會導致一個問題,那時就是:容器因為1號進程的退出(就是attach命令串連的bash),會認為任務已完成,容器就停止了。
如上,容器已經停止了(Exited)。
所以,我建議使用exec命令對容器進行操作。我們重啟容器:
可以看到,start 加容器名稱就能啟動。
使用exec命令,可以讓容器直接執行命令(docker exec 容器名稱 命令):
如上,是我用exec對nethost執行ps命令查看進程,執行ls命令列出根目錄。
也可以用exec執行bash並掛載輸入輸出資料流:
如上,是我用exec命令啟動bash並掛載輸入輸出資料流。-it參數的意義和run命令相同,不同的是沒有使用-d命令,這樣(前台模式)可以使命令執行後直接連接輸入輸出資料流。我執行了ls命令和ps命令。
從ps命令的顯示可以看出,exec命令啟動了一個新的bash,PID為24(當然,PID應該是隨機賦值的)。區別於PID為1的bash,我們當前串連的就是這個PID為24的bash,一樣可以執行命令,隨意操作。並且退出之後,也不會影響PID為1的bash,這樣就可以使容器繼續運行。
可見,我退出了容器的bash後,容器依然在運行。我在宿主機中使用exec執行ps命令後,nethost這個容器中1號進程仍然在運行。
九、停止和刪除容器
上面提到了啟動容器(start)命令,停止容器當然是停止命令(stop)了。
stop命令執行效果如上。
刪除容器更容易,使用rm命令:
如上,我刪除了名為nethost的容器,因為只有一個容器,所以刪除之後九沒有容器了。要注意的是:rm命令只能刪除已經停止的容器。並且rm命令不像linux的rm命令那樣會有刪除確認,docker的rm命令會直接刪除容器,所以用的時候要小心。
十、其他
其他的內容,如:備份、遷移、上傳鏡像等,我還沒有試過,暫時不進行記錄。
初次使用Docker的體驗筆記