Docker新手入門詳細介紹

Docker新手入門詳細介紹

Docker 起源於 dotCloud 公司的內部項目,於 2013 年 3 月以 Apache 2.0 授權協議開源,主要項目代碼在 GitHub 上進行維護,2013 年底公司改名爲 Docker。因此,Docker 既是世界領先的軟件容器平臺(或引擎)名,又是推出這個平臺的公司名,通常是指前者。

開發者可以打包自己的應用到容器裏面,然後遷移到其他機器的docker應用中,可以實現快速部署。

 

Docker 官網:https://www.docker.com

上圖是目前(2020年4月)Docker官網首頁顯示情況。

 

容器技術是後於虛擬化技術出現的,如果說虛擬化技術的出現主要是爲了解決資源調配和隔離的問題,那麼容器技術解決的是應用開發、測試和部署等提升效率的問題。Docker是 衆多容器解決方案中傑出的代表。

2015年,由Google,Docker、CoreOS、IBM、微軟、紅帽等廠商聯合發起的OCI(Open Container Initiative)組織成立了,並於2016年4月推出了第一個開放容器標準。標準主要包括runtime(運行時)標準和image(鏡像)標準。

 

容器(Container)與虛擬機(Virtual Machine)的區別

虛擬機

傳統虛擬機如 VMware,VisualBox 之類的需要模擬整臺機器包括硬件,每臺虛擬機都需要有自己的操作系統,虛擬機一旦被開啓,預分配給它的資源將全部被佔用。每一臺虛擬機包括應用,必要的二進制和庫,以及一個完整的用戶操作系統。

優點:實現虛擬機和宿主機操作系統的異構,如在Linux系統上運行Windows的虛擬機

缺點:依賴於硬件的支持,特別是CPU虛擬化的支持

容器技術

容器技術是和我們的宿主機共享硬件資源及操作系統,容器的本質是一個進程,相當於是在正常進程的外面套了一個保護層。對於容器裏面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。。容器技術的核心功能,就是通過約束和修改進程的動態表現,從而爲其創造出一個“邊界”。Docker 屬於 Linux 容器的一種封裝。

優點:由於沒有轉換異構指令的虛擬化層,因此運行效率高於虛擬機。

缺點:只能實現與宿主機操作系統相同系統的虛擬化。

在實際使用中,常常將兩者相結合,以實現“跨不同操作系統”運行容器的目的。

虛擬機(Virtual Machine)和Docker區別

虛擬機(Virtual Machine)指通過軟件模擬的具有完整硬件系統功能的計算機系統,每個虛擬機都有獨立的CMOS、硬盤和操作系統,可以像使用實體機一樣對虛擬機進行操作。Docker 將應用程序與該程序的依賴,打包在一個文件裏面。運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行一樣。和 VMware 虛擬機相比,Docker 使用容器承載應用程序,而不使用操作系統,所以它的開銷很少,性能很高,對CPU/內存的消耗低,速度快。但是,Docker 對應用程序的隔離不如虛擬機徹底,所以它並不能完全取代虛擬機。】

 

Docker 架構

 

Docker是一個Client-Server結構的系統,Docker守護進程(Docker daemon)運行在主機上, 然後通過Socket連接從客戶端訪問,守護進程從客戶端接受命令並管理運行在主機上的容器。

說明

Docker Client 是用戶界面,它支持用戶與Docker Daemon之間通信。

Docker Daemon運行於主機上,處理服務請求。(Docker daemon有時也被稱爲“服務端”或者“引擎”)

Docker Container負責應用程序的運行,包括操作系統、用戶添加的文件以及元數據。

Docker 把應用程序及其依賴,打包在 image 文件裏面。

鏡像(Image):Docker 鏡像(Image),Docker 鏡像是用於創建 Docker 容器的模板。

容器(Container):鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等。Docker 容器通過 Docker 鏡像來創建。

Docker 倉庫(Repository)是集中存放鏡像的地方,存放鏡像的倉庫。目前 Docker 官方維護了一個公共倉庫 Docker Hub。負責對Docker鏡像進行管理的,是Docker Registry服務——類似倉庫管理員。大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現。【當然不止 docker hub,只是遠程的服務商不一樣,操作都是一樣的。】

通過這些技術的組合,帶來的效果(好處)就是,大部分應用,開發者都可以通過docker build創建鏡像,通過docker push上傳鏡像,用戶通過docker pull下載鏡像,用docker run運行應用。用戶不需要再去關心如何搭建環境,如何安裝,如何解決不同發行版的庫衝突。

特別說明:image 文件生成的容器實例,本身也是一個文件,稱爲容器文件。也就是說,一旦容器生成,就會同時存在兩個文件: image 文件和容器文件。而且關閉容器並不會刪除容器文件,只是容器停止運行而已。

 

安裝Docker

Docker 可以安裝在 Windows、Mac,當然還有 Linux 之上,也可以在雲上安裝。可以選擇不同方式完成 Docker 安裝,包括手工安裝、通過腳本方式安裝和通過嚮導方式安裝。

 

下面僅介紹如何安裝 Windows 版 Docker。

Windows10中 Docker 的環境有以下要求:

Windows 10 Pro(專業版) / Enterprise(企業版) / Education(教育版)。

Windows 必須是 64 位的版本。

需要啓用 Windows 操作系統中的虛擬機 Hyper-V。

虛擬機Hyper-V功能依賴於系統硬件的虛擬化功能,需要在BIOS裏開啓。

開機進入BIOS(聯想的筆記本,進入BIOS按鍵是F2),

進入後按左右鍵選擇configuration(配置),選擇下面的 Intel Virtual Technology(Intel處理器),看是否是enable(若不是enable,回車選擇enable,按F10回車即可)。

【Hyper-V是微軟的一款虛擬化產品,Hyper-V 讓你可以在 Windows 上以虛擬機形式運行多個操作系統。具體來說,Hyper-V 提供硬件虛擬化。 這意味着每個虛擬機都在虛擬硬件上運行。 Hyper-V 允許你創建虛擬硬盤驅動器、虛擬交換機以及許多其他虛擬設備,所有這些都可以添加到虛擬機中。使用多個虛擬機在多個操作系統上測試軟件。 通過 Hyper-V,可以在一部臺式機或便攜式計算機上運行所有內容。 可以將這些虛擬機導出並隨後導入到任何其他 Hyper-V 系統中,包括 Azure。關於Hyper-V的深入介紹與使用本文不再介紹,感興趣的讀者可以參見:

https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/about/

 

Windows 10操作系統如何啓用Hyper-V功能?參見下圖:

或:

 

在 CMD 或PowerShell中,使用DISM命令 啓用 Hyper-V

以管理員身份打開 PowerShell 或 CMD 會話。

鍵入下列命令:

DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V

 

啓用Hyper-V功能後,要重新啓動計算機。

 

下載Docker

Docker 的下載頁面:https://www.docker.com/products/docker-desktop,並單擊其中的 Download for Windows 按鈕,出現新網頁,再單擊Get Docker,參見下圖:

 

安裝Docker

雙擊下載的 Docker Desktop Installer (大小接近1G)安裝文件,一路 Next,點擊 Finish 完成安裝。參見下圖:

單擊“OK”

安裝完成後,Docker 會自動啓動。任務欄右邊的托盤區上會出現個小鯨魚的圖標 或

這表示 Docker 正在運行(已啓動)。

 

Docker的使用

啓動Docker後,驗證安裝是否正確,

在cmd或powershell中,輸入docker version回車(按下Enter鍵),參見下圖:

 

獲取Docker幫助

輸入docker 或docker help 或docker -h,可以查看到 Docker 客戶端的所有命令選項,參見下圖:

 

 

先給出Docker常見命令

查看信息、版本

docker info # 顯示Docker系統信息

docker version # 顯示Docker版本信息

容器相關操作

docker create # 創建一個容器但是不啓動它

docker run # 創建並啓動一個容器

docker stop # 停止容器運行,發送信號SIGTERM

docker start # 啓動一個停止狀態的容器

docker restart # 重啓一個容器

docker rm # 刪除一個容器

docker kill # 發送信號給容器,默認SIGKILL

docker attach # 連接(進入)到一個正在運行的容器

docker wait # 阻塞到一個容器,直到容器停止運行

獲取容器相關信息

docker ps # 顯示狀態爲運行(Up)的容器

docker ps -a # 顯示所有容器,包括運行中(Up)的和退出的(Exited)

docker inspect # 深入容器內部獲取容器所有信息

docker logs # 查看容器的日誌(stdout/stderr)

docker events # 得到docker服務器的實時的事件

docker port # 顯示容器的端口映射

docker top # 顯示容器的進程信息

docker diff # 顯示容器文件系統的前後變化

導出容器

docker cp # 從容器裏向外拷貝文件或目錄

docker export # 將容器整個文件系統導出爲一個tar包,不帶layers、tag等信息

執行

docker exec # 進入正在運行的Docker容器,可以執行bash進入交互式

鏡像操作

docker images # 顯示本地所有的鏡像列表

docker import # 從一個tar包創建一個鏡像,往往和export結合使用

docker build # 使用Dockerfile創建鏡像(推薦)

docker commit # 從容器創建鏡像

docker rmi # 刪除一個鏡像

docker load # 從一個tar包創建一個鏡像,和save配合使用

docker save # 將一個鏡像保存爲一個tar包,帶layers和tag信息

docker history # 顯示生成一個鏡像的歷史命令

docker tag # 爲鏡像起一個別名

鏡像倉庫(registry)操作

docker login # 登錄到一個registry

docker search # 從registry倉庫搜索鏡像

docker pull # 從倉庫下載鏡像到本地

docker push # 將一個鏡像push到registry倉庫中

先大體瞭解,下面將挑選其中的一部分解析之。

 

在容器內運行應用程序

使用 docker run 命令在容器內運行一個應用程序,輸出Hello world。在cmd中輸入

docker run ubuntu:15.10 /bin/echo "Hello world"

參數解析:

docker: Docker 的二進制執行文件。

run: 與前面的 docker 組合來運行一個容器。

ubuntu:15.10 指定要運行的鏡像,Ubuntu是一個以桌面應用爲主的Linux操作系統,是基於 Debian 的 Linux 操作系統。Docker 首先從本地主機上查找鏡像是否存在,如果不存在,Docker 就會從鏡像倉庫 Docker Hub 下載公共鏡像。

/bin/echo "Hello world": 在啓動的容器裏執行的命令

上面命令完整的意思可以解釋爲:Docker 以 ubuntu15.10 鏡像創建一個新容器,然後在容器裏執行 bin/echo "Hello world",然後輸出結果。

ubuntu:15.10: 這是指用 ubuntu 15.10 版本鏡像爲基礎來啓動容器;如果你不指定一個鏡像的版本的標籤(tag),例如你只使用 ubuntu,docker 將默認使用 ubuntu:latest 鏡像。/bin/bash:放在鏡像名後的是命令。

參見下圖:

 

現在,通過 docker 的兩個參數 -i -t,讓 docker 運行的容器實現"對話"的能力,參數解析:

-t: 在新容器內指定一個僞終端或終端。

-i: 允許你對容器內的標準輸入 (STDIN) 進行交互。參見下圖:

注意第二行,此時我們已進入一個 ubuntu15.10 系統的容器,在容器中運行命令 cat /proc/version和ls分別查看當前系統的版本信息和當前目錄下的文件列表。參見下圖:

 

可以通過運行 exit 命令或者使用 CTRL+D 來退出容器。參見下圖:

注意第三行中表明我們已經退出了當期的容器,返回到當前的主機中。

 

查看所有的容器命令 docker ps -a,參見下圖:

 

查看正在運行的容器使用 docker ps 命令,參見下圖:

上圖中沒有顯示具體的容器,表示沒有正在運行的容器。

停止容器的命令 docker stop <容器ID或者名字>

docker stop 85bd3fabcacb,參見下圖:

 

使用 docker start <容器ID或者名字>啓動一個已停止的容器:

docker start 85bd3fabcacb,參見下圖:

 

刪除容器,使用 docker rm <容器ID或者名字>命令

注意使用此命令,要刪除的容器狀態應爲Exited,沒有提示確認,直接刪除。

 

要清理掉所有處於終止狀態的容器,使用 docker container prune 命令

使用此命令,將如下提示,讓你確認

WARNING! This will remove all stopped containers.

Are you sure you want to continue? [y/N]。參見下圖:

 

可以使用docker top <ID或者名字> 命令,查看容器內部運行的進程。參見下圖:

【提示:上圖兩條docker top 命令做的是同一件事,前者使用的是名字,後者使用的是ID號。】

可以使用docker logs <ID或者名字>  命令, 可以查看容器內部的標準輸出。參見下圖:

 

可以使用docker inspect <ID或者名字>  命令,查看 Docker 的底層信息——它會返回一個 JSON 文件記錄着 Docker 容器的配置和狀態信息。參見下圖:

 

當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。

 

使用docker image pull library/hello-world命令,將 image 文件從倉庫抓取到本地,參見下圖:

上面代碼中,docker image pull是抓取 image 文件的命令。library/hello-world是 image 文件在倉庫裏面的位置,其中library是 image 文件所在的組,hello-world是 image 文件的名字。

由於 Docker 官方提供的 image 文件,都放在library組裏面,所以它的是默認組,可以省略。因此,上面的命令可以寫成下面這樣。

docker image pull hello-world

 

使用docker image ls或 docker images命令,可以列出本機的所有 image 文件,參見下圖:

顯示項的說明:

REPOSITORY:表示鏡像的倉庫源;TAG:鏡像的標籤(同一倉庫源可以有多個 TAG,代表這個倉庫源的不同的版本);IMAGE ID:鏡像ID;CREATED:鏡像創建時間; SIZE:鏡像大小。

 

現在,可以使用docker container run hello-world運行hello-world這個 image 文件,參見下圖:

 

輸出這段提示以後,hello world就會停止運行,容器自動終止(有些容器可能不會自動終止,需要手動終止)。

 

可以使用 docker search 命令來搜索鏡像。比如我們需要一個 httpd 的鏡像來作爲我們的 web服務。我們可以通過 docker search httpd 命令搜索 httpd 來尋找適合我們的鏡像。參見下圖:

其中,NAME: 鏡像倉庫源的名稱;DESCRIPTION: 鏡像的描述;OFFICIAL: 是否 docker 官方發佈;AUTOMATED: 自動構建。

 

刪除 image 文件

使用 docker image rm [imageName]命令

有時刪除鏡像報錯,一般是因有依賴的容器(container)。

需要先刪除依賴的容器才能夠刪除其中的鏡像,在此先使用docker container rm 2eb5c73e63e2,再使用docker rmi hello-world, 參見下圖:

 

 

如何生成 image 文件/製作自己的 Docker 容器

學會使用 image 文件以後,接下來的問題就是,如何可以生成 image 文件?

這就需要用到 Dockerfile 文件。它是一個文本文件,用來配置 image。Docker 根據 該文件生成二進制的 image 文件。換句話說,DockerFile包含了一條條構建鏡像所需的指令和說明。

本部分參見阮一峯的的《Docker 入門教程》的“十、實例:製作自己的 Docker 容器”部分

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

下面以 koa-demos 項目爲例,介紹怎麼寫 Dockerfile 文件,實現讓用戶在 Docker 容器裏面運行 Koa 框架。koa是一種簡單好用的基於Node(node.js)的web開發框架。

作爲準備工作,請先下載源碼https://github.com/ruanyf/koa-demos/archive/master.zip

放在d盤解壓,參見下圖:

 

注意

其中,兩個文本文件(可用記事本打開):

文本文件.dockerignore包含不要打包進入 image 文件中的路徑。

 

文本文件 Dockerfile中含有五行,參見下圖:

含義如下:

FROM node:8.4:該 image 文件繼承官方的 node image,冒號表示標籤,這裏標籤是8.4,即8.4版本的 node。

COPY . /app:將當前目錄下的所有文件(除了.dockerignore排除的路徑),都拷貝進入 image 文件的/app目錄。

WORKDIR /app:指定接下來的工作路徑爲/app。

RUN npm install:在/app目錄下,運行npm install命令安裝依賴。注意,安裝後所有的依賴,都將打包進入 image 文件。--registry=https://registry.npm.taobao.org。

EXPOSE 3000:將容器 3000 端口暴露出來, 允許外部連接這個端口。

現在可以創建 image 文件了,先【用cmd的cd命令】切換路徑 cd /d D:\koa-demos-master

使用docker image build命令創建 image 文件了,具體用下列命令之一:

docker image build -t koa-demo .

docker image build -t koa-demo:0.0.1 .

其中,-t參數用來指定 image 文件的名字,後面還可以用冒號指定標籤。如果不指定,默認的標籤就是latest。最後的那個點表示 Dockerfile 文件所在的路徑,上例是當前路徑,所以是一個點。此命令運行可能需要較長的時間。參見下圖:

請耐心等候提示運行成功(Successfully)。【還有一條警告信息,無關緊要不管它】

如果運行成功,就可以使用docker image ls命令看到新生成的 image 文件koa-demo了。參見下圖:

 

使用docker container run命令會從 image 文件生成容器,具體用下列命令之一:

docker container run -p 8000:3000 -it koa-demo /bin/bash

docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash

其中,-p參數:容器的 3000 端口映射到本機的 8000 端口。 -it參數:容器的 Shell 映射到當前的 Shell,然後你在本機窗口輸入的命令,就會傳入容器。 koa-demo:0.0.1:image 文件的名字(如果有標籤,還需要提供標籤,默認是 latest 標籤)。 /bin/bash:容器啓動以後,內部第一個執行的命令。這裏是啓動 Bash,保證用戶可以使用 Shell。

參見下圖:

如果一切正常,運行上面的命令以後,就會返回一個命令行提示符app#參見上圖第二行。這表示你已經在容器裏面了,返回的提示符就是容器內部的 Shell 提示符。執行node demos/01.js命令。參見下圖:

這時,Koa 框架已經運行起來了。打開本機的瀏覽器,訪問 http://127.0.0.1:8000,網頁顯示"Not Found"。

 

在容器的命令行,按下 Ctrl + c 停止 Node 進程,然後按下 Ctrl + d (或者輸入 exit)退出容器。參見下圖:

 

進入Docker容器

使用docker exec命令,可以進入正在運行的Docker容器  

【對於docker exec命令使用docker exec --help,可以得它的使用幫助】

使用進入一個正在運行的Docker容器命令,docker exec -it 33db0f67bf82 /bin/bash,參見下圖:

 

容器運行成功後,就確認了 image 文件的有效性。這時,就可以考慮把 image 文件分享到網上——發佈 image 文件,讓其他人使用。

 

發佈 image 文件的步驟如下

因爲需要使用Docker ID登錄,若沒有,需要先去https://hub.docker.com  註冊(若有可略過此步)。參見下圖:

然後,用下面的命令登錄。參見下圖:

docker login

 

接着,爲本地的 image 標註用戶名和版本:

docker image tag [imageName] [username]/[repository]:[tag]

例如:

docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

 

也可以不標註用戶名,重新構建一下 image 文件:

docker image build -t [username]/[repository]:[tag] .

 

最後,發佈 image 文件:

docker image push [username]/[repository]:[tag]

發佈成功以後,登錄 hub.docker.com,就可以看到已經發布的 image 文件。

 

Docker安裝 Python

可以用 docker search python 命令來查看可用版本,參見下圖:

 

這裏我們拉取官方的鏡像,標籤爲3.5,使用docker pull python:3.5命令,參見下圖:

 

等待下載完成後,我們就可以在本地鏡像列表裏查到 REPOSITORY 爲python, 標籤爲 3.5 的鏡像,使用docker images python:3.5命令,參見下圖:

 

【查看python:3.5鏡像的信息

使用docker image inspect python:3.5命令】

 

使用 python 鏡像

在win10中用docekr創建python容器去執行本地.py文件,

在D:盤中新建目錄pyfile,在pyfile目錄中新建文件 pyth.py,內容如下:

print("Hello, World! My test");

print("呵呵");

參見下圖:

win10中用docker容器運行本地python文件的命令:

docker run -v d:/pyfile:/usr/src/pyfile -w /usr/src/pyfile python:3.5 python pyth.py

其中:-v d:/pyfile:/usr/src/pyfile是將本機上要運行的代碼文件(.py文件)的目錄d:/pyfile掛載到容器中的執行路徑/usr/src/pyfile。

-w /usr/src/pyfile指定容器的工作目錄,就是執行py文件的路徑。

python:3.5:鏡像的名稱和標籤(版本號),這裏就是指python3.5這個版本鏡像。

python pyth.py表示用容器中的python命令執行pyth.py代碼文件。

參見下圖:

 

鏡像加速

國內訪問 Docker 的官方倉庫很慢,還經常斷線,所以要把倉庫網址改成國內的鏡像站。官方鏡像之一: https://rregistry.docker-cn.com 。

對於使用 Windows 10 的系統,在系統右下角托盤 Docker 圖標內右鍵菜單選擇 Settings,打開配置窗口後左側導航菜單選擇 Daemon。在 Registrymirrors 一欄中填寫加速器地址 https://registry.docker-cn.com ,之後點擊 Apply&Resart後 Docker 就會重啓並應用配置的鏡像地址了。參見下圖:

 

將網址https://registry.docker-cn.com加入

然後,重啓(Restart) Docker 。

 

有了上面的基礎,再深入下去,就容易些。Docker涉及範圍很廣,本文就此打住,若想深入學習,可以參考:

Docker教程:Docker入門實踐(精講版)

http://c.biancheng.net/docker/

Docker之 runoob.com教程

https://www.runoob.com/docker/docker-tutorial.html

Docker中文網站:

http://www.docker.org.cn

Docker中文指南:

http://www.widuu.com/chinese_docker/index.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章