1. 程式人生 > 其它 >docker學習之路

docker學習之路

docker學習之路-1

docker概述

  • Docker 是一個用於開發、傳送和執行應用程式的開放平臺。Docker 能夠將應用程式與基礎設施分開,可以快速交付軟體。使用Docker,可以像管理應用程式一樣管理基礎設施。通過利用 Docker 的快速交付、測試和部署程式碼的方法,可以顯著減少編寫程式碼和在生產中執行程式碼之間的延遲。

  • Docker 提供了在稱為容器的鬆散隔離環境中打包和執行應用程式的能力。隔離和安全性允許在給定主機上同時執行多個容器。容器是輕量級的,包含執行應用程式所需的一切,因此無需依賴主機上當前安裝的內容。可以在工作時輕鬆共享容器,並確保與共享的每個人都獲得以相同方式工作的相同容器。

docker的架構

  • Docker 使用客戶端-伺服器架構。Docker客戶端與 Docker守護程序對話,後者負責構建、執行和分發 Docker 容器的繁重工作。Docker 客戶端和守護程式可以 在同一系統上執行,或者您可以將 Docker 客戶端連線到遠端 Docker 守護程式。Docker 客戶端和守護程序使用 REST API、UNIX 套接字或網路介面進行通訊。

docker daemon

  • Docker 守護程序 ( dockerd) 偵聽 Docker API 請求並管理 Docker 物件,例如影象、容器、網路和卷。守護程序還可以與其他守護程序通訊以管理 Docker 服務。

docker client

  • Docker 客戶端 ( docker) 是許多 Docker 使用者與 Docker 互動的主要方式。當使用諸如 docker run 之類的命令時,客戶端會將這些命令傳送到dockerd,從而執行它們。該docker命令使用 Docker API。Docker 客戶端可以與多個守護程序通訊。

docker registries

  • Docker倉庫儲存 Docker 映象。Docker Hub 是一個任何人都可以使用的公共註冊中心,Docker 預設配置為在 Docker Hub 上查詢映象。您甚至可以執行自己的倉庫

  • 當您使用docker pull或docker run命令時,所需的映像將從您配置的倉庫中提取。當您使用該docker push命令時,您的映像會被推送到您配置的倉庫中。

docker objects

  • 當使用 Docker 時,是在建立和使用映象、容器、網路、卷、外掛和其他物件。

images

  • 一個image是用於建立一個docke container(容器)的只讀模板。通常,一個image基於另一個image,並帶有一些額外的自定義。

  • 您可以建立自己的image,也可以僅使用其他人建立並在registries中釋出的image。要構建您自己的image,需要使用簡單的語法建立一個Dockerfile,用於定義建立映象和執行映象所需的步驟。Dockerfile 中的每條指令都會在映象中建立一個層。當您更改 Dockerfile 並重建映像時,只會重建那些已更改的層。與其他虛擬化技術相比,這是使映像如此輕巧、小巧和快速的部分原因

containers

  • 容器container是映象image的可執行例項。您可以使用 Docker API 或 CLI 建立、啟動、停止、移動或刪除容器。您可以將容器連線到一個或多個網路,為其附加儲存,甚至可以根據其當前狀態建立新映象。

  • 預設情況下,容器與其他容器及其主機相對隔離。您可以控制容器的網路、儲存或其他底層子系統與其他容器或主機之間的隔離程度。

  • 容器由其映象以及在建立或啟動它時提供給它的任何配置選項定義。當容器被移除時,未儲存在持久儲存中的對其狀態的任何更改都會消失。

docker的基本使用

執行容器

docker run -d -p 80:80 docker/getting-started

-d 以分離模式執行容器(在後臺)
-p 80:80 - 將主機的 80 埠對映到容器中的 80 埠
docker/getting-started - 要使用的映象

構建映象

建立Dockerfile檔案構建映象

 # syntax=docker/dockerfile:1
 FROM node:12-alpine
 RUN apk add --no-cache python g++ make
 WORKDIR /app
 COPY . .
 RUN yarn install --production
 CMD ["node", "src/index.js"]
 docker build -t getting-started .

-t 標誌 命名映象
. 表示dockerfile 在當前目錄

操作容器

 docker ps  獲取容器ID
 docker stop <id> 停止容器
 docker rm <id> 刪除容器

分享映象

首先需要在 Docker Hub 上建立一個儲存庫

docker login -u YOUR-USER-NAME                                                登入到 Docker Hub
docker tag getting-started YOUR-USER-NAME/getting-started       使用該docker tag命令為getting-started影象指定一個新名稱
docker push YOUR-USER-NAME/getting-started                            推送命令

容器資料持久化

  • 卷 volume

建立卷

 docker volume create todo-db

掛載卷

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

檢視卷

docker volume inspect todo-db
  • 繫結掛載

啟動開發模式容器

 docker run -dp 3000:3000 \
     -w /app -v "$(pwd):/app" \
     node:12-alpine \
     sh -c "yarn install && yarn run dev"

-dp 3000:3000- 和之前一樣。在分離(後臺)模式下執行並建立埠對映
-w /app - 設定“工作目錄”或命令將執行的當前目錄
-v "$(pwd):/app"- 將容器中宿主機的當前目錄繫結掛載到/app目錄中
node:12-alpine- 要使用的影象。請注意,這是來自 Dockerfile 的應用程式的基本映像
sh -c "yarn install && yarn run dev"- 命令。我們正在使用sh(alpine 沒有bash)啟動一個 shell並執行yarn install以安裝所有依賴項,然後執行yarn run dev. 如果我們檢視package.json,我們將看到dev指令碼正在啟動nodemon

容器網路

建立網路

docker network create todo-app

啟動容器連線網路

 docker run -d \
 --network todo-app --network-alias mysql \
 -v todo-mysql-data:/var/lib/mysql \
 -e MYSQL_ROOT_PASSWORD=secret \
 -e MYSQL_DATABASE=todos \
 mysql:5.7
-network 連線網路
--network-alias 在網路中容器的別名