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中文網站:
Docker中文指南:
http://www.widuu.com/chinese_docker/index.html