最有系統的掌握Docker核心技術(總結分享)
這篇文章為大家帶來了關於docker核心技術之容器操作,以及Dockerfile詳解等等相關問題,希望對大家有幫助。
一. Docker
1. 簡介
- 基於Linux核心的Cgroup, Namespace, 以及Union FS等技術,將進程進行封裝隔離,屬於作業系統層面的虛擬技術,由於隔離的進程獨立於宿主和其它的隔離進程,因此稱為容器
- 最初實作是基於LXC,從0.7以後開始移除LXC,改用自行開發的Libcontainer, 從1.11開始, 則進一步演進為使用runC和Containerd
- Docker在容器的基礎上,進行了進一步的封裝,從檔案系統、網路互連到進程隔離等等,極大的簡化了容器的創建和維護,使得Docker技術比虛擬機技術更為輕巧、快捷
#2. Docker優勢
- 更有效率地利用系統資源
- 更快速的啟動時間
- 一致的運行環境
- 持續交付和部署
- 更輕鬆的遷移
- 更輕鬆地維護與擴充
3. Docker與虛擬機器比較
2. Docker安裝
參考文章安裝: Install Docker Engine on Ubuntu | Docker Documentation
##三.容器操作
-
#docker run:
#啟動已終止容器
停止容器
檢視容器程序
查看容器細節
docker inspect
-
# 拷貝檔案到容器內
#docker cp file1
##docker退出容器,而不關閉容器: ctrl q p
docker退出容器,而關閉容器: exit
- 查詢docker所有映像
#Docker映像倉庫# ########Docker hub: https://hub.docker.com######建立私人映像倉庫: docker run -d -p 5000:5000 registry###### 四. Dockerfile詳解######Dockerfile一般分為四個部分:基礎映像資訊、維護資訊、映像操作指令、容器啟動時操作指令############常用指令##### ##########FROM:指定基礎鏡像,必須為第一個指令#########格式:###### FROM
FROM
範例:
FROM ubuntu
MAINTINT #格式:
MAINTAINERRUN:在建構中執行的指令建構指令時執行的命令
##格式: shell執行:RUN
exec執行:RUN ["executable", "param1", "param2"]
##範例: RUN apk update RUN ["/etc/execfile", "arg1", "arg2"]## d -get install這兩個指令永遠用&&連接,否則apt-get update建置層被緩存,會導致新package無法安裝
ADD: 將本機檔案新增到容器中, tar等類型
會自動解壓縮,可以存取網路資源,類似wget格式:
ADD範例:
ADD bin/amd64/httpserver /httpserverCOPY: 功能類似ADD,但不會解壓縮文件,無法存取網路資源
#在Dockerfile中使用multi-stage: Dockerfile 中的multi-stage(多階段建置) - sparkdev - 部落格花園格式: COPY ... <## COPY ... <## COPY ... <## >d;d ;
範例: COPYbin/amd64/httpserver /httpserver
CMD: 建置容器後調用,也就是在容器啟動時才進行呼叫
#格式: CMD ["executable","param1","param2"] (執行可執行文件,優先)CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增參數) CMD command param1 param2 (執行shell內部指令)
範例: CMD ["Hhelm"--
CMD echo "1111"
#ENTRTPOINT: 設定容器,使其可執行化
。 格式: ENTRYPOINT ["executable", "param1", "param2"] (可執行檔, 優先)shell #範例:##卷##格式:
LABEL
## LABEL multi.label1="value1" multi.label2="value2" other="value3"
##ENV: 設定環境變數
格式: ENV格式: EXPOSE [...]
範例:
POSE
## EXPOSE 80/tcp卷## VOLUME [VOLUME ["/data", "/usr1/jenkins"]
##USER:指定執行#USER:容器時的使用者名稱或UID,後續的RUN 也會使用指定使用者。格式:
USER userUSER user:group
USER uid# USER uid:gid
與問題 US## USER uid:gidER groupUS##ER user:#US>
## 範例:USER www
ARG: 用於指定傳遞給建置執行時間的變數
格式:
ARG < name>[=範例:
ARG build_user=ribbon五. Linux NameSpace詳解
NamesSpace詳解:
Linux NameSpace_Frank_Abagnale的部落格-CSDN部落格 這篇文章比較詳細的介紹,可以參考這篇
NameSpace的常用操作
- 檢視目前系統的namespace:
lsns -t
- #看某個行程的namespace:
ls -la /proc/
- # 查看某namespace執行指令
nsenter -t
#六. Linux Cgroups詳解
Cgroups詳解
##容器核心:cgroups - 簡書 可以參考這篇文章來進行了解
- #模擬Cgroups控制CPU資源
#模擬Cgroups控制CPU資源
# 執行top可以看到busyloop佔用兩個CPU資源
將進程加入cgroup進程組態群組
設定cpuquota
可以看到成功將佔用200% CPU資源的降低成1%
#########模擬Cgroups超過限定memory資源被OOM kill############/ sys/fs/cgroup/memory目錄下建立memorydemo資料夾################ 執行消耗記憶體程序, 使用watch查詢記憶體使用量############ ############# 將進程配置進cgroups設定群組########## 設定最大記憶體大小############## 等待程序被OOM kill, dmesg可以看到殺死訊息############################備註:刪除自主建立的cgroup資料夾, 需要使用cgroup-tools###################七. Union FS############Docker前面所使用的技術都是源自於linux的技術並沒有創新,而Docker的創新正是檔案系統。 #########1. 概念:
- 將不同目錄掛載在同一個虛擬檔案系統下的檔案系統
- 支援為每個成員目錄設定readonly、readwrite和without -able權限
- 檔案系統分層,對readonly權限的目錄可以進行邏輯上的修改,這裡的修改屬於增量的,不影響readonly部分
- 通常Union FS的用途:多個disk掛載到同一個目錄下, 另一個是將readonly部分和writeable的目錄結合在一起
2. 圖解Union FS
Docker映像的設計中,引入了層(layer)的概念,也就是說,使用者製作鏡像的每一步操作,都會產生一個層,也就是一個增量rootfs(一個目錄),這樣應用A和應用B所在的容器共同引用相同的ubuntu作業系統層、Golang環境層(作為唯讀層),而各自有各自應用程式層,和可寫層。啟動容器的時候透過UnionFS把相關的層掛載到一個目錄,當作容器的根檔案系統。
3.容器儲存驅動程式
4. 模擬Union FS更好理解效果
由於docker目前版本上使用的是overlayFS的儲存驅動,所以我們就以overlay掛載方式來進行實驗,overlayfs透過三個目錄:lower目錄、upper目錄、以及work目錄實現,其中lower目錄可以是多個,work目錄為工作基礎目錄,掛載後內容會被清空,且在使用過程中其內容用戶不可見,最後聯合掛載完成給使用者呈現的統一視圖稱為為merged目錄。
執行以下命令:
mkdir upper lower merged work echo "lower" > lower/in_lower.txt echo "from lower" > lower/in_both.txt echo "from upper" > upper/in_both.txt echo "upper" > upper/in_upper.txt path=$(pwd) mount -t overlay overlay -o lowerdir=${path}/lower,upperdir=${path}/upper,workdir=${path}/work ${path}/merged
# 可以看到使用overlay儲存驅動程式檔案掛載實現的效果。實驗完成後恢復環境需要先umount merged目錄後, 再將四個目錄進行刪除操作,先刪除其他的可能會出現rm: cannot remove 'merged/': Device or resource busy,導致merged目錄刪除不掉。
c. Docker網路
1. 安裝工具
Centos系統:
$ yum install bridge-utils
Ubuntu系統:
$ apt-get install bridge-utils
2. Docker網路模式
#docker內建的查詢網路模式
docker run選擇運作的網路模式
4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的網路設定
# 網路模式圖大概如下圖
3. 模擬Docker起網橋的操作
建立--net=none nginx
建立network namespace
建立網頁namespace連結
## 檢查目前已建立的橋接裝置
創建veth對
# 進行A網路配置
進行B網路設定
產生eth0網路裝置在nginx docker中
給eth0設定ip 閘道
nginx可以存取
設定nat, 讓windows透過ip也可以存取
使用完刪除指定nat規則
#推薦學習:《docker影片教學》
以上是最有系統的掌握Docker核心技術(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

退出 Docker 容器的四種方法:容器終端中使用 Ctrl D 快捷鍵容器終端中輸入 exit 命令宿主機終端中使用 docker stop <container_name> 命令宿主機終端中使用 docker kill <container_name> 命令(強制退出)

Docker 中將文件拷貝到外部主機的方法:使用 docker cp 命令:執行 docker cp [選項] <容器路徑> <主機路徑>。使用數據卷:在主機上創建目錄,在創建容器時使用 -v 參數掛載該目錄到容器內,實現文件雙向同步。

Docker 容器啟動步驟:拉取容器鏡像:運行 "docker pull [鏡像名稱]"。創建容器:使用 "docker create [選項] [鏡像名稱] [命令和參數]"。啟動容器:執行 "docker start [容器名稱或 ID]"。檢查容器狀態:通過 "docker ps" 驗證容器是否正在運行。

可以通過以下步驟查詢 Docker 容器名稱:列出所有容器(docker ps)。篩選容器列表(使用 grep 命令)。獲取容器名稱(位於 "NAMES" 列中)。

重啟 Docker 容器的方法:獲取容器 ID(docker ps);停止容器(docker stop <container_id>);啟動容器(docker start <container_id>);驗證重啟成功(docker ps)。其他方法:Docker Compose(docker-compose restart)或 Docker API(參考 Docker 文檔)。

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

在 Docker 中創建容器: 1. 拉取鏡像: docker pull [鏡像名] 2. 創建容器: docker run [選項] [鏡像名] [命令] 3. 啟動容器: docker start [容器名]

查看 Docker 日誌的方法包括:使用 docker logs 命令,例如:docker logs CONTAINER_NAME使用 docker exec 命令運行 /bin/sh 並查看日誌文件,例如:docker exec -it CONTAINER_NAME /bin/sh ; cat /var/log/CONTAINER_NAME.log使用 Docker Compose 的 docker-compose logs 命令,例如:docker-compose -f docker-com
