作者 | 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 - 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 镜像从一台机器转移到另一台机器, 那么导出到文件非常有用. 由于安全性, 在某些环境中你的访问可能会受到限制. 你无法实施镜像库到镜像库的迁移, 因此这是一个很实用的命令.
来源: http://www.tuicool.com/articles/IjUVzyy