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 在網路中容器的別名