Docker基礎 ------入門實戰
簡介
Docker是一種新興的虛擬化技術,能夠一定程度上的代替傳統虛擬機器。不過,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。我也將Docker類比於Python虛擬環境,可以有效的配置各個版本的開發環境,比如深度學習與Java環境。
優勢
本人主要想用來配置開發環境,由於實驗室機器系統環境版本等衝突的問題。
先用一張Docker — 從入門到實踐裡的圖整體感受一下其獨特的優勢:
更高效的利用系統資源:由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,一個相同配置的主機,往往可以執行更多數量的應用。
更快速的啟動時間
一致的執行環境:開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一
致,導致有些bug 並未在開發過程中被發現。而Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現「這段程式碼在我機器上沒問題啊」這類問題。
持續交付和部署:Docker是build once,run everywhere. 使用Docker 可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過Dockerfile 來進行映象構建,並結合持續整合(Continuous Integration) 系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
更輕鬆的遷移
映象(Image)
映象,從認識上簡單的來說,就是面向物件中的類,相當於一個模板。從本質上來說,映象相當於一個檔案系統。Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
容器(Container)
容器,從認識上來說,就是類建立的例項,就是依據映象這個模板創建出來的實體。容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的root 檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。
倉庫(Repository)
倉庫,從認識上來說,就好像軟體包上傳下載站,有各種軟體的不同版本被上傳供使用者下載。映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務。
安裝Docker
Win10下載:https://docs.docker.com/docker-for-windows/install/
Docker支援64 位版本的Windows 10 Pro,且必須開啟Hyper-V。開啟方式為:開啟“控制面板”->“程式”-> “啟動或關閉Windows功能”,找到Hyper-V並勾選,確定重啟電腦。
Linux安裝:sudo pip install docker
建立docker 使用者組
預設情況下,docker 命令會使用Unix socket 與Docker 引擎通訊。而只有root 使用者和docker 組的使用者才可以訪問Docker 引擎的Unix socket。出於安全考慮,一般Ubuntu系統上不會直接使用root 使用者。因此,更好地做法是將需要使用docker 的使用者加入docker使用者組。
建立docker組:sudo groupadd docker
將當前使用者加入docker組:sudo usermod -aG docker $USER
配置國內映象加速在/etc/docker/daemon.json 中寫入如下內容(如果檔案不存在請新建該檔案)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
重新啟動服務
sudo systemctl daemon-reload
sudo systemctl restart docker
下載image :
啟動服務:sudoservice docker start
下載映象:sudo docker pull ubuntu:16.04
常用命令:
啟動互動式容器:docker run -t -i --name=容器的名字 IMAGE_NAME /bin/bash -i是互動模式啟動 -t是在命令列下啟動
-i --interactive=true | false,預設是false -t --tty=true | false,預設是false
docker run -i -t --privileged=true -d -p 4489:4489/tcp --name 容器的名字ubuntu:16.04 /bin/bash
docker run -i -t ubuntu /bin/bash
檢視容器:docker ps [-a] [-l] 省略 列出正在執行的容器 -a all 列出所有容器 -l latest 列出最近的容器
檢視指定容器:docker inspect name | id
name指代具體的容器名稱,id則是容器的唯一id標識。inspect命令可以詳細的展示出容器的具體資訊。
docker run -d -p -v建立並啟動一個容器,在run後面加上-d引數,則會建立一個守護式容器在後臺執行。-P:將容器內部使用的網路埠對映到我們使用的主機上。-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>宿機目錄必須是絕對的
容器的埠對映
命令:run [-P] [-p]
-P,–publish-all=true | false,大寫的P表示為容器暴露的所有埠進行對映;
-p,–publish=[],小寫的p表示為容器指定的埠進行對映,有四種形式:
containerPort:只指定容器的埠,宿主機埠隨機對映; docker run -p 80
hostPort:containerPort:同時指定容器與宿主機埠一一對映;docker run -p 8080:80
ip::containerPort:指定ip和容器的埠; docker run -p 0.0.0.0::80
ip:hostPort:containerPort:指定ip、宿主機埠以及容器埠。 docker run -p 0.0.0.0:8080:80
docker ps -a 檢視已經建立的容器
docker ps -s 檢視已經啟動的容器
docker start con_name 啟動容器名為con_name的容器
docker stop con_name 停止容器名為con_name的容器
docker logs con_name 獲取容器名為con_name的容器日誌
docker command --help 命令 檢視相關引數意義
docker rm con_name 刪除容器名為con_name的容器
docker rename old_name new_name 重新命名一個容器
docker attach con_name 將終端附著到正在執行的容器名為con_name的容器的終端上面去,前提是建立該容器時指定了相應的sh執行這個命令後,按下回車鍵,會進入容器的命令列Shell中。
docker inspect 檢視容器的詳細資訊
docker top con_name 檢視容器名為con_name的容器內部的程序
docker exec 可以用來在容器中執行一個程序