原創聲明:作者: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 'arnold_zhao@xiaoi.com' --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 )
批量刪除 tag為 <none>的鏡像
docker rmi `docker images | grep '<none>' | awk '{print $3}'`
或
docker image rm $(docker images | grep '<none>' | awk '{print $3}')
刪除所有鏡像
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 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證書的能力,此處以騰訊雲舉例了,畢竟樓主目前使用的是騰訊雲):
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命令,方便后續回顧時使用,但沒想到一整理還花費了挺長時間!尼瑪。。后續會持續的更新維護.........后續再升級,就是,璀璨鑽石版?超凡大師版?end 最強王者