本篇文章給大家?guī)砹岁P于docker核心技術之容器操作,以及Dockerfile詳解等等相關問題,希望對大家有幫助。
一. Docker
1. 簡介
- 基于Linux內核的Cgroup, Namespace, 以及Union FS等技術,對進程進行封裝隔離,屬于操作系統(tǒng)層面的虛擬技術,由于隔離的進程獨立于宿主和其它的隔離進程,因此稱為容器
- 最初實現(xiàn)是基于LXC, 從0.7以后開始去除LXC, 轉而使用自行開發(fā)的Libcontainer, 從1.11開始, 則進一步演進為使用runC和Containerd
- Docker在容器的基礎上,進行了進一步的封裝,從文件系統(tǒng)、網絡互聯(lián)到進程隔離等等,極大的簡化了容器的創(chuàng)建和維護,使得Docker技術比虛擬機技術更為輕便、快捷
2. Docker優(yōu)勢
- 更高效地利用系統(tǒng)資源
- 更快速的啟動時間
- 一致的運行環(huán)境
- 持續(xù)交付和部署
- 更輕松的遷移
- 更輕松地維護和擴展
3. Docker與虛擬機對比
二. Docker安裝
參考文章安裝: Install Docker Engine on Ubuntu | Docker Documentation
三. 容器操作
-
啟動:
docker run:
-it 交互
-d 后臺運行
-p 端口映射
-v 磁盤掛載
-
啟動已終止容器
docker start
-
停止容器
docker stop
-
查看容器進程
docker ps
-
查看容器細節(jié)
docker inspect
-
拷貝文件到容器內
docker cp file1 <containerid>:/file_to_path
-
docker退出容器,而不關閉容器: ctrl+q+p
-
docker退出容器,而關閉容器: exit
-
查詢docker所有鏡像
docker images
-
Docker鏡像倉庫
Docker hub: https://hub.docker.com
創(chuàng)建私有鏡像倉庫: docker run -d -p 5000:5000 registry
四. Dockerfile詳解
Dockerfile一般分為四個部分:基礎鏡像信息、維護信息、鏡像操作指令和容器啟動時操作指令
-
常用命令
FROM:指定基礎鏡像, 必須為第一個指令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM ubuntu
MAINTAINER: 維護信息
格式:
MAINTAINER <name>
示例
MAINTAINER ribbon
RUN:構建鏡像時執(zhí)行的命令
格式:
shell執(zhí)行:RUN <command>
exec執(zhí)行:RUN ["executable", "param1", "param2"]
示例:
RUN apk update
RUN ["/etc/execfile", "arg1", "arg2"]
RUN apt-get update && apt-get install這兩條命令永遠用&&連接,否則apt-get update構建層被緩存,會導致新package無法安裝
ADD: 將本地文件添加到容器中,tar等類型會自動解壓,可以訪問網絡資源,類似于wget
格式:
ADD <src> … <dest>
示例:
ADD bin/amd64/httpserver /httpserver
COPY: 功能類似于ADD,但是不會解壓縮文件,不能訪問網絡資源
在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多階段構建) – sparkdev – 博客園
格式:
COPY<src> … <dest>
示例:
COPYbin/amd64/httpserver /httpserver
CMD: 構建容器后調用,也就是在容器啟動時才進行調用
格式:
CMD ["executable","param1","param2"] (執(zhí)行可執(zhí)行文件,優(yōu)先)
CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數(shù))
CMD command param1 param2 (執(zhí)行shell內部命令)
示例:
CMD ["ethtool", "–help"]
CMD echo "1111"
ENTRTPOINT: 配置容器,使其可執(zhí)行化。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執(zhí)行文件, 優(yōu)先)
ENTRYPOINT command param1 param2 (shell內部命令)
范例:
ENTRYPOINT /httpserver
CMD [-c]
LABAL: 用于為鏡像添加源數(shù)據(jù)
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> …
范例:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
ENV: 設置環(huán)境變量
格式:
ENV <key> <value>
范例:
ENV MY_SERVICE_PORT=80 UDP_PORT=90
EXPOSE: 指定外界交互的端口
格式:
EXPOSE <port> [<port>…]
示例:
EXPOSE 80
EXPOSE 80/tcp
EXPOSE 80 90
VOLUME: 用于指定持久化目錄
格式:
VOLUME [<path>]
范例:
VOLUME ["/data", "/usr1/jenkins"]
USER:指定運行容器時的用戶名或 UID,后續(xù)的 RUN 也會使用指定用戶。
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
ARG: 用于指定傳遞給構建運行時的變量
格式:
ARG <name>[=<default value>]
示例:
ARG build_user=ribbon
五. Linux NameSpace詳解
-
NamesSpace詳解:
Linux NameSpace_Frank_Abagnale的博客-CSDN博客 這篇文章比較詳細的介紹,可以參考這篇
-
NameSpace的常用操作
- 查看當前系統(tǒng)的namespace:
lsns -t <type>
- 查看某進程的namespace:
ls -la /proc/<pid>/ns/
- 查看某namespace運行命令
nsenter -t <pid> -n
六. Linux Cgroups詳解
-
Cgroups詳解
容器核心:cgroups – 簡書 可以參考這篇文章來進行了解
-
模擬Cgroups控制CPU資源
通過模擬來更好的熟悉Cgroups控制資源的效果, 首先創(chuàng)建cpudemo文件夾
執(zhí)行top可以看到busyloop占用兩個CPU資源
將進程添加進cgroup進程配置組
設置cpuquota
可以看到成功將占用200%CPU資源的降低成1%
-
模擬Cgroups超過限定memory資源被OOM kill
/sys/fs/cgroup/memory目錄下創(chuàng)建memorydemo文件夾
運行消耗內存程序, 使用watch查詢內存使用情況
將進程配置進cgroups配置組
設置最大內存大小
等待程序被OOM kill, dmesg可以看到殺死信息
備注:刪除自主創(chuàng)建的cgroup文件夾, 需要使用cgroup-tools
七. Union FS
Docker前面使用的技術都是源于linux的技術并沒有創(chuàng)新,而Docker的創(chuàng)新正是文件系統(tǒng)。
1. 概念:
- 將不同目錄掛載在同一個虛擬文件系統(tǒng)下的文件系統(tǒng)
- 支持為每一個成員目錄設定readonly、readwrite和without-able權限
- 文件系統(tǒng)分層,對readonly權限的目錄可以進行邏輯上的修改,這里的修改屬于增量的,不影響readonly部分
- 通常Union FS的用途: 多個disk掛載到同一個目錄下, 另一個是將readonly部分和writeable的目錄聯(lián)合在一起
2. 圖解Union FS
Docker鏡像的設計中,引入了層(layer)的概念,也就是說,用戶制作鏡像的每一步操作,都會生成一個層,也就是一個增量rootfs(一個目錄),這樣應用A和應用B所在的容器共同引用相同的ubuntu操作系統(tǒng)層、Golang環(huán)境層(作為只讀層),而各自有各自應用程序層,和可寫層。啟動容器的時候通過UnionFS把相關的層掛載到一個目錄,作為容器的根文件系統(tǒng)。
3. 容器存儲驅動
4. 模擬Union FS更好理解效果

由于docker當前版本上使用的是overlayFS的存儲驅動,所以我們就以overlay掛載方式來進行實驗, overlayfs通過三個目錄:lower目錄、upper目錄、以及work目錄實現(xiàn),其中l(wèi)ower目錄可以是多個,work目錄為工作基礎目錄,掛載后內容會被清空,且在使用過程中其內容用戶不可見,最后聯(lián)合掛載完成給用戶呈現(xiàn)的統(tǒng)一視圖稱為為merged目錄。
執(zhí)行如下命令:
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存儲驅動文件掛載實現(xiàn)的效果。實驗完成后恢復環(huán)境需要先umount merged目錄后, 再將四個目錄進行刪除操作,先刪除其他的可能會出現(xiàn)rm: cannot remove 'merged/': Device or resource busy,導致merged目錄刪除不掉。
八. Docker網絡
1. 安裝工具
Centos系統(tǒng):
$ yum install bridge-utils
Ubuntu系統(tǒng):
$ apt-get install bridge-utils
2. Docker網絡模式
-
查詢docker內置的網絡模式
-
docker run選擇運行的網絡模式
1)host模式:使用 –net=host 指定。 跟host公用一套net
2)none模式:使用 –net=none 指定。網絡配置需要由自己來進行配置
3)bridge模式:使用 –net=bridge 指定,默認設置。
docker網絡邏輯圖 網橋和NAT
4)container模式:使用 –net=container:NAME_or_ID 指定。使用其他容器的網絡配置
網絡模式圖大概如下圖所示
3. 模擬Docker起網橋的操作
-
創(chuàng)建–net=none nginx
-
創(chuàng)建network namespace
-
建立網絡namespace鏈接
-
檢查當前已經創(chuàng)建的網橋設備
-
創(chuàng)建veth對
-
進行A網絡配置
-
進行B網絡配置
生成eth0網絡設備在nginx docker中
給eth0配置ip 網關
-
nginx可以訪問
-
配置nat, 讓windows通過ip也可以訪問
-
使用完刪除指定nat規(guī)則
推薦學習:《docker視頻教程》