Docker必備基礎(chǔ)知識
【GiantPandaCV導(dǎo)語】很多算法攻城獅朋友在日常工作中都會接觸和使用到docker來進行自己的訓(xùn)練環(huán)境配置或者部署環(huán)境搭建。本次和大家分享一些筆者總結(jié)的docker基礎(chǔ)知識。
一、docker是什么?
docker可以實現(xiàn)虛擬機隔離應(yīng)用環(huán)境的功能,并且開銷比虛擬機小。
二、身為算法攻城獅,我們要掌握docker的哪些知識?
1)docker的基礎(chǔ)組成部分
docker由:客戶端、守護進程、鏡像、容器和倉庫構(gòu)成。
客戶端(client)和守護進程(daemon)
docker的客戶端就是你的操作端,你在這里輸入docker的一些指令,守護進程就是docker的服務(wù)器端,這一端會執(zhí)行你的指令并返回結(jié)果
鏡像(image)
是一個層疊的只讀文件系統(tǒng),docker通過讀取其中的文件來啟動一個指定的容器
容器(containter)
使用者通過啟動某個指定鏡像而構(gòu)件的一個虛擬的操作系統(tǒng)(guest os)就叫做容器,在容器內(nèi)就像在一個真正的系統(tǒng)內(nèi)操作一樣。
倉庫
倉庫放置了別人做好的多個鏡像??筛鶕?jù)需要下載
2)docker基本操作:安裝、倉庫設(shè)置、啟動、關(guān)閉、退出、進入
docker安裝
https://yeasy.gitbook.io/docker_practice/install/ubuntu
docker的鏡像加速器,用以從官方鏡像倉庫中拉取自己需要的鏡像
https://yeasy.gitbook.io/docker_practice/install/mirror
啟動docker
sudo systemctl daemon-reload #重新加載某個服務(wù)的配置文件
sudo systemctl restart docker #重新確定docker
基礎(chǔ)操作
# 獲取鏡像
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標(biāo)簽]
# 啟動鏡像
docker run -it ubuntu:18.04 bash # dokcer run的參數(shù)可通過--help來查看
# 關(guān)閉容器
docker stop -t=ContainerID 或 docker kill -t=ContainerID
# 暫時退出鏡像
exit
# 重新進入鏡像
sudo docker exec -it 067 /bin/bash
# 啟動一個已停止的容器
docker start 067
# 查看當(dāng)前docker上容器的運行狀態(tài)
docker ps
3)docker進階操作:
請通過 docker command --help查看
三、使用別人的鏡像具體案例
# 拉取鏡像
docker pull ubuntu:18.04 #從倉庫中拉取鏡像
# 查看本地的image
docker images #查看本地倉庫內(nèi)的鏡像
# 用image啟動一個容器
docker run -it ubuntu:18.04 bash
# 暫時退出并重新進入容器
exit
docker ps -a
sudo docker exec -it 067 /bin/bash #此處067是上一指令查到的需要進入的容器ID
# 在容器內(nèi)進行操作
和ubuntu系統(tǒng)內(nèi)的操作一致
cat /etc/os-release
四、做自己的鏡像具體案例
# 拉取基礎(chǔ)鏡像
docker pull ubuntu:18.04 #從倉庫中拉取鏡像
# 制作自己的Dockerfile
mkdir ppp&&cd ppp
touch Dockerfile 或 vi Dockerfile
# 制作鏡像
docker build -t aaa:bbb .
docker images #在本地鏡像列表里就可以看到一個tag為aaa:bbb的image
# 上傳鏡像
docker commit -a "aaa.com" -m "my apache" a404c6c174a2 ccc:ddd
Dockerfile說明
是用來逐層構(gòu)件一個image的腳本文件,是一個文本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。
FROM ubuntu:18.04 # 指定基礎(chǔ)鏡像 如果為scratch代表從下一行開始是鏡像的第一層
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html # RUN指令用來執(zhí)行命令,每一行代表新建docker的一個layer
#能在一個layer內(nèi)執(zhí)行的指令就通過&& 進行聯(lián)接,并可應(yīng)用shell中的換行符\
#在dockerfile每層都要檢查,下載,展開的多余文件,以及緩存等能刪除的盡量都去掉
COPY #COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置。
COPY package.json /usr/src/app/ # 將當(dāng)前上下文路徑的json文件復(fù)制到image的指定路徑下
AND #豐富了COPY的功能,但是會降低構(gòu)件image速度,如果不需要自動解壓縮,則不推薦使用該指令
CMD # ????????? 還沒理解
ENTRYPOINT # 當(dāng)存在 ENTRYPOINT 后,CMD 的內(nèi)容將會作為參數(shù)傳給ENTRYPOINT,從而達到了我們預(yù)期的效果。
ENV #用來設(shè)置環(huán)境變量 ENV <key> <value> 或 ENV <key1>=<value1> <key2>=<value2>...
ENV VERSION=1.0 DEBUG=on \
NAME="Happy ONE"
ENV LD_LIBRARY_PATH=\
$LD_LIBRARY_PATH:\
$NAME/alpha
ARG # ARG <參數(shù)名>[=<默認(rèn)值>] Dockerfile 中的 ARG 指令是定義參數(shù)名稱,以及定義其默認(rèn)值。該默認(rèn)值可以在構(gòu)建命令 docker build 中用 --build-arg <參數(shù)名>=<值> 來覆蓋
ARG DOCKER_USERNAME=library # 注意:在FROM之前定義的ARG參數(shù),會消失,在FROM后需要重新定義
# ARG 所設(shè)置的構(gòu)建環(huán)境的環(huán)境變量,在將來容器運行時是不會存在這些環(huán)境變量的。但是不要因此就使用 ARG 保存密碼之類的信息,因為 docker history 還是可以看到所有值的。
VOLUME # 用于指定image啟動時掛載到容器中的默認(rèn)卷,而不是寫入容器存儲層
VOLUME /data # VOLUME ["<路徑1>", "<路徑2>"...] 或 VOLUME <路徑>
在image啟動時可替換
docker run -d -v mydata:/data xxxx #其中的 -v mydata:/data 就是掛載宿主機的卷到容器內(nèi)
EXPOSE # EXPOSE <端口1> [<端口2>...] EXPOSE 指令是聲明容器運行時提供服務(wù)的端口,這只是一個聲明,在容器運行時并不會因為這個聲明應(yīng)用就會開啟這個端口的服務(wù)
# 在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務(wù)的守護端口,以方便配置映射;另一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口
WORKDIR # WORKDIR <工作目錄路徑> 使用 WORKDIR 指令可以來指定工作目錄(或者稱為當(dāng)前目錄),以后各層的當(dāng)前目錄就被改為指定的目錄,如該目錄不存在,WORKDIR 會幫你建立目錄。
USER # USER <用戶名>[:<用戶組>] 指定當(dāng)前用戶
HEALTHCHECK
ONBUILD
LEBEL
SHELL #SHELL 指令可以指定 RUN ENTRYPOINT CMD 指令的 shell,Linux 中默認(rèn)為 ["/bin/sh", "-c"]
Dockerfile 多階段構(gòu)建
五、一些docker使用時的小習(xí)慣
docker的文件管理系統(tǒng)是逐層實現(xiàn)的,所以構(gòu)件一個docker的image時,不要添加過多的layers以避免image過大且過于復(fù)雜。
- END -
歡迎加入GiantPandaCV交流群
