轉自:https://cloud.tencent.com/developer/article/1354393python
虛擬機和 docker 的區別,以下圖:docker
鏡像不包含任何動態數據,其內容在構建以後也不會被改變。鏡像(Image)就是一堆只讀層(read-only layer)的統一視角。bash
從左邊咱們看到了多個只讀層,它們重疊在一塊兒。除了最下面一層,其餘層都會有一個指針指向下一層。這些層是 Docker 內部的實現細節,而且可以在主機的文件系統上訪問到。服務器
統一文件系統(Union File System)技術可以將不一樣的層整合成一個文件系統,爲這些層提供了一個統一的視角。網絡
這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。咱們能夠在圖片的右邊看到這個視角的形式。架構
容器(Container)的定義和鏡像(Image)幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。app
因爲容器的定義並無說起是否要運行容器,因此實際上,容器 = 鏡像 + 讀寫層。函數
Docker 倉庫是集中存放鏡像文件的場所。鏡像構建完成後,能夠很容易的在當前宿主上運行。工具
若是須要在其餘服務器上使用這個鏡像,就須要一個集中的存儲、分發鏡像的服務,Docker Registry(倉庫註冊服務器)就是這樣的服務。ui
一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本 。
能夠經過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 Latest 做爲默認標籤。
倉庫又能夠分爲兩種形式:
Public(公有倉庫)
Private(私有倉庫)
Docker 的核心組件包括:
Docker Client
Docker Daemon
Docker Image
Docker Registry
Docker Container
Docker 採用的是 Client/Server 架構。客戶端向服務器發送請求,服務器負責構建、運行和分發容器。
客戶端和服務器能夠運行在同一個 Host 上,客戶端也能夠經過 Socket 或 REST API 與遠程的服務器通訊。
Docker Client ,也稱 Docker 客戶端。它其實就是 Docker 提供命令行界面(CLI)工具,是許多 Docker 用戶與 Docker 進行交互的主要方式。
客戶端能夠構建,運行和中止應用程序,還能夠遠程與 Docker_Host 進行交互。
最經常使用的 Docker 客戶端就是 Docker 命令,咱們能夠經過 Docker 命令很方便地在 Host 上構建和運行 Docker 容器。
Docker Daemon 是服務器組件,以 Linux 後臺服務的方式運行,是 Docker 最核心的後臺進程,咱們也把它稱爲守護進程。
它負責響應來自 Docker Client 的請求,而後將這些請求翻譯成系統調用完成容器管理操做。
該進程會在後臺啓動一個 API Server ,負責接收由 Docker Client 發送的請求,接收到的請求將經過 Docker Daemon 內部的一個路由分發調度,由具體的函數來執行請求。
大體能夠將其分爲如下三部分:
Docker Server
Engine
Job
Docker Daemon 能夠認爲是經過 Docker Server 模塊接受 Docker Client 的請求,並在 Engine 中處理請求,而後根據請求類型,建立出指定的 Job 並運行。
Docker Daemon 運行在 Docker Host 上,負責建立、運行、監控容器,構建、存儲鏡像。
運行過程的做用有如下幾種可能:
向 Docker Registry 獲取鏡像。
經過 graphdriver 執行容器鏡像的本地化操做。
經過 networkdriver 執行容器網絡環境的配置。
經過 execdriver 執行容器內部運行的執行工做。
默認配置下,Docker Daemon 只能響應來自本地 Host 的客戶端請求。若是要容許遠程客戶端請求,須要在配置文件中打開 TCP 監聽。
Docker 鏡像能夠看做是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。
鏡像不包含任何動態數據,其內容在構建以後也不會被改變。咱們可將 Docker 鏡像當作只讀模板,經過它能夠建立 Docker 容器。
鏡像有多種生成方法:
從無到有開始建立鏡像
下載並使用別人建立好的現成的鏡像
在現有鏡像上建立新的鏡像
咱們能夠將鏡像的內容和建立步驟描述在一個文本文件中,這個文件被稱做 Dockerfile ,經過執行 docker build <docker-file>命令能夠構建出 Docker 鏡像。
Docker Registry 是存儲 Docker Image 的倉庫,運行 docker push、docker pull、docker search 時,其實是經過 Docker Daemon 與 Docker Registry 通訊。
Docker 容器就是 Docker 鏡像的運行實例,是真正運行項目程序、消耗系統資源、提供服務的地方。
Docker Container 提供了系統硬件環境,可使用 Docker Images 這些製做好的系統盤,再加上咱們所編寫好的項目代碼,Run 一下就能夠提供服務啦。
拉取一個 Docker 鏡像:docker pull image_name
查看主機下存在多少鏡像:docker images
當前有哪些容器在運行:docker ps -a
對一個容器進行啓動,重啓和中止:
進入到這個容器中:docker attach container_name/container_id
運行這個容器中的鏡像而且調用鏡像裏面的 bash :docker run -t -i container_name/container_id /bin/bash
刪除指定鏡像:(中止這個容器,刪除這個容器,刪除這個鏡像)
Dockerfile 是自動構建 Docker 鏡像的配置文件,用戶可使用 Dockerfile 快速建立自定義的鏡像。
通常來講,能夠將 Dockerfile 分爲四個部分:
基礎鏡像(父鏡像)信息指令 FROM。
維護者信息指令 MAINTAINER。
鏡像操做指令 RUN 、EVN 、ADD 和 WORKDIR 等。
容器啓動指令 CMD 、ENTRYPOINT 和 USER 等。
FROM python:2.7 MAINTAINER author<author@163.com> COPY . /app WORKDIR /app RUN pip install -r requirements.txt EXPOSE 5000
ENTRYPOINT ["python"]
CMD ["app.py"]
能夠分析一下上面這個過程:
從 Docker Hub 上 Pull 下 Python 2.7 的基礎鏡像。
顯示維護者的信息。
Copy 當前目錄到容器中的 /App 目錄下 複製本地主機的 <src> ( Dockerfile 所在目錄的相對路徑)到容器裏 <dest>。
指定工做路徑爲 /App。
安裝依賴包。
暴露 5000 端口。
啓動 App。
FROM 是用於指定基礎的 images ,通常格式爲 FROM <image> or FORM <image>:<tag>。
MAINTAINER 是用於指定鏡像建立者和聯繫方式,通常格式爲 MAINTAINER <name>。
COPY 是用於複製本地主機的 <src> (爲 Dockerfile 所在目錄的相對路徑)到容器中的 <dest>。
WORKDIR 用於配合 RUN,CMD,ENTRYPOINT 命令設置當前工做路徑。
RUN 用於容器內部執行命令。每一個 RUN 命令至關於在原有的鏡像基礎上添加了一個改動層,原有的鏡像不會有變化。通常格式爲 RUN <command> 。
EXPOSE 命令用來指定對外開放的端口。通常格式爲 EXPOSE <port> [<port>...]。
ENTRYPOINT 可讓你的容器表現得像一個可執行程序同樣。一個 Dockerfile 中只能有一個 ENTRYPOINT,若是有多個,則最後一個生效。
ENTRYPOINT 命令也有兩種格式:
ENTRYPOINT ["executable", "param1", "param2"] :推薦使用的 Exec 形式。
ENTRYPOINT command param1 param2 :Shell 形式。
這裏咱們將 Python 鏡像變成可執行的程序:ENTRYPOINT ["python"]
CMD 命令用於啓動容器時默認執行的命令,CMD 命令能夠包含可執行文件,也能夠不包含可執行文件。
不包含可執行文件的狀況下就要用 ENTRYPOINT 指定一個,而後 CMD 命令的參數就會做爲 ENTRYPOINT 的參數。
CMD 命令有三種格式:
CMD ["executable","param1","param2"]:推薦使用的 exec 形式。
CMD ["param1","param2"]:無可執行程序形式。
CMD command param1 param2:Shell 形式。
一個 Dockerfile 中只能有一個 CMD,若是有多個,則最後一個生效。而 CMD 的 Shell 形式默認調用 /bin/sh -c 執行命令。
CMD 命令會被 Docker 命令行傳入的參數覆蓋:docker run busybox /bin/echo Hello Docker 會把 CMD 裏的命令覆蓋。
這裏咱們啓動 /app :CMD ["app.py"]
在 Dockerfile 文件所在目錄執行:docker build -t store_name/image_name:v1 .
-t 是爲新鏡像設置倉庫和名稱
store_name爲倉庫名
image_name爲鏡像名
:v1 爲標籤(不添加爲默認 latest )