###### tags: `教學` `Docker` `學習筆記`
# Docker and Container 002 - Engine, Daemon, Registry
[](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的範圍
- 包含:三種方式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

* 除了管理所有與容器相關的内容,維持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。

- 輸入終端機的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
```


- 
- 使用指令:`$ 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)