只要 8 个步骤,学会这个 Docker 命令终极教程!

只要 8 个步骤,学会这个 Docker 命令终极教程!

只要 8 个步骤,学会这个 Docker 命令终极教程!

作者 |Timothy Mugayi

译者 | 弯月责编 | 徐威龙

封图|CSDN 下载于视觉中国

Docker容器已经从一种锦上添花的技术转变成了部署环境的必需品。有时,作为开发人员,我们需要花费大量时间调试或研究Dockel , }r工具来帮助我们提高生产力。每一次新技术+ j $ L 7 i 2 o浪潮来临之际,我们都需要花费大量时; $ j ; N $ ` }间学习。

花费1-2天的时间来设置Docker集群,或找出导致Docker容器启动失败的代码,你是不是也有过类似的经历?对于大多数开发人员来说,我们花费在研究配置和找bug上的时间似乎都超过了实际推出新功能的时间,尤其是当你所使用的环境仍然相对较新或尚未成熟时。

我们中的k K O l =有些人并没有那么走运,无法通过完善的CI/CD流程打造稳定的环境。为此,我从各z ? _ #大主流Docker技术文档网站上搜罗和整理出了这份日常工作最常使用的Docker命令教程

详尽的可选标志和参数的详细列表,请参阅Docker手册https://docs.dockers I j ~ G 5 l.com/engine/reference/commandline/cli/

提示:每个Dock e &erz f } 3 3命令都有内置的文档,比如键入docker runx ] ^ e n } f D --help就可q k @以得到帮助文档。键入docker run --help将生成以下帮助文档。

只要 8 个步骤,学会这个 Docker 命令终极教程!

我希望本文可以帮助你摆脱调试和使用Docker的烦恼。阅读各个命令时,请注意命令的x = 8 ,相关说明。

只要 8 个步骤,学会这个 Docker 命令终极教程!

Docker构建

$dockerbuild
--build-argARTIFACTORY_USERNAME=timothy.mugayi
--build-argARTIFACTORY_SECRET_TOKEN=AP284233QnYX9Ckrdr7pUEY1F
--build-argLICENSE_URL='https://source.com/lL h ~ S G uicense.txt'
--no-cache-thelloworld:latest.

你可以使用可选的构建参数构建Docker镜像。在默认情况下H & u N,Docker会缓存第一个Dockerfile构建,或S V f l F H根据Dockerfile中的run命令向镜像添加新层后的构建,目的是加速后续构建。

如果你不需: 2 S _ c Q要缓存,那么可以向上面的示例一样添加一个不缓存的A s D l M参数。

z E & 2 w P T Y T意:Docj L 2 { P *ker命令可 X / $ _ | H以按名称或Docker容器ID执行。下述命令中的<CONTAINEO w ^ w U a T #R&g$ H S 2 @ v & [t;可以换成容器ID或容器名称。

只要 8 个步骤,学会这个 Docker 命令终极教程!

运行Docker容器

$dockerstart<CONTAINER>

启动一个已有的容器。我们假定该容器已经下载并创建完毕。

$dockerstop<CONTAINER>

停止正在运行的Docker容器。

$dockerstop$(dockercontain^ L P S } j | Aerls-aq)

如果你有多个正在运行的Docker容器,而且你想停止所有# P r X I容器,那么可l L _ y 6 _ & , O以输入docker stop以及所有容器ID的列表。

$doJ $ -  (ckerexec-ti<CONTAINER>[CL @ O [ ` & 7OMMAND]

在某个特定的e U # ^ 9 n @ N容器内运行s i ] %一个shell命令。

$dockerrun-ti—image<IMAGE><CONTAINER>[COMMAND]

Docker run 与 start 有着明显的区别。从根本上说,Docker run 做了两p 8 C E K件事情:(1)创建一个镜像的新容器;(2)执行这个容器。如果你希望X 8 = t . r + i重新运行失败或退出的容器,请使用docker start命令。

$dock( u , @ 7errun-ti—rm—image<IMAGE><CONTAINER>[COMMAND]

这是一个很有趣的命令,旨在同时创建和启动容器。它还想在容器内运行命令,然后在命令执行完成后删除容器。

dockerrun-d<IMAGE>:<IMAGE_TAG>
Usage:
dockerrun-dhelloworld:latest

如果你希望在分离状态中启动docker run命令(例如,作为Linux的后台守护程序),则可以在run命令最后添加-d。

$dockerpause<CONTAINER>

暂停某个特定容器内所有正在运行的进a W u 6 a R程。

$dockerps-a

上述命令将列出之前运行的所有Do% 5 ; zcker镜像。在找出你想运行的镜像后,可以执行如下命令。请确保更改容器ID,以反映最初的docker ps -a命令显示的结果。

sa ` o Z . nudodockerrun{containerID}-eAWS_DEFAULT_REGION=us-east-1
eINPUT_QUEUE_URL="https://sqs.us-east-1.amaM X Kzonaws.com/my_inp0 } 0 y # t Z Tut_sqs_queue.fifo"
eREDIS_ENDPOINT="redis, + n w 9 6 v.dfasdf.( 7 ! t G W i ,0001.cache.amazonaws.com:8000"
eENV=dev
eDJANGO_SETTINGS_2 c 1 z f Q {MODULE=engine.settings
eREDIS_HOST="cmgadsfv7avlq.us-east-] X o1.redis.amazonaws.com"
eG y c } * P hREDIS_PORT=5439
eREDIS_USER=hello
eREDIS_PASSWORD=trasdf**#0ynpXkzg

上述命令展示了如何运行带有多个作为参数传入的环境变量的Docker镜像,表* - w h a p I E E示换行符。

只要 8 个步骤,学会这个 Docker 命令终极教程!

调试Docker容器

你可以使用docker ps获取当前正在运行的容器名称。3 R l X g z

$dockerhistory<IMAGE>
exampleusageT x  = B 9 t & N:
$dockerhistorymy_image_name

上述命令可以显示特定镜像的历史记录。当你想h ? M O 5 P t X C深入了解Docker镜像时,这些信息非常有用。让我们深入讨论一下,因为你非常有必要了解这个命令的功能,而有关该命令的文档少之又少。

在我们谈论Docker时,镜像是建立在多g N k ? U h ?层之上的,这些层W ` a b是Docker镜像的基础X ( ! f & Y , `。每个容器都包含一个可读/可写层的镜像(你可以-将其视为持久状态或文件)。在这之上才是其他只读层。这些层(也称为中间镜像)是在执行Docker镜像的build命令时,执行Dockerfile中的命令时生成的。

如果你的DocY b 8kerfile中包含from、run和/或copy指令,U 9 P G 6 o那么build该m ? i O / ~ [ =镜像时,run指令就会用自己的镜像ID创建一层。然后,该镜像/层就会显示在docker history中,而且还会显示镜像的ID以及生成日期。后续指令将生成另一个条目,依此类推。CREATED BY列大致对应于Dockerfile中的一行。如下图所示。

只要 8 个步骤,学会这个 Docker 命令终极教程!

'J M 7 sdocker history'命令的图示

$dockerimages

列出当7 H / e 4 R) & ^ :Q ? o :储在机器中的所有镜像。

$dockt  4erinspect<IMAGE|CONTAINERID>

Docker inspect将显示有关特定Docker对象的低级信息。在调试的情况下, 存储在该对象中的数据会非常有用M M b,例如交叉检查Docker挂载点

请注意:该命令获取两个主要响应:镜像级别的详细信息和容器级别的详细信息。你可以从该命令中获取如下信息:

  • 容器ID以及创建的时间戳

  • 当前状态(在尝试识别容器是否已停止以及为何停止时很有o G ` l p S用)

  • Docker镜像信息、文件系统绑定、卷信息以及挂载

  • 环境变量,例如传递给容器的命令行参数

  • 网络配置:IPv4和IPv6的IP地址以及网关和辅助地址

$dockerversion

这个命令显示Docker的版本,包括计算机上当前安装的客户端和服务W = * & M器版本。

没错,Docker是一个客户端-服务e z 9 ^ ( +器应用程序。守护程序(长期运行的( N U h sLinux后台服务)是服务器,CLI是众多客户端之一。Docker守护程序会公开一个REST API,许多不同的工具可以通过该API与该守护程序进行通信。

$dockerversion
Client:DockerEngine-Community
Versi8 E )on:19.03.5
APIversion:1.40
Go,  Q Bversion:go1.12.12
Gitcommit:633a0ea
Built:WedNov1307:22:342019
OS/Arch:darwina y t e C d d/amd64
Experimental:false
Server:DockerEngine-Communi, L m U + ` 9ty
Engine:
Version:19.03.5
APIversion:1.40(minimumversion1.12)
Goversion:go1.12.12
Gitcommit:633a0ea
Built:WedNov1307:29:192019
OS/Arch:W @ o M _ 2 Z ( 0linux/amd64
Experimental:false
containerd:
Version:v1.2.10
GitCommit:b34a5c8af56e510852c354 k y | p E s x 14db4c1f4fa6172339
runc:
Vd c Rersion:1.0.0-rc8+dev
GitCommit:3eg h v l p V425f80a8c931f88e6d94a8c831b9d5aa481M : h + # H $657
dockerE F S 1 K - = @-init:
Version:0., X ( # O C18.0
GitCommit:fec3683

Docker版本输出

只要 8 个步骤,学会这个 Docker 命令终极教程!

这是如何设置客户端-服务器体系0 x 1 1 a . a结构的图像

只要 8 个步骤,学会这个 Docker 命令终极教程!

AWS ECS上的Docker

有时,你需要进入运行中的Docker容器,调试或交叉检查配置是否正确。

你可以使用docker exec -it <container ID>A J = { y L _ w; /bin/bash来获取shell访问权限。如果你想找出无法运行的Docker镜像,例如你想使用AWS ECS集群,则会收到一则晦涩难懂的错误消息,如下所示。

坦白地说,引发这一错误的原因多种多样,例如

1)你的代码有问题,f e n * V引发了未捕获的异常,并且Docker容器在启动时宕机;` g ~ = n { = |

2)在使用EC2实例上的a 3 J 8 , l | %ECS群集时,出现了磁盘空间不足的情况,如果你的ECS的放置类型没有选择Fargate就会出现这种问题;

3)你现有的Docker容器占用了所有EC2x + } G I + D的可用内存。

Essentialcontainerin * * x # D A ! )ntaskexited

执行以下命令Y ! L Q p : ? _ %即可找~ E ( a 1 ? o 6 z出最近运行失败的Docker容器。如果你的账号拥有sudo访问权限,请忽略sudo。你可以使用该命令,根据给定的输出,通过重新运行容器来查看其失败的原因C J e S T E U *

$sudodockerps-a--filterstatus=dead--filterstatus=exited--last1

只要 8 个步骤,学会这个 Docker 命令终极教程!

如有疑虑,重启Docker服务

$sudoservicedockerstop
$sudoservicedockerstart
#onaMACyouanusethedockeru* M S ] ^ t ) ) ptiltyoo o 7 _ K | :ralternativelyrun
$killallDocker&&open/Applications/Docker.app

相信无需进一步的解释s ` y

只要 8 个步骤,学会这个 Docker 命令终极教程!

清理Docker镜像

$dockersystemprune

Docker在清理未使用的对象(例如镜像^ v & { p 9、容w 8 4 C器、卷和网络)方面采取了保守的态度。

除非你明确要求Docker删除,否则通常不会删除这些对象。因此,如果不删除这h . / B = z些对象,那么很快就会占用大量空间。因此,定期运行下述命令,清$ k ; # . e !理未使用的Docker镜像非常重要。

dockerkill<CONTAINER>

杀死某个正在运? f C b行的容N ( L M | s 9 L器。

$doc. j 2 8 + (kerkill$(dockerps-q)

杀死所有正在运行的容器。

$dockerrm<CONTAIN| & p z ; : = tER>

删除某个目前没有J i Z运行的容器。如果镜像保存在远程镜像库中,C 8 * P r k那么不会受到影响。

$docl ) # ?  5 ,kerrm$(dockerps-a-q):

删除所有没有运行的容器。

$dockerlogsmy_container

访问容器的日志,在调试时非常有用。

只要 8 个步骤,学会这个 Docker 命令终极教程!

从远程镜像库中提取Docker镜像

1、Docker Hub

Docker Hh . n d $ ^ Hub是Docker提供的一项服务,用于查找和共享打开的容器镜像。

如果你希望从Docker Hub将镜像拉取到本地,那么只需在Docker run命令后面加上镜像路径即可。以下命令说明了如何拉并运行稳定版本的Rocker镜像

$dockerrun--rm-p8787:8787rocker/verse

DockerJ s %首先会尝试检查本地计算机上是否有该镜像。如果没有,在从Docker Hub库中下载镜像,这个功能是开箱即用的。

$dockerpullrocker/verse

如果你只想拉取{ 6 B } a ! _ 6 t镜像,而不想运行镜像,则只需M A & K U [ G h运行docker pull即可。

如果你想登录Docker Hub,则可以运行上述命令,然后输入密码即可。

2、自定义 Docker 镜像库

$dockerloginyour.docker.host.com
Username:foo
Password:********
Email:user@myemail.coM 8 . C | 7 8 - !m

如果你想从某个需要身份验证的通用自定义Docker镜像E ~ ` P库提取镜像,则可以使用docker login命令,如上所示。请注意,执行上述操作时,会在~/.docker/ch , Qonfig.json

文件中创建一个条目。修改~/.docker/config.json可以修改身份验证详细信息。

3、亚马逊ECR

亚马逊ECRX T $ = , w(Amazon EE I { Llastic Container Registry)是一个完全托管的Docker容器仓库,允许开发人员存储、管理和= / = z a o部署Docker容器镜像。亚马逊ECR与ECS(Elastic Container Servic` P S % - # le)无缝协作。如果你需要从ECR提取镜像,则可以参照如下命令。

你需要使用拥有A$ I ,WS访问权限和密钥的IAM用户配置AWS CLI。

亚马逊ECR要求IAM用户访问秘钥必须通过某个IAM策$ h ] Q 9略赋予ecr:GetAuthorizatE 5 ` | N 9 -ionToken的权限,然后才能通过镜像库的验证并提取镜像。另外,你可以利用亚马逊ECR Docker Credential Helper实用程序。以下方法假定你使用的是AWS CLI,且已设置好所有权限。

$awsecrlist Q a S (-images--repository-name=twv D m z X Vitter-data-engine-core
$awse3 [ p 8cr5 q w _ I fdescribe-images—-repi 2 l dository-naC : =me=twitter-data-engine-core
$awst z i p / - Uecrget-login—-regionus-east-1—-no-include-email

Get-login命令会生成一个长的Docker登录命令。你只需复制并执行。当然首先2 v u必须先进行身份验证,然后才能尝试从AWS ECRX V p [ . + ]执行Docker镜像提取。

$dockerlogin-uAWS-p{YOUR_TEMPORARY_TOKEN}
$dockerpull723123| / L w ; L k }836077.dkr.ecr.us-east7 Q g ! # # & I w-1.amazonaws.com/twitter-data-engine-core:build-9

只要 8 个步骤,学会这个 Docker 命令终极教程!

导入和导出Docker镜像

$docr s % z x N c #kersaveyour_dockerp e  Y ! @ 5 P Q_image:latest>/usr/local/your_docker_image.tar
$dockerload</usr/local/your_docker_imB / B ~ r 6 fage.tar

如果你有需要,并且想将镜像导出到硬盘,并加载到Docker镜像,那Z k ` T & L { }么就可以执行上述命令。

如果你想通过另一种媒介(Docker镜像库之外),将Docker镜像从一台机器转移到另一台机器,那么导出到文件非常有用。由于安全性,在某些环境中你的访问可能会受到限制。你无法实施镜像库到镜像库的迁移,因此这是一个很实用的命令。

原文:https://medium.com/d @ X L s J W Cbetter-programming/the-ultimate-docker-commandP ] P X ` s e F L-list-d98ef300fe6d

只要 8 个步骤,学会这个 Docker 命令终极教程!

2020 AI开发者万P # E . # F人大会将于626日通过线上直播形式,让开发者们一站式学习了解当下0 [ % ] HAI的前沿技术研究、A d Z M 3核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅3 , 4 ~ 6 = T F #可以与上万名开发Q 0 4 F # !者们一起交流,还有机会赢取直播专属好礼,p ! 4 V与技术大咖连麦。

只要 8 个步骤,学会这个 Docker 命令终极教程!

今日福利~ L r d { m 4:评论区留言入选,都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。快来动动手指,- o | d I B - K W写下你想说的话吧

推荐阅读:医疗保健、零售、金融、制造业……一文带你看懂大数据对工_ 9 ) Z业领域的影响!
如何运行没有Root权限的Docker?干货来了!
数据分析师 vs 算法工程师,Python 出身的程序员如% x s P何抉择?
Kubernetes这么火你还不a N V S + x知道是啥?赶紧来看看吧~
如何开发日均吸引100万活跃用户的DApp?先收藏再看!
5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?
真香,朕在看了!