# Learning Docker, Part1 ###### tags: `Docker` ## 基礎 ### Docker介紹 Docker為一個開源平台,使用容器化的技術來將應用程式及其相關的Dependencies打包到一個容器中,讓這個應用程式可以在任何一個有安裝Docker的系統上運行一致。這解決了在團隊協作上常常遇到部署環境不同而隨之產生的各種問題,最常聽到的就是"這在我電腦上運作是正常的"。 容器化相對於虛擬化來說更為輕量,不同於傳統的虛擬機器需要運作一個完整的作業系統,Docker容器共享電腦主機的作業系統核心,使得他們更為高效,並且啟動速度更快。 Docke提供了指令來創建、運行、停止和管理容器。基本的指令包含'docker run'來啟動容器、'docker ps'來列出運行中的容器以及'docker pull'來下載映像檔。 ### CGroup與Namespace cgroup (控制群組) 與 namespace 是 Linux 系統提供的兩種主要工具,被廣泛用於實現容器化技術,如 Docker、Kubernetes 等。分別對系統資源和進程進行細粒度的控制和隔離。 1. **cgroup**: cgroup (control groups),或稱為控制群組,是 Linux 的一種核心功能,可以對一組進程進行資源分配與限制。這些資源包括 CPU 時間、系統記憶體、網路頻寬,或者是磁碟 I/O 速度等。 例如,可以使用 cgroup 將一組進程限制在 2GB 的 RAM 以內,或者限制其使用 CPU 的比例。此外,cgroup 還可以用來將進程分組,並跟蹤或限制每個分組的資源使用狀況。這種特性使得 cgroup 成為實現容器化技術的重要基礎。 2. **namespace**: namespace 是 Linux 的另一項核心功能,可以用來隔離和分離系統資源。每個 namespace 內部的進程都認為自己獨佔了這些系統資源。Linux 系統提供了多種類型的 namespace,包括但不限於 PID(處理程序 ID)、網路 (Network)、使用者 (User)、掛載點 (Mount)、IPC (Inter-Process Communication) 等。 例如,使用 PID namespace,系統可以使容器內的進程看到的 PID 與宿主機系統的 PID 完全分離。使用 Network namespace,則可以讓容器有自己獨立的網路環境,包括 IP 位址、路由規則等。這種隔離能力是實現容器化技術的另一個重要基石。 綜合來看,cgroup 和 namespace 都是實現容器化技術的基礎工具,它們分別為資源的分配與限制、以及進程的隔離提供了支援,使得容器能夠在相同的操作系統核心下,獨立且安全地運行。 **容器(Container)介紹** ![](https://hackmd.io/_uploads/SkzvzU7rh.png) 下載Docker時即同時下載了Linux Virtual Machine ![](https://hackmd.io/_uploads/Hka4UU7Sn.png) ## Docker CLI 1. **docker run image_name** ![](https://hackmd.io/_uploads/HkCgOLQrh.png) ![](https://hackmd.io/_uploads/HJfymv7Hn.png) Docker create image_name 會得到一串container_ID Docker start container_ID 則會啟動這個container 2. **docker ps** ![](https://hackmd.io/_uploads/SkUKZvQrn.png) 3. **docker system prune** 清除系統中未使用的Docker資源,這些資源可能包括: a. 停止運行的容器 b. 未使用的網路 c. 未被任何容器引用的映像檔 d. 未被任何映像檔或容器引用的建構快取 輸入後會有確認是否執行的提示,可加上-f來跳過 4. **docker logs container_id** ![](https://hackmd.io/_uploads/Hy7ziPXr3.png) 可查看和了解容器的log訊息,可使用docker ps來查看容器的id。 5. **docker stop/kill** ![](https://hackmd.io/_uploads/Sk_q1O7r2.png) a. 'docker stop'是嘗試優雅的方式停止容器。首先,他會發送SIGTERM信號到容器的主進程,讓他有機會進行清理和關閉程序,如果在一段時間(預設為10秒)後,容器仍未停止,則會發送SIGKILL的信號來強制結束容器。可以使用-t來改變等待時間。 b. 'docker kill'則是立即發送SIGKILL信號來結束容器,不會等待容器自己關閉,這種方式可能會導致容器中的進程沒有機會進行任何清理操作,但是當容器無法正常停止時,便是必要的。 一般來說建議使用'docker stop'來停止容器,因為他給予容器更多的機會進行清理和關閉操作。 6. **docker exec -it container_id command** ![](https://hackmd.io/_uploads/rJEfKuXH3.png) 此指令允許在運行中的Docker容器執行指定的命令。 -it為兩個參數的組合,'-i'('--interactive')讓Docker保持標準輸入開啟,'-t'(''--tty')則為容器分配一個虛擬終端,能夠與容器互動。這個指令好用的地方在於可以在不停止容器的情況下,檢查容器的狀態、修改配置文件或者了解容器內部的情況。 docker exec -it my_container bash 可以開啟一個新的bash shell連接到my_container,可以在其中運行想要的指令。