14

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

 4 years ago
source link: https://blog.csdn.net/FL63Zv9Zou86950w/article/details/105085240
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

NjAbma3.jpg!web

fURzAjQ.jpg!web

作者 |   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将生成以下帮助文档。

26JR3eE.jpg!web

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

U7fERvQ.jpg!web

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或容器名称。

QBZRJj2.jpg!web

运行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镜像,\表示换行符。  

uYjmYvA.jpg!web

调试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中的一行。如下图所示。

QrUVRfm.jpg!web

'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版本输出

fUBRz27.jpg!web

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

j2YfIjv.jpg!web

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

YJzu2eN.jpg!web

如有疑虑,重启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

相信无需进一步的解释。

N3IBZbR.jpg!web

清理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 

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

QNvYZfr.jpg!web

从远程镜像库中提取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: [email protected]

如果你想从某个需要身份验证的通用自定义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

aaEFjqz.jpg!web

导入和导出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

nayQVbv.jpg!web

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

YVJbArn.jpg!web

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK