百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-09-03 11:05 3 浏览

叮咚~你被福利砸中了!现在起,「2020 AI开发者万人大会」299门票免费送!进入报名页面【2020 AI 开发者万人大会(线上直播门票)-IT培训直播-CSDN学院】,点击“立即报名”,结算时使用优惠码“AIP1410”,价格就会变为“0"元!

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构建


nbsp;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容器


nbsp;docker start <CONTAINER>

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

nbsp;docker stop <CONTAINER>

停止正在运行的Docker容器。

nbsp;docker stop $(docker container ls -aq)

如果你有多个正在运行的Docker容器,而且你想停止所有容器,那么可以输入docker stop以及所有容器ID的列表。

nbsp;docker exec -ti <CONTAINER> [COMMAND] 

在某个特定的容器内运行一个shell命令。

nbsp;docker run -ti — image <IMAGE> <CONTAINER> [COMMAND]

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

nbsp;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。

nbsp;docker pause <CONTAINER>

暂停某个特定容器内所有正在运行的进程。

nbsp;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获取当前正在运行的容器名称。

nbsp;docker history <IMAGE>example usage:nbsp;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'命令的图示


nbsp;docker images

列出当前存储在机器中的所有镜像。

nbsp;docker inspect <IMAGE|CONTAINER ID>

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

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

  • 容器ID以及创建的时间戳
  • 当前状态(在尝试识别容器是否已停止以及为何停止时很有用)
  • Docker镜像信息、文件系统绑定、卷信息以及挂载
  • 环境变量,例如传递给容器的命令行参数
  • 网络配置:IPv4和IPv6的IP地址以及网关和辅助地址
nbsp;docker version 

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

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

nbsp;docker versionClient: 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:      falseServer: 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。你可以使用该命令,根据给定的输出,通过重新运行容器来查看其失败的原因。

nbsp;sudo docker ps -a --filter status=dead --filter status=exited --last 1


如有疑虑,重启Docker服务


nbsp;sudo service docker stop
nbsp;sudo service docker start
# on a MAC you an use the docker utilty or alternatively run
nbsp;killall Docker && open /Applications/Docker.app

相信无需进一步的解释。

清理Docker镜像

nbsp;docker system prune

Docker在清理未使用的对象(例如镜像、容器、卷和网络)方面采取了保守的态度。

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

docker kill <CONTAINER>

杀死某个正在运行的容器。

nbsp;docker kill $(docker ps -q)

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

nbsp;docker rm <CONTAINER> 

删除某个目前没有运行的容器。如果镜像保存在远程镜像库中,那么不会受到影响。

nbsp;docker rm $(docker ps -a -q): 

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

nbsp;docker logs my_container 

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


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


1、Docker Hub

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

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

nbsp;docker run --rm -p 8787:8787 rocker/verse 

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

nbsp;docker pull rocker/verse 

如果你只想拉取镜像,而不想运行镜像,则只需运行docker pull即可。

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

2、自定义 Docker 镜像库

nbsp;docker login your.docker.host.comUsername: fooPassword: ********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,且已设置好所有权限。

nbsp;aws ecr list-images --repository-name=twitter-data-engine-core
nbsp;aws ecr describe-images —- repository-name=twitter-data-engine-core
nbsp;aws ecr get-login —- region us-east-1 —- no-include-email 

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

nbsp;docker login -u AWS -p {YOUR_TEMPORARY_TOKEN}
nbsp;docker pull 723123836077.dkr.ecr.us-east-1.amazonaws.com/twitter-data-engine-core:build-9


导入和导出Docker镜像


nbsp;docker save your_docker_image:latest > /usr/local/your_docker_image.tar
nbsp;docker load < /usr/local/your_docker_image.tar 

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

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

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...