###### tags: `教學` `Docker` `學習筆記` # Docker and Container 002 - Engine, Daemon, Registry [![hackmd-github-sync-badge](https://hackmd.io/mBnkHxpeTfKilpuj-h0Nrw/badge)](https://hackmd.io/mBnkHxpeTfKilpuj-h0Nrw) [TOC] --- ## 1. Docker Engine ### 什麼是Docker Engine >- Docker Engine 是Docker的核心程式,是一個**容器的執行環境**。它可以在單一作業系統的主機下執行與管理容器。不同主機必須分別控制。 * 一般情況下,Docker指的是Docker Engine(這些是都是Docker Engine做的) * **Docker Engine**程式是一個標準C/S結構的程式,即由客户端(Client)與伺服器 (Server)組成: * 提供Docker容器支援的服務程式稱為**Docker Daemon** * 將操作Docker的用戶端程式稱為**Docker Daemon** - Docker Engine的範圍![](https://i.imgur.com/X4tJ4kS.png) - 包含:三種方式Docker API, Docker CLI, Plugins, 以及六種程式/功能 Distribution, Orchestration, Volumes, Containerd, Docker Build(BuildKit), Networking - Docker API:連結不同的應用程式 - Docker CLI:命令列介面、指令系統 - Plugins:擴充功能 - Distribution - [Orchestration](https://hackmd.io/@Hualiteq/H1JvdR5Tu): - [Volumes](https://hackmd.io/@Hualiteq/HJ10BA6Yu):資料管理 - [Containerd](https://containerd.io/) - 在Linux 和 Windows的一個背景程式,管理其主機系統的完整容器生命週期,從圖像傳輸和存儲到容器執行和監督,再到低級存儲到網絡附件等等。 - docker 對容器的管理和操作基本都是通過 containerd 完成的 - Docker Build(BuildKit) - [Networking](https://hackmd.io/@Hualiteq/H15Vrl5F_):網路模式 - images, container, registry是物件不是功能 - Docker Daemon與Docker CLI透過Docker API進行交流 - Docker CLI除了可以操作本機的docker daemon外,也可以控制其他機器的docker daemon。 :::info **參考資料** - [The Industry-Leading Container Runtime](https://www.docker.com/products/container-runtime) ::: --- ## 2. Docker Daemon >* Docker Daemon是實現Docker核心功能的程式,管理包括映像、容器、網路、資料卷在内的所有Docker模組。 >* 只有DockerDaemon運行時,才能用利用它所支援的容器技術。因此,Doocker Daemon通常以服務的形式常駐於宿主機。 ### Docker 架構 - docker運作架構圖 - 都會透過docker deamon ![](https://i.imgur.com/FSQqFyj.png) * 除了管理所有與容器相關的内容,維持Docker各項功能的運轉外,Doocker Daemon還對外提供Docker API。因此,Docker CLI能對Doocker Daemon進行操作的原因。 * 預設情況下,Docker Daemon使用的是Linux處理序間通訊的連接埠,並且只允許本地的root帳號存取。 * 如果想讓Docker Daemon監聽指定的網路位址,可以透過dockerd命令,加上-H或-host參數,並列出監聽的網路位址。 * `$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:9876` * 除了設定Docker Daemon監聽的連接埠外,dockerd命令還提供針對Docker Daemon更多的組態, * 例如前文談到的Docker檔案儲存驅動方案、DNS伺服器、預設橋接器、映像倉庫的映像伺服器、日誌檔的存放路徑等。 * 有關這些參數的使用方法,可透過dockerd命令查詢:`$ sudo dockerd --help` * Docker Daemon的組態,可籍dockerd命令實現,或者透過修改Docker的設定檔完成。 * 後者這種配置方式能夠持久保存於檔案中,而且清晰易維護。 - Docker Darmon的位置(Linux)在 `/etc/docker/daemon.json` --- ## 3. Docker CLI > Docker CLI就是在終端命令列使用的Docker程式,能將命令透過DockerAPI,送到Docker Daemon。 ![](https://i.imgur.com/shts3RP.jpg) - 輸入終端機的docker命令會先由Docker CLI依據命令類型,轉換為對應的DockerAPI,之後根據附加在docker命令後的參數,填充Docker API的請求參數,接著Docker CLI將請求與之關聯的DockerDaemon並等待處理結果。 - DockerDaemon收到DockercCLI送出的操作命令後,再根據其內容進行對應的操作,並把處理結果返回DockerCLI。 - Docker CLI收到DockerDaemon回傳的結果後,便解析結果中的資料,然後渲染成命令列顯示資料的合適方式,再輸出到終端機中。 - 查看daemon版本,`$ sudo docker -H tcp://127.0.0.1:9876 version` - Client端與Server端顯示的作業系統可能不同 --- ## 4. Registry ### 1. 基本介紹 * public * docker hub * image:tag * Official Images * Verified Publisher * private * repository * 註冊帳號 ### 2. 相關操作 #### 登入/登出 - `$ docker login/logout` - 登入registry,推送(push)一定要登入 #### 推/拉 - `$ docker pull/push` - 從docker hub拉取:`$ docker pull nginx:latest` - latest是tag/標籤,一般來說可當作版本來理解。 - 沒有指定版本的話,預設都為最新版(latest) #### 搜尋 - $ docker search - 從docker hub 尋找(search):`$ docker search nginx` - 說明找到的結果,官方認證、星星數 - `$ docker search -f=stars=10 apache` - apache,搜尋的標的為apache - -f=stars=10,篩選有十顆星星的 --- ### 3. docker hub操作 #### 3.1. 在hub上建立image - 先建立repo(一個專案),再在裡面建立image(從本地推送上去) #### 3.2. 從hub拉取 - 注意image來源是否為官方還是有被認證 - `$ docker pull alpine:3.13`,將alpine 3.13版拉下來 #### 3.3. 上傳docker image到雲端 ```linux= 0. 登入docker hub $ dokcer login,接著打入hub帳號密碼 1. 查看現有映像檔 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE kihifung/test0802 1.0 b1d9e36f9546 About an hour ago 5.6MB alpine latest 021b3423115f 2 days ago 5.6MB kihifung/test_alpine latest 021b3423115f 2 days ago 5.6MB docker/getting-started latest 083d7564d904 8 weeks ago 28MB 2. 設定要上傳的映像檔(預設tag為latest,這邊不同,所以失敗) $ docker tag kihifung/test0802 kihifung/0802_2 Error response from daemon: No such image: kihifung/test0802:latest 3. 重新設定 $ docker tag kihifung/test0802:1.0 kihifung/t0802_2 4. 推上去(本地沒有kihifung/0802_2,所以失敗) $ docker push kihifung/0802_2:tagname The push refers to repository [docker.io/kihifung/0802_2] An image does not exist locally with the tag: kihifung/0802_2 5. 重推(成功資訊如下) $ docker push kihifung/t0802_2 Using default tag: latest The push refers to repository [docker.io/kihifung/t0802_2] bc276c40b172: Mounted from kihifung/test_alpine latest: digest: sha256:df6d746c2c01b432dea8d50554471baa04ac0cbd44dcbda50fc5e548b469956d size: 528 ``` ![](https://i.imgur.com/PAhCPnh.jpg) ![](https://i.imgur.com/0IBf4K6.jpg) - ![](https://i.imgur.com/9GPMcMG.jpg) - 使用指令:`$ docker push kihifung/course-image-build:tagname`,任何人都可以下載此專案(如果設為公開的話) - tagname為版本號,用來說明這個版本的內容,通常是編號 --- --- ## 回顧 * [ ] 什麼是registry * [ ] 與image和container之間的關係 * [ ] registry的操作 ## 課後複習/測驗 ### Q6:Docker Hub是什麼? > 這是面試官對於初階面試者可能會問的基本問題,目的在於測試面試者對構成Docker平台的Docker主要基本系統元件和服務的認識。 **Docker Hub是一項容器映像檔儲存註冊的雲端服務(Docker Registry)**,允許連接到程式碼儲存庫,用於建置映像檔並測試,或手動Push映像檔來存放,且可連動[Docker Cloud](https://cloud.docker.com/) 來部署映像檔到其中的Host伺服器,它為整個容器開發流程中所需的容器映像檔探索、分派和變更管理,使用者與團隊合作,以及藉由開發流水線的自動化工作流程,提供了集中式資源管理。相關範例如下所示: 1. 從Docker Hub取得Docker映像檔: - `$ docker pull ubuntu:16.04` 2. 將映像檔推送到Docker Hub: - `$ docker push` 3. 搜索在Docker Hub上面的Docker映像檔: - `$ docker search ubuntu` --- ###  Q14:請描述修改Docker Daemon配置的方式有幾種? 總共有兩種方法可修改Docker Daemon配置: 1. 使用JSON配置檔:這是建議方式,因為這可**將所有配置存放在單一目錄位置**。 2. 在啟動dockerd時使用配置參數:只要在JSON配置檔和此方法未有指定到相同的選項,就可以同時使用這兩種配置方式,但若未注意,同時設定時,Docker Daemon將無法啟動並輸出錯誤訊息。 - `$ dockerd --debug --tls=true --tlscert=/var/docker/server.pem --tlskey=/var/docker/serverkey.pem --host tcp://:2376` --- - [回到目錄](https://hackmd.io/@Hualiteq/r1lye3M3d)