Docker 命令终极教程:8步走
Docker容器已經從一種錦上添花的技術轉變成了部署環境的必需品。有時,作為開發人員,我們需要花費大量時間調試或研究Docker工具來幫助我們提高生產力。每一次新技術浪潮來臨之際,我們都需要花費大量時間學習。?
花費1-2天的時間來設置Docker集群,或找出導致Docker容器啟動失敗的代碼,你是不是也有過類似的經歷?對于大多數開發人員來說,我們花費在研究配置和找bug上的時間似乎都超過了實際推出新功能的時間,尤其是當你所使用的環境仍然相對較新或尚未成熟時。
我們中的有些人并沒有那么走運,無法通過完善的CI/CD流程打造穩定的環境。為此,我從各大主流Docker技術文檔網站上搜羅和整理出了這份日常工作最常使用的Docker命令教程。
詳盡的可選標志和參數的詳細列表,請參閱Docker手冊https://docs.docker.com/engine/reference/commandline/cli/
提示:每個Docker命令都有內置的文檔,比如鍵入docker run --help就可以得到幫助文檔。鍵入docker run --help將生成以下幫助文檔。
我希望本文可以幫助你擺脫調試和使用Docker的煩惱。閱讀各個命令時,請注意命令的相關說明。
Docker構建?
$?docker?build?\
--build-arg?ARTIFACTORY_USERNAME=timothy.mugayi?\
--build-arg?ARTIFACTORY_SECRET_TOKEN=AP284233QnYX9Ckrdr7pUEY1F?\
--build-arg?LICENSE_URL='https://source.com/license.txt'?\
--no-cache??-t?helloworld:latest?.
你可以使用可選的構建參數構建Docker鏡像。在默認情況下,Docker會緩存第一個Dockerfile構建,或根據Dockerfile中的run命令向鏡像添加新層后的構建,目的是加速后續構建。
如果你不需要緩存,那么可以向上面的示例一樣添加一個不緩存的參數。
注意:Docker命令可以按名稱或Docker容器ID執行。下述命令中的<CONTAINER>可以換成容器ID或容器名稱。
?
運行Docker容器
$?docker?start?<CONTAINER>
?
啟動一個已有的容器。我們假定該容器已經下載并創建完畢。
$?docker?stop?<CONTAINER>
停止正在運行的Docker容器。
$?docker?stop?$(docker?container?ls?-aq)
?
如果你有多個正在運行的Docker容器,而且你想停止所有容器,那么可以輸入docker stop以及所有容器ID的列表。
$?docker?exec?-ti?<CONTAINER>?[COMMAND]?
在某個特定的容器內運行一個shell命令。?
$?docker?run?-ti?—?image?<IMAGE>?<CONTAINER>?[COMMAND]
Docker run 與 start 有著明顯的區別。從根本上說,Docker run 做了兩件事情:(1)創建一個鏡像的新容器;(2)執行這個容器。如果你希望重新運行失敗或退出的容器,請使用docker start命令。
$?docker?run?-ti?—?rm?—?image?<IMAGE>?<CONTAINER>?[COMMAND]?
這是一個很有趣的命令,旨在同時創建和啟動容器。它還想在容器內運行命令,然后在命令執行完成后刪除容器。
docker?run?-d??<IMAGE>:<IMAGE_TAG>
Usage:
??docker?run?-d??helloworld:latest
如果你希望在分離狀態中啟動docker run命令(例如,作為Linux的后臺守護程序),則可以在run命令最后添加-d。
$?docker?pause?<CONTAINER>
暫停某個特定容器內所有正在運行的進程。
$?docker?ps?-a
上述命令將列出之前運行的所有Docker鏡像。在找出你想運行的鏡像后,可以執行如下命令。請確保更改容器ID,以反映最初的docker ps -a命令顯示的結果。
sudo?docker?run?{container?ID}?-e?AWS_DEFAULT_REGION=us-east-1?\
e?INPUT_QUEUE_URL="https://sqs.us-east-1.amazonaws.com/my_input_sqs_queue.fifo"?\
e?REDIS_ENDPOINT="redis.dfasdf.0001.cache.amazonaws.com:8000"?\
e?ENV=dev?\
e?DJANGO_SETTINGS_MODULE=engine.settings?\
e?REDIS_HOST="cmgadsfv7avlq.us-east-1.redis.amazonaws.com"?\
e?REDIS_PORT=5439?\
e?REDIS_USER=hello?\
e?REDIS_PASSWORD=trasdf**#0ynpXkzg
上述命令展示了如何運行帶有多個作為參數傳入的環境變量的Docker鏡像,\表示換行符。?
調試Docker容器
你可以使用docker ps獲取當前正在運行的容器名稱。?
$?docker?history?<IMAGE>
example?usage:
$?docker?history?my_image_name
上述命令可以顯示特定鏡像的歷史記錄。當你想深入了解Docker鏡像時,這些信息非常有用。讓我們深入討論一下,因為你非常有必要了解這個命令的功能,而有關該命令的文檔少之又少。
在我們談論Docker時,鏡像是建立在多層之上的,這些層是Docker鏡像的基礎。每個容器都包含一個可讀/可寫層的鏡像(你可以-將其視為持久狀態或文件)。在這之上才是其他只讀層。這些層(也稱為中間鏡像)是在執行Docker鏡像的build命令時,執行Dockerfile中的命令時生成的。
如果你的Dockerfile中包含from、run和/或copy指令,那么build該鏡像時,run指令就會用自己的鏡像ID創建一層。然后,該鏡像/層就會顯示在docker history中,而且還會顯示鏡像的ID以及生成日期。后續指令將生成另一個條目,依此類推。CREATED BY列大致對應于Dockerfile中的一行。如下圖所示。
'docker history'命令的圖示
$?docker?images
?
列出當前存儲在機器中的所有鏡像。
$?docker?inspect?<IMAGE|CONTAINER?ID>
Docker inspect將顯示有關特定Docker對象的低級信息。在調試的情況下, 存儲在該對象中的數據會非常有用,例如交叉檢查Docker掛載點。
請注意:該命令獲取兩個主要響應:鏡像級別的詳細信息和容器級別的詳細信息。你可以從該命令中獲取如下信息:
容器ID以及創建的時間戳
當前狀態(在嘗試識別容器是否已停止以及為何停止時很有用)
Docker鏡像信息、文件系統綁定、卷信息以及掛載
環境變量,例如傳遞給容器的命令行參數
網絡配置:IPv4和IPv6的IP地址以及網關和輔助地址
$?docker?version?
這個命令顯示Docker的版本,包括計算機上當前安裝的客戶端和服務器版本。?
沒錯,Docker是一個客戶端-服務器應用程序。守護程序(長期運行的Linux后臺服務)是服務器,CLI是眾多客戶端之一。Docker守護程序會公開一個REST API,許多不同的工具可以通過該API與該守護程序進行通信。
$?docker?version
Client:?Docker?Engine?-?Community
?Version:???????????19.03.5
?API?version:???????1.40
?Go?version:????????go1.12.12
?Git?commit:????????633a0ea
?Built:?????????????Wed?Nov?13?07:22:34?2019
?OS/Arch:???????????darwin/amd64
?Experimental:??????false
?
Server:?Docker?Engine?-?Community
?Engine:
??Version:??????????19.03.5
??API?version:??????1.40?(minimum?version?1.12)
??Go?version:???????go1.12.12
??Git?commit:???????633a0ea
??Built:????????????Wed?Nov?13?07:29:19?2019
??OS/Arch:??????????linux/amd64
??Experimental:?????false
?containerd:
??Version:??????????v1.2.10
??GitCommit:????????b34a5c8af56e510852c35414db4c1f4fa6172339
?runc:
??Version:??????????1.0.0-rc8+dev
??GitCommit:????????3e425f80a8c931f88e6d94a8c831b9d5aa481657
?docker-init:
??Version:??????????0.18.0
??GitCommit:????????fec3683
?
Docker版本輸出
這是如何設置客戶端-服務器體系結構的圖像
AWS ECS上的Docker
有時,你需要進入運行中的Docker容器,調試或交叉檢查配置是否正確。
你可以使用docker exec -it <container ID> /bin/bash來獲取shell訪問權限。如果你想找出無法運行的Docker鏡像,例如你想使用AWS ECS集群,則會收到一則晦澀難懂的錯誤消息,如下所示。
坦白地說,引發這一錯誤的原因多種多樣,例如
1)你的代碼有問題,引發了未捕獲的異常,并且Docker容器在啟動時宕機;
2)在使用EC2實例上的ECS群集時,出現了磁盤空間不足的情況,如果你的ECS的放置類型沒有選擇Fargate就會出現這種問題;
3)你現有的Docker容器占用了所有EC2的可用內存。
Essential?container?in?task?exited
?
執行以下命令即可找出最近運行失敗的Docker容器。如果你的賬號擁有sudo訪問權限,請忽略sudo。你可以使用該命令,根據給定的輸出,通過重新運行容器來查看其失敗的原因。
$?sudo?docker?ps?-a?--filter?status=dead?--filter?status=exited?--last?1
如有疑慮,重啟Docker服務
$?sudo?service?docker?stop
$?sudo?service?docker?start
#?on?a?MAC?you?an?use?the?docker?utilty?or?alternatively?run
$?killall?Docker?&&?open?/Applications/Docker.app
?相信無需進一步的解釋。
?
清理Docker鏡像
?
$?docker?system?prune
Docker在清理未使用的對象(例如鏡像、容器、卷和網絡)方面采取了保守的態度。
?除非你明確要求Docker刪除,否則通常不會刪除這些對象。因此,如果不刪除這些對象,那么很快就會占用大量空間。因此,定期運行下述命令,清理未使用的Docker鏡像非常重要。
docker?kill?<CONTAINER>
殺死某個正在運行的容器。
$?docker?kill?$(docker?ps?-q)
殺死所有正在運行的容器。
$?docker?rm?<CONTAINER>?
刪除某個目前沒有運行的容器。如果鏡像保存在遠程鏡像庫中,那么不會受到影響。?
$?docker?rm?$(docker?ps?-a?-q):?
刪除所有沒有運行的容器。
$?docker?logs?my_container?
訪問容器的日志,在調試時非常有用。?
從遠程鏡像庫中提取Docker鏡像?
1、Docker Hub
Docker Hub是Docker提供的一項服務,用于查找和共享打開的容器鏡像。?
如果你希望從Docker Hub將鏡像拉取到本地,那么只需在Docker run命令后面加上鏡像路徑即可。以下命令說明了如何拉并運行穩定版本的Rocker鏡像
$?docker?run?--rm?-p?8787:8787?rocker/verse?
Docker首先會嘗試檢查本地計算機上是否有該鏡像。如果沒有,在從Docker Hub庫中下載鏡像,這個功能是開箱即用的。
$?docker?pull?rocker/verse?
如果你只想拉取鏡像,而不想運行鏡像,則只需運行docker pull即可。
如果你想登錄Docker Hub,則可以運行上述命令,然后輸入密碼即可。?
2、自定義 Docker 鏡像庫
$?docker?login?your.docker.host.com
Username:?foo
Password:?********
Email:?user@myemail.com
如果你想從某個需要身份驗證的通用自定義Docker鏡像庫提取鏡像,則可以使用docker login命令,如上所示。請注意,執行上述操作時,會在~/.docker/config.json
文件中創建一個條目。修改~/.docker/config.json可以修改身份驗證詳細信息。
3、亞馬遜ECR
亞馬遜ECR(Amazon Elastic Container Registry)是一個完全托管的Docker容器倉庫,允許開發人員存儲、管理和部署Docker容器鏡像。亞馬遜ECR與ECS(Elastic Container Service)無縫協作。如果你需要從ECR提取鏡像,則可以參照如下命令。
你需要使用擁有AWS訪問權限和密鑰的IAM用戶配置AWS CLI。
亞馬遜ECR要求IAM用戶訪問秘鑰必須通過某個IAM策略賦予ecr:GetAuthorizationToken的權限,然后才能通過鏡像庫的驗證并提取鏡像。另外,你可以利用亞馬遜ECR Docker Credential Helper實用程序。以下方法假定你使用的是AWS CLI,且已設置好所有權限。
$?aws?ecr?list-images?--repository-name=twitter-data-engine-core
$?aws?ecr?describe-images?—-?repository-name=twitter-data-engine-core
$?aws?ecr?get-login?—-?region?us-east-1?—-?no-include-email?
Get-login命令會生成一個長的Docker登錄命令。你只需復制并執行。當然首先必須先進行身份驗證,然后才能嘗試從AWS ECR執行Docker鏡像提取。
$?docker?login?-u?AWS?-p?{YOUR_TEMPORARY_TOKEN}
$?docker?pull?723123836077.dkr.ecr.us-east-1.amazonaws.com/twitter-data-engine-core:build-9
導入和導出Docker鏡像
$?docker?save?your_docker_image:latest?>?/usr/local/your_docker_image.tar
$?docker?load?<?/usr/local/your_docker_image.tar?
如果你有需要,并且想將鏡像導出到硬盤,并加載到Docker鏡像,那么就可以執行上述命令。
如果你想通過另一種媒介(Docker鏡像庫之外),將Docker鏡像從一臺機器轉移到另一臺機器,那么導出到文件非常有用。由于安全性,在某些環境中你的訪問可能會受到限制。你無法實施鏡像庫到鏡像庫的遷移,因此這是一個很實用的命令。
原文:https://medium.com/better-programming/the-ultimate-docker-command-list-d98ef300fe6d
?
總結
以上是生活随笔為你收集整理的Docker 命令终极教程:8步走的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序直播生态
- 下一篇: nestjs CRUD