[toc] # Linux運維工程師面試題(8) > 祝各位小伙伴們早日找到自己心儀的工作。 > 持續學習才不會被淘汰。 > 地球不爆炸,我們不放假。 > 機會總是留給有有準備的人的。 > 加油,打工人! ## 1 docker 的網路類型,使用場景 - none:在使用none模式後,Docker ...
目錄
Linux運維工程師面試題(8)
祝各位小伙伴們早日找到自己心儀的工作。
持續學習才不會被淘汰。
地球不爆炸,我們不放假。
機會總是留給有有準備的人的。
加油,打工人!
1 docker 的網路類型,使用場景
- none:在使用none模式後,Docker容器不會進行任何網路配置,沒有網卡、沒有IP也沒有路由,因此預設無法與外界通信,需要手動添加網卡配置IP等,所以極少使用。
- bridge:預設模式。可以和外部網路之間進行通信,通過SNAT訪問外網,使用DNAT可以讓容器被外部主機訪問,所以此模式也稱為NAT模式。
- host:此模式由於直接使用宿主機的網路無需轉換,網路性能最高,但是各容器內使用的埠不能相同,適用於運行容器埠比較固定的業務。
- container:使用此模式創建的容器需指定和一個已經存在的容器共用一個網路,而不是和宿主機共用網,新創建的容器不會創建自己的網卡也不會配置自己的IP,而是和一個被指定的已經存在的容器共用IP和埠範圍,因此這個容器的埠不能和被指定容器的埠衝突,除了網路之外的文件系統、進程信息等仍然保持相互隔離,兩個容器的進程可以通過lo網卡進行通信。
2 CMD 和 ENTRYPOINT 的區別
No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”, “p1_entry”] | |
---|---|---|---|
No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry |
CMD [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry exec_cmd p1_cmd |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry | exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
3 怎麼減小 dokcer 鏡像的大小
- 儘量選取滿足需求但較小的基礎系統鏡像;
- 清理編譯生成的文件、安裝包的緩存等臨時文件;
- 安裝各個軟體時候要指定准確的版本號、並避免引入不需要的依賴;
- 減少鏡像層數,合併相同的命令,比如RUN命令;
- 使用 Dockerfile 創建鏡像時候要添加 dockerignore 文件或使用乾凈的工具目錄;
4 現有一個正在運行的容器,容器中沒有 ps、top、netstat、ss、ip、lsof等命令,怎麼查看容器內進程及pid和打開的埠
可以使用 docker ps 命令查看容器內進程的和port。也可以使用 docker top 命令查看容器內的相關進程,包括它們的PID和其它信息。可以使用docker port命令查看容器暴露的埠。
也可以進入容器。在/proc目錄下查看進程pid和其他信息。
下麵是/proc/pid目錄中可能包含的文件和目錄的一些例子:
- cmdline:該文件包含了進程啟動時的完整命令行參數。
- cwd:該文件包含了進程當前的工作目錄。
- environ:該文件包含了進程環境變數列表。
- exe:該文件是進程的可執行文件的符號鏈接,可以通過它來找到進程的可執行文件。
- fd:該目錄包含了進程打開的文件列表,每個文件都以符號鏈接的形式出現在該目錄下。
5 如何臨時退出⼀個正在交互的容器的終端,而不終止它?
同時按三個鍵,ctrl+p+q。如果按Ctrl+c 會使容器內的應用進程終止、進而會使容器終止。
6 如果只有鏡像或者在運行的容器,沒有 dockerfile,現在有需求需要藉助這個鏡像或容器重寫 dockerfile,怎麼查看這個鏡像或容器之前的構建過程。
使用docker history或者docker image history命令進行查看。也可以使用docker inspect命令查看相關信息。
7 COPY 和 ADD 的區別
- COPY 命令會將文件的所有元數據(如所有者、許可權等)都複製到容器中,而ADD則不會。這意味著在使用ADD時,您可能需要手動設置文件的元數據。
- ADD 命令支持在拷貝文件時自動解壓縮tar文件,而 COPY 不支持。
- ADD 命令支持將 URL 作為源文件,並自動下載並將其複製到容器中。
8 製作鏡像方式
- docker commit # 通過修改現有容器,將之手動構建為鏡像
- docker build # 通過Dockerfile文件,批量構建為鏡像
9 K8S 有那些組件,都是乾什麼用的
master:
- kube-apiserver:API 伺服器為 REST 操作提供服務,公開 Kubernetes API,負責處理接受請求的工作。 併為集群的共用狀態提供前端, 所有其他組件都通過該前端進行交互。
- kube-controller-manager:負責運行控制器進程,負責集群內的Node 、Pod 副本、服務端點( Endpoint )、命名空間(Namespace )、服務賬號( ServiceAccount )、資源定額( ResourceQuota )的管理,當某個 Node 意外宕機時, Controller Manager 會及時發現並執行自動化修複流程,確保集群始終處於預期的工作狀態。
- kube-scheduler: 負責監視新創建的、未指定運行節點(node)的 Pods, 並選擇節點來讓 Pod 在上面運行。
- etcd:一致且高可用的鍵值存儲,用作 Kubernetes 所有集群數據的後臺資料庫。
node:
- kubelet:它保證容器(containers)都運行在 Pod 中。向 master 彙報 node 節點的狀態信息;接受指令併在 Pod 中創建 docker 容器;準備 Pod 所需的數據捲;返回 pod 的運行狀態;在 node 節點執行容器健康檢查
- kube-proxy:集群中每個節點(node)上所運行的網路代理, 實現 Kubernetes 服務(Service) 概念的一部分。
- 容器運行時(Container Runtime):容器運行環境是負責運行容器的軟體。
10 K8S 創建一個pod的流程
- 準備好對應的yaml文件,通過kubectl發送到Api Server中;
- Api Server接收到客戶端的請求將請求內容保存到etcd中;
- Scheduler會監測etcd,發現沒有分配節點的pod對象通過過濾和打分篩選出最適合的節點運行pod;
- 節點會通過conteiner runntime 運行對應pod的容器以及創建對應的副本數;
- 節點上的kubelet會對自己節點上的容器進行管理;
- controler會監測集群中的每個節點,發現期望狀態和實際狀態不符合的話,就會通知對應的節點;
- 節點收到通知,會通過container runtime來對pod內的容器進行收縮或者擴張。
關於我
全網可搜《阿賢Linux》
CSDN、知乎、嗶哩嗶哩、博客園、51CTO、掘金、思否、開源中國、阿裡雲、騰訊雲、華為雲、今日頭條、百家號、GitHub、個人博客
公眾號:阿賢Linux
個人博客:blog.waluna.top
https://blog.waluna.top/
原文鏈接: Linux運維工程師面試題(8).