1. 程式人生 > >Docker基礎 ------入門實戰

Docker基礎 ------入門實戰

簡介

Docker是一種新興的虛擬化技術,能夠一定程度上的代替傳統虛擬機器。不過,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。我也將Docker類比於Python虛擬環境,可以有效的配置各個版本的開發環境,比如深度學習與Java環境。

優勢

本人主要想用來配置開發環境,由於實驗室機器系統環境版本等衝突的問題。

先用一張Docker — 從入門到實踐裡的圖整體感受一下其獨特的優勢:

對比傳統虛擬機器

更高效的利用系統資源:由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,一個相同配置的主機,往往可以執行更多數量的應用。
更快速的啟動時間

:傳統的虛擬機器技術啟動應用服務往往需要數分鐘,而Docker 容器應用,由於直接運行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。
一致的執行環境:開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一 
致,導致有些bug 並未在開發過程中被發現。而Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現「這段程式碼在我機器上沒問題啊」這類問題。
持續交付和部署:Docker是build once,run everywhere. 使用Docker 可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過Dockerfile 來進行映象構建,並結合持續整合(Continuous Integration) 系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。
更輕鬆的遷移
:Docker 使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,Docker 團隊同各個開源專案團隊一起維護了一大批高質量的官方映象,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的映象製作成本。使用Dockerfile 使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。
映象(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 可以用來在容器中執行一個程序