參考文章安裝: Install Docker Engine on Ubuntu | Docker Documentation
docker run:
-it 互動
-d 後臺執行
-p 埠對映
-v 磁碟掛載
docker start
docker stop
docker ps
docker inspect
docker cp file1 <containerid>:/file_to_path
docker images
Docker hub: https://hub.docker.com
建立私有映象倉庫: docker run -d -p 5000:5000 registry
Dockerfile一般分為四個部分:基礎映象資訊、維護資訊、映象操作指令和容器啟動時操作指令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
範例:
FROM ubuntu
格式:
MAINTAINER <name>
範例
MAINTAINER ribbon
格式:
shell執行:RUN <command>
exec執行:RUN ["executable", "param1", "param2"]
範例:
RUN apk update
RUN ["/etc/execfile", "arg1", "arg2"]
RUN apt-get update && apt-get install這兩條命令永遠用&&連線,否則apt-get update構建層被快取,會導致新package無法安裝
格式:
ADD <src> ... <dest>
範例:
ADD bin/amd64/httpserver /httpserver
在Dockerfile中使用multi-stage: Dockerfile 中的 multi-stage(多階段構建) - sparkdev - 部落格園
格式:
COPY<src> ... <dest>
範例:
COPYbin/amd64/httpserver /httpserver
格式:
CMD ["executable","param1","param2"] (執行可執行檔案,優先)
CMD ["param1","param2"] (設定了ENTRYPOINT,則直接呼叫ENTRYPOINT新增引數)
CMD command param1 param2 (執行shell內部命令)
範例:
CMD ["ethtool", "--help"]
CMD echo "1111"
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執行檔案, 優先)
ENTRYPOINT command param1 param2 (shell內部命令)
範例:
ENTRYPOINT /httpserver
CMD [-c]
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
範例:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
格式:
ENV <key> <value>
範例:
ENV MY_SERVICE_PORT=80 UDP_PORT=90
格式:
EXPOSE <port> [<port>...]
範例:
EXPOSE 80
EXPOSE 80/tcp
EXPOSE 80 90
格式:
VOLUME [<path>]
範例:
VOLUME ["/data", "/usr1/jenkins"]
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
範例:
USER www
格式:
ARG <name>[=<default value>]
範例:
ARG build_user=ribbon
Linux NameSpace_Frank_Abagnale的部落格-CSDN部落格 這篇文章比較詳細的介紹,可以參考這篇
lsns -t <type>
ls -la /proc/<pid>/ns/
nsenter -t <pid> -n
容器核心:cgroups - 簡書 可以參考這篇文章來進行了解
通過模擬來更好的熟悉Cgroups控制資源的效果, 首先建立cpudemo資料夾
執行top可以看到busyloop佔用兩個CPU資源
將程序新增進cgroup程序設定組
設定cpuquota
可以看到成功將佔用200%CPU資源的降低成1%
/sys/fs/cgroup/memory目錄下建立memorydemo資料夾
執行消耗記憶體程式, 使用watch查詢記憶體使用情況
將程序設定進cgroups設定組
設定最大記憶體大小
等待程式被OOM kill, dmesg可以看到殺死資訊
備註:刪除自主建立的cgroup資料夾, 需要使用cgroup-tools
Docker前面使用的技術都是源於linux的技術並沒有創新,而Docker的創新正是檔案系統。
Docker映象的設計中,引入了層(layer)的概念,也就是說,使用者製作映象的每一步操作,都會生成一個層,也就是一個增量rootfs(一個目錄),這樣應用A和應用B所在的容器共同參照相同的ubuntu作業系統層、Golang環境層(作為唯讀層),而各自有各自應用程式層,和可寫層。啟動容器的時候通過UnionFS把相關的層掛載到一個目錄,作為容器的根檔案系統。
由於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目錄刪除不掉。
Centos系統:
$ yum install bridge-utils
Ubuntu系統:
$ apt-get install bridge-utils
1)host模式:使用 --net=host 指定。 跟host公用一套net
2)none模式:使用 --net=none 指定。網路設定需要由自己來進行設定
3)bridge模式:使用 --net=bridge 指定,預設設定。
docker網路邏輯圖 網橋和NAT
4)container模式:使用 --net=container:NAME_or_ID 指定。使用其他容器的網路設定
網路模式圖大概如下圖所示
生成eth0網路裝置在nginx docker中
給eth0設定ip 閘道器
推薦學習:《》
以上就是最系統的掌握Docker核心技術(總結分享)的詳細內容,更多請關注TW511.COM其它相關文章!