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

作者 | Timothy Mugayi

译者 | 弯月 责编 | 徐威龙

封图| CSDN 下载于视觉中国

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 - CommunityVersion:           19.03.5API version:       1.40Go version:        go1.12.12Git commit:        633a0eaBuilt:             Wed Nov 13 07:22:34 2019OS/Arch:           darwin/amd64Experimental:      falseServer: Docker Engine - CommunityEngine:Version:          19.03.5API version:      1.40 (minimum version 1.12)Go version:       go1.12.12Git commit:       633a0eaBuilt:            Wed Nov 13 07:29:19 2019OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          v1.2.10GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339runc:Version:          1.0.0-rc8+devGitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657docker-init:Version:          0.18.0GitCommit:        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

2020 AI 开发者万人大会将于6月26日通过线上直播形式,让开发者们一站式学习了解当下 AI 的前沿技术研究、核心技术与应用以及企业案例的实践经验,同时还可以在线参加精彩多样的开发者沙龙与编程项目。参与前瞻系列活动、在线直播互动,不仅可以与上万名开发者们一起交流,还有机会赢取直播专属好礼,与技术大咖连麦。

今日福利:评论区留言入选,都可获得价值299元的「2020 AI开发者万人大会」在线直播门票一张。  快来动动手指,写下你想说的话吧

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优秀工程师必备的一项技能,你解锁了吗?

阿里妹导读&#xff1a;很多程序员在工作一段时间后会遇到迷茫期&#xff0c;虽有技术傍身&#xff0c;也难免会产生焦虑&#xff0c;反复思考怎样才能快速成长。关于如何提高自己的思考力&#xff0c;运用思考的力量推动能力提升&#xff0c;以此实现技术成长&#xff0c;阿里…

Springboot2.x +JPA 集成 Apache ShardingSphere 分表+读写分离

分库分表背景: 数据库性能瓶颈&#xff1a;主要分为按照业务来划分或者按照数据量来划分。 拆分方式&#xff1a; 水平拆分(每个表的结构都一样)&#xff1a;订单表数据量大&#xff0c;我们可以水平拆分 &#xff0c;分成order表1、order表2、order表3 。。。 垂直拆分&#x…

Java-方法重载

https://www.bilibili.com/video/BV12J41137hu?p47&spm_id_frompageDriver

Blink 有何特别之处?菜鸟供应链场景最佳实践

作者&#xff1a;晨笙、缘桥 菜鸟供应链业务链路长、节点多、实体多&#xff0c;使得技术团队在建设供应链实时数仓的过程中&#xff0c;面临着诸多挑战&#xff0c;如&#xff1a;如何实现实时变Key统计&#xff1f;如何实现实时超时统计&#xff1f;如何进行有效地资源优化&a…

为什么要在油气行业中应用 IoT?这 8 个应用场景告诉你 IoT 在油气行业中可以做什么...

作者 | Vova Shevchyk译者 | 风车云马 责编 | 徐威龙封图| CSDN 下载于视觉中国如今&#xff0c;物联网已经进入了各行各业&#xff1a;汽车、农业、绿色能源。物联网还将征服的领域之一是石油和天然气领域。在这些特殊的行业环境中&#xff0c;公司雇佣专业人员来预测机器何时…

Java-命令行传递参数

package method;public class Demo01 {public static void main(String[] args) {// args.length 数组长度for (int i 0; i < args.length; i) {System.out.println("args["i"]: "args[i]);}} }https://www.bilibili.com/video/BV12J41137hu?p48&…

Spark内置图像数据源初探

概述 在Apache Spark 2.4中引入了一个新的内置数据源, 图像数据源.用户可以通过DataFrame API加载指定目录的中图像文件,生成一个DataFrame对象.通过该DataFrame对象,用户可以对图像数据进行简单的处理,然后使用MLlib进行特定的训练和分类计算. 本文将介绍图像数据源的实现…

Java-可变参数

public class Demo04 {public static void main(String[] args) {// 调用可变参数的方法printMax(34, 3, 3, 2, 56.5);printMax(new double[]{1, 2,4, 3});}public static void printMax(double... numbers) {if (numbers.length 0){System.out.println("没有传递参数&qu…

生产环境使用HBase,你必须知道的最佳实践

来源 | 阿丸笔记封图| CSDN 下载于视觉中国前面&#xff0c;我们已经打下了很多关于HBase的理论基础&#xff0c;今天&#xff0c;我们主要聊聊在实际开发使用HBase中&#xff0c;需要关注的一些最佳实践经验。Schema设计七大原则1&#xff09;每个region的大小应该控制在10G到…

消息点击率翻倍的背后——闲鱼无侵入可扩展IFTTT系统

作者&#xff1a;闲鱼技术-剑辛 一、面临问题 在闲鱼生态里&#xff0c;用户之间会有很多种关系。其中大部分关系是由买家触发&#xff0c;联系到卖家&#xff0c;比如买家通过搜索、收藏、聊天等动作与卖家产生联系&#xff1b;另外一部分是平台与用户之间的关系。对这些关系…

2019阿里云618大促主会场全攻略

2019阿里云618大促活动已经于6月16日正式开启&#xff0c;从已开放的活动页面来看&#xff0c;整场大促活动由爆款拼团、满额最高返6000、上云接力赛分享集赞赢6.18万大奖三大活动组成。 在618这个年中的大幅度优惠促销日&#xff0c;怎样才能花最少的钱配置最特惠的云服务&am…

Redis-6.2.5 安装 Linux环境(单机)

文章目录1. 安装依赖环境2. 升级GCC3. 在线下载4. 解压5. 编译6. 安装7. 前台启动8. 后台启动9. 配置开机启动10. 常用命令11. 评析1. 安装依赖环境 yum install -y gcc-c autoconf automaker2. 升级GCC 这里说明一下&#xff0c;在编译之前&#xff1a;在编译之前需要升级gcc…

Java-递归

public class Demo05 {public static void main(String[] args) {System.out.println(f(5));}// 5! 5*4*3*2*1 阶乘public static int f(int n){if (n1){return 1;} else {return n*f(n-1);}} }递归特别消耗资源&#xff0c;如果嵌套太多层就不建议使用了 https://www.bilibi…

为什么说优秀架构师往往是一个悲观主义者?

阿里妹导读&#xff1a;18年前&#xff0c;200家企业由于在事故中信息系统遭到严重破坏而永远地关闭了。这样的事故引发了后人深思&#xff0c;对于工程师而言&#xff0c;不仅要求设计的系统足够强壮&#xff0c;还需要具备考虑失败的能力&#xff0c;当失败场景悉数被考虑周全…

石锤!今年Python要过苦日子了? 程序员:我疯了!

Python的好日子到头了&#xff1f;Python终于要回归现实了&#xff1f;所有程序员&#xff0c;刚刚一份报告把Python的真相撕开了&#xff01;不信你看&#xff1a;Python今年要跑路&#xff1f;三份报告炸出真相....「人生苦短&#xff0c;钱多事少&#xff0c;快用Python」&a…

安装 kivy

系统&#xff1a;Windows10 64位 python 3.7.6 最好管理员身份打开 命令行窗口pip安装 kivy 依赖 ——在 windows 命令行中&#xff0c;执行以下命令 pip3 install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew -i http://pypi.douban.com/simple --trusted-h…

Java-数组的声明与创建

public class ArrayDemo01 {// 变量的类型 变量的名字 变量的值&#xff1b;public static void main(String[] args) {// 数组定义方式有两种&#xff0c;但是推荐第一个int[] nums; // 1. 声明一个数组 // int nums1[];nums new int[10]; // 2. 创建一个数组// …

云上快速搭建Serverless AI实验室

Serverless Kubernetes和ACK虚拟节点都已基于ECI提供GPU容器实例功能&#xff0c;让用户在云上低成本快速搭建serverless AI实验室&#xff0c;用户无需维护服务器和GPU基础运行环境&#xff0c;极大降低AI平台运维的负担&#xff0c;显著提升整体计算效率。 如何使用GPU容器实…

十分钟上手 ES 2020 新特性

作者 | 浪里行舟责编 | 郭芮ES2020 是 ECMAScript 对应 2020 年的版本。这个版本不像 ES6 (ES2015)那样包含大量新特性。但也添加了许多有趣且有用的特性。本文的代码地址&#xff1a;https://github.com/ljianshu/Blog本文以简单的代码示例来介绍 ES2020新特性。这样&#xff…