[TOC]
# 選擇Docker
## Docker性能損耗的這幾個方面 :
### 1,CPU與內存隔離
Docker使用<span style='color:red;background:#ff0;'>`cgroup`</span>來限制容器的CPU和內存資源。這意味著Docker會在用戶空間和內核空間之間插入一層額外的開銷,來監控和隔離容器的資源使用。
### 2,鏡像層加密
Docker image由多個layer組成,這些<span style='color:red;background:#ff0;'>`layer互相獨立,無法直接訪問下層layer的數據。這必然會帶來額外的I/O開銷。`</span>
對于overlay文件系統(`Docker默認的存儲驅動`),會將所有layer都載入內存,通過union mount的方式暴露給容器。這也增加了內存消耗。
### 3,網絡
Docker使用iptables和自己的`veth`設備來實現容器網絡隔離。與直接使用宿主機`NIC`相比,這增加了軟件交換層,開銷較大。
尤其在處理大量小數據集錐的場景下,性能下降最多。
### 4,I/O
容器訪問宿主機設備,不可避免多了一層映射,會帶來額外的`latencies`。
特別是對I/O密集型應用來說,這會造成明顯的性能損耗。
> 因此性能敏感的應用,仍需要直接部署到宿主機上,而不是通過Docker容器運行。
> <span style='color:red;background:#ff0;'>Docker的這些虛擬化技術,帶來了隔離性與可移植性的好處,但同時也有性能損耗。</span>
# Docker 常用命令
### Dockerfile
#### 邏輯判斷
判斷容器用戶名是否存在; 不存在就創建用戶,并為用戶以及用戶組設定 apache2目錄權限
```
ARG groupname\="staff"
ARG username\="jerryxu"
RUN getent passwd $username && \\
echo "it is exists!" || \\
useradd \-r \-g $groupname $username ; chown jerryxu:staff /etc/apache2 \-R ;
```
### 管理鏡像
* `docker images`:列出所有本地鏡像
* `docker pull [image]`:從鏡像倉庫下拉一個鏡像
* `docker rmi [image]`:刪除一個本地鏡像
* `docker build -t [image]:[tag] .`:從 Dockerfile 創建鏡像
* `docker tag [image] [username/image]`:給鏡像打標簽
### 管理容器
* `docker ps`:列出所有運行中的容器
* `docker ps -a`:列出所有容器,包括未運行的
* `docker run [image]`:創建一個新的容器并運行
* `docker start/stop [container]`: 啟動/停止一個容器
* `docker exec -it [container] bash`:進入一個運行中的容器的bash shell
* `docker rm [container]`:刪除一個容器
### 其他命令
* `docker version`:顯示docker的版本信息
* `docker system prune`:刪除所有停止的容器、網絡、圖像和磁盤卷
* `docker logs [container]`:獲取容器的日志
* `docker network ls`:列出所有網絡
* `docker inspect [container]`:獲取容器的配置細節
* `docker stats`:顯示實時運行容器的資源使用情況 <a style="color:#f00"> ##### </a>
* `docker system df`:展示容器使用的磁盤空間
* `docker system info`:獲取docker系統信息
* `docker history [container]`:獲取鏡像創建歷史
# Dockerfile 指令優先級
1. ONBUILD - 最低優先級,只在父鏡像使用`ONBUILD`時才觸發
2. COPY 、 ADD - 將文件復制到鏡像內
3. RUN - 執行命令創建新的鏡像層
4. WORKDIR - 設置工作目錄
5. ENV - 設置環境變量
6. ARG - 定義構建參數
7. VOLUME - 將目錄掛載為數據卷
8. EXPOSE - 開放端口信息
9. USER - 指定運行容器時的用戶名或 UID
10. ENTRYPOINT - 指定容器默認執行命令,高于CMD
11. CMD - 與ENTRYPOINT類似,但可以被后續 Docker run 參數覆蓋
12. FROM - 指定基礎鏡像
## CMD 和 `ENTRYPOINT`
| 是否指定ENTRYPOINT | CMD指定 | 執行結果 |
| --- | --- | --- |
| 存在 | 為空字符串 | 執行ENTRYPOINT指定的命令 |
| 存在 | 為具體命令 | 執行ENTRYPOINT指定的命令 |
| 存在 | | 執行ENTRYPOINT指定的命令 |
| 不存在 | 為空字符串 | 容器退出 |
| 不存在 | 為具體命令 | 執行CMD指定的命令 |
根據表格可以總結:
* 如果存在ENTRYPOINT,則執行ENTRYPOINT指定的命令
* 無論CMD是否指定,ENTRYPOINT都會生效
* ENTRYPOINT的優先級高于CMD
* 如果只有CMD但沒有ENTRYPOINT,則執行CMD指定的命令
* 如果CMD為空字符串,而ENTRYPOINT又不存在,容器直接退出
# Docker compose 服務配置的指令 優先級
1. `command`:指定容器啟動時運行的命令。在命名沖突時,優先級最高。
2. `entrypoint`: 指定容器默認的入口點(entry point),可以覆蓋容器原來的`ENTRYPOINT`指令。
3. `build.context`: 使用構建上下文構建鏡像,生效`Dockerfile`中的指令。
4. `image`:指定用已有鏡像來啟動容器。
## ENTRYPOINT 使用場景
| 場景 | 示例 | 作用 |
| --- | --- | --- |
| 作為系統服務運行 | ENTRYPOINT ["/usr/sbin/sshd", "-D"]`| 保證容器每次以同樣方式起服務 |
| 作為命令行工具 | ENTRYPOINT ["my-cli"] | 形成一個可執行文件,運行時指定參數 |
| 作為部署工具 | ENTRYPOINT ["deploy"] | 封裝整個部署過程在容器內 |
| 作為once-off任務 | ENTRYPOINT ["make","build"] | 形成一個完整的可執行文件,自動完成任務 |
- 系統設計
- 需求分析
- 概要設計
- 詳細設計
- 邏輯模型設計
- 物理模型設計
- 產品設計
- 數據驅動產品設計
- 首頁
- 邏輯理解
- 微服務架構的關系數據庫優化
- Java基礎架構
- 編程范式
- 面向對象編程【模擬現實】
- 泛型編程【參數化】
- 函數式編程
- 響應式編程【異步流】
- 并發編程【多線程】
- 面向切面編程【代碼復用解耦】
- 聲明式編程【注解和配置】
- 函數響應式編程
- 語法基礎
- 包、接口、類、對象和切面案例代碼
- Springboot按以下步驟面向切面設計程序
- 關鍵詞
- 內部類、匿名類
- 數組、字符串、I/O
- 常用API
- 并發包
- XML
- Maven 包管理
- Pom.xml
- 技術框架
- SpringBoot
- 項目文件目錄
- Vue
- Vue項目文件目錄
- 遠程組件
- 敏捷開發前端應用
- Pinia Store
- Vite
- Composition API
- uniapp
- 本地方法JNI
- 腳本機制
- 編譯器API
- 注釋
- 源碼級注釋
- Javadoc
- 安全
- Swing和圖形化編程
- 國際化
- 精實或精益
- 精實軟件數據庫設計
- 精實的原理與方法
- 項目
- 零售軟件
- 擴展
- 1001_docker 示例
- 1002_Docker 常用命令
- 1003_微服務
- 1004_微服務數據模型范式
- 1005_數據模型
- 1006_springCloud
- AI 流程圖生成
- Wordpress_6
- Woocommerce_7
- WooCommerce常用的API和幫助函數
- WooCommerce的鉤子和過濾器
- REST API
- 數據庫API
- 模板系統
- 數據模型
- 1.Woo主題開發流程
- Filter
- Hook
- 可視編輯區域的函數工具
- 渲染字段函數
- 類庫和框架
- TDD 通過測試來驅動開發
- 編程范式對WordPress開發
- WordPress和WooCommerce的核心代碼類庫組成
- 數據庫修改
- 1.WP主題開發流程與時間規劃
- moho
- Note 1
- 基礎命令