1. 程式人生 > >Docker常用命令速查手冊(華貴鉑金版)

Docker常用命令速查手冊(華貴鉑金版)

原創宣告:作者:Arnold.zhao  部落格園地址:https://www.cnblogs.com/zh94

Docker常用命令速查手冊

 

搜尋倉庫映象

docker search nginx

獲取映象

docker pull nginx

列出映象

docker images

檢視映象、容器、資料卷所佔用的空間。

docker system df 

檢視Docker容器的相關資訊

docker info

 

刪除映象(or 標籤)

docker image rm ID

啟動映象

docker run -d -p 8088:80 --name nginx-sip nginx (--rm -it 引數)

停止容器

docker stop nginx-sip

將stop後的容器直接啟動

docker start nginx-sip

重新啟動一個容器

docker restart nginx-sip

刪除一個已經停止了的容器

docker rm nginx-sip

刪除所有已經停止執行的容器

docker container prune

檢視容器列表

docker ps -a

檢視映象或容器的資訊

docker inspect nginx(nginx-sip)

進入當前容器的檔案系統

docker exec -it nginx-sip sh

容器與映象的匯入匯出

匯出本地某個容器為tar包   (目前容器打包為映象後,不能直接啟動,通過 docker inspect檢視發現當前映象不存在CMD相關配置,暫保留)

docker export nginx-sip > /home/psrt/docker/nginx-sip-export.tar

 

將所歸檔的容器檔案匯入為當前docker映象

docker import nginx-sip-export.tar nginx_arnold:v1

 

docker import/docker export;將一個容器匯出為檔案,再使用docker import命令將容器匯入成為一個新的映象,但是相比docker 

save命令,容器檔案會丟失所有元資料和歷史記錄,僅儲存容器當時的狀態,相當於虛擬機器快照。

https://www.cnblogs.com/linjiqin/p/8618635.html

 

匯出本地映象為tar包

docker save -o 檔名.tar 映象名稱

docker save 映象名稱>/opt/檔名.tar

 

將對應的打包映象載入到對應的Docker映象中

docker load < 檔名.tar

 

docker load/docker save;將一個映象匯出為檔案,再使用docker load命令將檔案匯入為一個映象,會儲存該映象的的所有歷史記錄。比docker export命令匯出的檔案大,很好理解,因為會儲存映象的所有歷史記錄。

檢視容器,映象的改動記錄Diff & history

通過diff檢視當前 容器 儲存層的具體改動記錄

docker diff nginx-sip

 

檢視 映象內的歷史記錄

(是針對映象使用的命令,於docker diff區分開,docker diff是針對容器進行使用的)

docker history nginx:v1224

 

檢視映象或容器的資訊

docker inspect nginx(nginx-sip)

檢視映象、容器、資料卷所佔用的空間。

docker system df 

 

Docker commit

將當前nginx-sip容器儲存層儲存為名稱為nginx:v1224的映象,其中包含了容器內的所有改動,其中映象內包含了原有容器的所有檔案變化(可以配合docker save再將映象歸檔為tar的包)

 

docker commit --author '[email protected]' --message '修改了網頁和新增了arnold資料夾' nginx-sip nginx:v1224

 

慎用docker commit ,因為會把映象搞的很臃腫,且黑箱,;但有需求的話,還是要用滴;畢竟需求最大

 

資料卷的操作

原創宣告:作者:Arnold.zhao  部落格園地址:https://www.cnblogs.com/zh94

 

建立一個數據卷

docker volume create my-vol

檢視當前所有的資料卷

docker volume ls

檢視對應資料卷的具體資訊

docker volume inspect my-vol

刪除指定資料卷

docker volume rm my-vol

清理無主的資料卷

docker volume prune

建議:

所有的容器掛載等相關操作,都基於資料卷的方式進行掛載,這樣將會易於容器的後續管理;否則隨著後續容器的越來越多,每一個容器都隨意掛載宿主機的檔案目錄,將會導致後續的Docker容器管理越來越混亂;

Mount掛載

docker volume create kbase-sip-volume

採用資料卷的方式進行掛載:

docker run -d -p 8088:8088  --mount type=volume,src=kbase-sip-volume,target=/log/kbase-psrt/ --name kbase-psrt  kbase-psrt

 

關於目錄掛載相關的資訊,詳情可檢視如下文章:

(通過如下文章可以知悉 -v,volume的掛載方式,儘管如此,此處仍然建議使用者優先使用 mount做目錄掛載)

docker_practice & 使用繫結掛載(bind mount) & 資料卷 & 資料持久化volume和bind mounts兩種方式

 

批量刪除

停止所有容器

docker stop $(docker ps -s -q )

 

刪除所有容器

docker rm $(docker ps -a -s -q )

 

刪除所有映象

docker image rm $(docker images -q )

 

核心:

主要是通過:-q 引數表示只顯示對應的ID,也可以通過 -f 引數(過濾器),篩選出更多的條件資料;如:

docker image ls -f since=mongo:3.2 (表示獲取mongo:3.2以後的映象資訊)

docker image ls -f label=com.example.version=0.1(獲取指定標籤的映象資料)

通過使用filter過濾器以及配合-q後所產生的指定範圍的ID列表的方式,來配合另外一個docker命令作為引數,以此來刪除所對應的 批量容器或映象等資訊;除了上述常用的刪除操作外,還可以使用 --format 來自定義模板展示,詳情可檢視該連結:

docker_practice

Docker logs 

獲取docker容器的日誌路徑:

docker  inspect  --format '{{.LogPath}}'   CONTAINER_ID

 

檢視當前Docker的全域性守護程序的預設日誌驅動程式(預設為:json-file,)

docker info --format '{{.LoggingDriver}}'

 

容器啟動時設定對應的日誌啟動型別(此處設定驅動為json-file,且設定json日誌檔案最大為10M,超出10M則自動生成新的檔案,max-file=3表示最多生成3個日誌檔案,超出則刪除)

docker run -d  -p 80:80  --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 --name nginx nginx

 

容器日誌的幾種檢視方式:

檢視指定時間後的日誌,只顯示最後100行:

docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID

 

檢視最近30分鐘的日誌:

docker logs --since 30m CONTAINER_ID  

 

檢視某時間段日誌:

docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID

 

可參考文章連結:

Docker日誌官網文件 & 容器日誌的幾種檢視方式 &容器啟動時指定驅動及檔案配置

不在容器啟動時候進行日誌驅動的配置,而是直接配置當前整個Docker服務的驅動配置,可參考如下連結:

注意:很多文章寫法不明不白有些曲解人意,docker 的容器日誌也是日誌,docker的整個守護程序的服務日誌也是日誌,所以 在檢視下述文章連結或查詢相關資料的時候,一定要自我區分什麼是Docker容器的日誌配置,什麼是針對整個Docker引擎的日誌配置,不要搞的不明不白即可;

Docker日誌位置 & 日誌配置 & Docker日誌設定 & Docker守護程序的日誌配置

Dockfile

原創宣告:作者:Arnold.zhao  部落格園地址:https://www.cnblogs.com/zh94

 

RUN 指令是用來執行命令列命令的,由於命令列的強大能力,RUN 指令在定製映象時是最常用的指令之一,構建映象時會被執行使用

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

 

映象構建

docker build -t nginx:v3 .

 

COPY 指令將從構建上下文目錄中 <源路徑> 的檔案/目錄複製到新的一層的映象內的 <目標路徑> 位置:

COPY dev/application-dev.properties /app/kbase-psrt/

 

CMD 命令是在容器被啟動後執行,定義CMD容器啟動時的命令操作

CMD ["nginx", "-g", "daemon off;"]

 

entrypoint   替換CMD指令,(用於docker啟動時的傳參,docker啟動時所輸入的命令都會替換原有構建檔案中的CMD命令,所以此處entrypoint可以接受cmd命令的方式,就是所輸入的引數替換了CMD,然後又執行entrypoint時得到對應的引數資訊)

 

ENV設定環境變數 無論是後續構建的指令使用 還是執行時的容器應用都可以使用該環境變數,$VERSION

ENV VERSION=1.0 DEBUG=on \

    NAME="Happy Feet"

 

ARG也是定義環境變數引數,不同的是,ARG定義的變數,在容器執行時是不會存在這些變數

ARG VERSION=1.0

 

Volume 定義匿名卷(目的:容器記憶體儲層儘量不發生寫操作,將所對應的動態儲存資料的目錄,掛載到對應的宿主機目錄上去,或直接掛載到匿名目錄中 ,保持了容器儲存層的無態變化)

 

 

EXPOSE <埠1> [<埠2>...]   暴露對應的埠;   執行時使用隨機埠對映時 docker run  -p ,會自動隨機對映一個EXPOSE的埠

 

上下文路徑的解釋(推薦)

 

基於Docker的私有倉庫的搭建

Docker倉庫的訪問操作預設是必須為Https的方式進行,所以首先需要先搭建一個Https的代理環境,用於後續的Docker的操作:

本人此處是使用的騰訊雲域名廠商所簽發的https證書,然後再通過Nginx https反向代理的方式用來訪問Docker的倉庫地址;

 

關於騰訊雲的SSL證書申請步驟如下所示(各大雲廠商實際都具備頒發SSL證書的能力,此處以騰訊雲舉例了,畢竟樓主目前使用的是騰訊雲):

只要有購買該廠商的域名,都可以申請免費的SSL證書

申請完以後在對應的證書列表中,可以檢視對應的已頒發證書

Https證書的安裝步驟詳情,本人此處選擇的是通過Nginx進行證書的安裝

 

建立對應的資料卷,並啟動registry docker倉庫映象

docker volume create my-docker-register

docker run -d  -p 5000:5000 --mount type=volume,src=my-docker-register,target=/var/lib/registry --name docker-registry registry

 

啟動完對應的 registry倉庫後,直接配置對應的Nginx反向代理到對應的 5000的埠上,當前本人的Nginx配置如下(可以參考騰訊雲所給的配置建議):

server {

     #SSL 訪問埠號為 443

     listen 443;

     #填寫繫結證書的域名

     server_name docker.register.zhivx.com;

     #啟用 SSL 功能

     ssl on;

     #證書檔名稱

     ssl_certificate /opt/app/nginx/conf/docker-https/1_docker.register.zhivx.com_bundle.crt;

     #私鑰檔名稱

     ssl_certificate_key /opt/app/nginx/conf/docker-https/2_docker.register.zhivx.com.key;

     ssl_session_timeout 5m;

     #請按照以下協議配置

     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

     #請按照以下套件配置,配置加密套件,寫法遵循 openssl 標準。

     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

     ssl_prefer_server_ciphers on;

     location / {

            proxy_pass_header Server;

            proxy_set_header Host $http_host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header X-Scheme $scheme;

            #萬能的Nginx,此處需注意需反向代理後的registry的訪問方式為http

            proxy_pass http://registry;

     }

     #location / {

     #網站主頁路徑。此路徑僅供參考,具體請您按照實際目錄操作。

     #   root /opt/app/nginx/html;

     #   index  index.html index.htm;

     #}

 }

upstream registry {

        server 127.0.0.1:5000;

    }

 

當前Windows的機器作為Docker的Client端, Pull相關資料

docker tag kbase-psrt:latest docker.register.zhivx.com/kbase-psrt

docker push docker.register.zhivx.com/kbase-psrt 

 

 

以上,基本上你的Docker私有倉庫就已經配置成功了:

但是,Docker的私有倉庫的功能很多,所以再向下繼續深挖就有點過於運維了【~~ /捂臉笑】

 

所以此處列舉一些可能存在的問題點,後續如有興趣可以再繼續深入

1、register的使用過程中,由於是使用的Nginx做的反向代理,所以對於過大的映象檔案pull 或push時超時的問題處理(修改nginx超時時間理論上可以解決,暫未驗證)

2、register倉庫的安全性(針對各團隊成員分配唯一的賬號密碼及許可權配置)

3、register倉庫的視覺化管理工具(github上有一些,此處推薦一下docker-registry-web,不過感覺目前的視覺化工具都還不夠完善,坑有點多。。所以還不敢深入,感興趣有時間的同學可以嘗試下)

4、倉庫一直在深度使用的過程中磁碟佔用較大等資料遷移,以及正常團隊使用過程中網路異常是否會導致倉庫中存在髒資料等現象?部分push一半的映象如果中間停止了push,通過檢視倉庫的對映目錄,會發現的確還是存在已經上傳一半的資料的,那麼這些資料的處理方式是什麼?手動的在伺服器指令碼清理,或者是在視覺化介面中進行清理?目前看到的現象是 https:/** /v2/_catalog 時針對髒資料等映象資訊是不能顯示出來的;

 可參考的外部文章連結:

openssl自行簽發域名證書 & 阿里域名廠商的所提供的站點證書進行配置

 

原創宣告:作者:Arnold.zhao  部落格園地址:https://www.cnblogs.com/zh94

 

Docker Compose

 

原本是想整理下自己印象筆記中的一些關於Docker的隨筆,順帶彙總下相關的常用Docker命令,方便後續回顧時使用,但沒想到一整理還花費了挺長時間!尼瑪。。後續會持續的更新維護ing.......後續再升級,就是,璀璨鑽石版?超凡大師版?end 最強王者