惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
Cloudbric
Cloudbric
The Last Watchdog
The Last Watchdog
L
LINUX DO - 热门话题
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Security Archives - TechRepublic
Security Archives - TechRepublic
TaoSecurity Blog
TaoSecurity Blog
V2EX - 技术
V2EX - 技术
H
Heimdal Security Blog
S
Security Affairs
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Simon Willison's Weblog
Simon Willison's Weblog
WordPress大学
WordPress大学
小众软件
小众软件
Security Latest
Security Latest
AWS News Blog
AWS News Blog
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
F
Full Disclosure
S
Schneier on Security
L
LangChain Blog
MyScale Blog
MyScale Blog
Know Your Adversary
Know Your Adversary
P
Privacy International News Feed
Google Online Security Blog
Google Online Security Blog
Scott Helme
Scott Helme
Stack Overflow Blog
Stack Overflow Blog
爱范儿
爱范儿
A
Arctic Wolf
Martin Fowler
Martin Fowler
B
Blog RSS Feed
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
The Register - Security
The Register - Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
Latest news
Latest news
F
Fortinet All Blogs
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
Hacker News: Ask HN
Hacker News: Ask HN

Posts on Changkun's Blog

Why High-Output Systems Are Often the First to Stop Growing Dark Forest Theory: A Formal Derivation Agents (or Humans) in Goal-Directed and Goalless Environments: On Pipelines, Priors, and the Rhythm Between Exploration and Exploitation At the Boundary of Self-Reference: From Stable Structures in Artificial Intelligence to the Self as a Recursive Model in an Open Dissipative System 2023 Reading List 2022 Reading List 2021 Reading List Are PSS/USS and RSS Actually the Same Thing? Performance Differences from Page Faults vs. Prefetching 2020 Year-End Review Migration with Zero Downtime 2020 Reading List The All in Go Stack Pointers Might Not Be Ideal for Parameters Eliminating A Source of Measurement Errors in Benchmarks Setup Wordpress in 10 Minutes 我为什么不再写博客了? 2019 年终总结 2018-2019 读书清单 Ten years of blogging Rethinking the Reflections on Communications and Trusts 2018 年终总结 Go source code study is open source Go source study: unsafe Pattern Go source study: sync.Pool Go runtime programming A Million WebSocket and Go Designing Asynchronous RESTful APIs 分布式杂谈01:CAP 理论的误解 Issues of Human-Bot Interaction 压缩法与深度网络的泛化性 Go in 1 Hour UMSLT04: The Past and Present of SGD UMSLT03: A Gentle Start of Learning Theory UMSLT02: A Breif History of Neural Networks UMSLT01: A Breif History of Regularization 不笑不足以为道 论文笔记:Generalization in Deep Learning 2017 年终总结 2017 读书清单 深度学习的泛化理论简介 删除 GitHub 上已经提交的敏感信息 硕士生涯的第一年就这样告一段落了 人肉计算(10): 系统参与激励 人肉计算(9): 陷阱的解法 别聊,一聊你就暴露 人肉计算(8): 人肉计算与数据科学中的陷阱 人肉计算(7): 社会行为分析 Hexo + GitHub + Travis CI + VPS 自动部署 人肉计算(6): 预测市场 人肉计算(5): 信用风险评级模型 读书与回报 瞎扯: 对现代企业理论与当下IT企业的商业模式和信息产业链的规律性的思考 人肉计算(4): 输入数据聚合与PageRank 又一次打整了一下博客 人肉计算(3): 输入数据聚合与链路预测 人肉计算(2): 意图博弈 GWAPs 人肉计算(1): 众包与群众智慧 对后辈同学在计算机专业上的答疑与解惑 在德国的医疗及住院体验 这可能不是一个技术博客了 实验楼楼赛第3期-Python-题解 迅速更换了 DISQUS Electron 深度实践总结 良好的编码体验的三个方面 2016 年终总结 2016 读书清单 最近在着手写的文章 微信小程序文档极致总结 谈谈过去三个月在实验楼的实习经历 Built a Desktop Client for My Blog Guacamole 源码分析与 VNC 中 RFB 协议的坑 《高速上手 C++11/14》正式发布 Docker 极速入门教程01 - 基本概念和操作 阶段性沉默 ELK+Redis 最佳实践 终于全面启用了 HTTPS 苹果开源了LZFSE无损压缩 Hash 碰撞的一种思路 记一次完整的 Kaldi-TIMIT 示例运行 Kaldi 上的 TIMIT 例子 Kaldi 安装与部署 从科研写作谈起 Swift API 设计指南 有趣的人类 所以其实论文并没有什么鬼用 Githug 通关记录及指南 小结一下这学期的收获 2015 读书清单 2015 年终总结 负能量爆表 转眼就快两个月了 博客迁移记录 大三总结 这个世界,终究不会是我们的。 Linux 内核分析 之六:Linux 内核创建进程的过程 小说「泽缘」 Linux 内核分析 之五:system_call中断处理过程的简要分析 大创项目的标题真是每年都在考验同学们的想象力啊 Linux 内核分析 之四:使用库函数API和嵌入汇编两种方式使用同一个系统调用
Docker 极速入门教程02 - 镜像与容器管理
Changkun Ou · 2016-08-08 · via Posts on Changkun's Blog

Published at发布于:   |   PV/UV: /   |   Reading阅读: 2 min

这次我们来深入了解一下镜像和容器的管理,不过作为入门教程,我们只打算谈及一些常用的命令,而不去介绍 Docker 的深入原理,具体内容我们放到另一个系列中去探讨。

Docker 极速入门教程系列 (往期)

镜像管理

镜像是容器的一个只读模板,用于创建容器。当容器运行时,需要指定其镜像,当镜像不存在时,就会从 Docker Registry 自动下载。每次创建新的镜像,都会在原镜像上方增加一层,具体的原理在本教程里面不深入讨论,可以在本文后面的深入阅读中查看相关文章。

每一个镜像对应了一个唯一的 ID,同样的,镜像中的每一层也都具有一个唯一的 ID,因此,当从 Docker Hub 中 pull 镜像时也是分层进行下载的。

上一篇文章中,我们已经提到了一些基本的镜像管理命令:

  1. docker search: 搜索Docker Hub镜像
  2. docker pull: 拉取镜像
  3. docker images: 查看本地镜像
  4. docker inspect: 查看镜像详情
  5. docker rmi: 删除镜像

再来看一些其他的常用命令。

docker commitdocker diff

当我们启动运行一个容器以后,自然会对一个容器进行相关操作,例如安装一些软件或依赖等等。这时,运行后的容器相较于镜像本身提供的环境就发生了变化。这时,可以使用 docker commit 来提交容器的修改,保存到镜像中。

警告: 生产环境下, 这种方式产生的 Docker 镜像会变得难以维护,不推荐使用。

在操作完成后,可以使用 docker diff 来查看修改历史,最后,使用 docker commit 保存为一个新的镜像:

其中,-m 指定了此次 commit 的描述信息,-a 指定了镜像的作者,-p 使在 commit 时暂停容器的运行,前一个 changkun 表示容器的名字,第二个 changkun 表示保存后的镜像的名字。

docker savedocker load

当我们使用 Dockerfile 构建好一个镜像后,可以将镜像从本地导出,然后在其他机器上导入并运行:

1
2
$ docker save changkun > changkun.tar
$ docker load -i changkun.tar # -i 表示从 tar 文件中读取

容器管理

上一篇文章中已经使用过一些基本的容器管理命令了:

  1. docker run -it: 运行一个带有交互式 shell 的 tty
  2. docker attach: 再次连接到运行的 bash
  3. docker ps: 查看容器列表
  4. docker top: 查看容器中运行进程的信息
  5. docker inspect: 查看容器的细节信息, 如 IP 地址、端口映射等。
  6. docker start: 启动一个容器
  7. docker stop: 停止运行状态的容器
  8. docker restart: 重启运行状态的容器

其中,docker inspect 命令输出的信息以 JSON 为格式,可以通过 -f 指定输出项目,例如:

  • docker stats 可以查看运行容器的 CPU、内存及网络使用情况,这位我们监控 Docker 的状态提供了服务,类似于 top,其内容为会实时进行刷新,可以使用 Ctrl+C 退出。
  • docker logs 则可以查看容器中输出的信息:

深入 docker run

docker run 是创建容器的核心命令,提供了非常多的参数供我们使用。docker run 在创建容器时,会首先从本地查找需要的镜像,如果本地没有则会从 DockerHub 上下载,当确保本地有需要的镜像时,才会创建容器。创建容器后,会给容器分配其自身的文件系统、虚拟网络(如网桥、接口、IP 地址等等),而容器中的 DNS 会默认加载宿主机的配置(/etc/hosts/etc/resolve.conf)。完成整个创建过程后,就会执行包含在 docker run 命令中的命令,完成执行后,容器就会停止。

注意: 每一次执行 docker run 都会创建一个容器,不同的容器之间是彼此隔离的,也就是说,不同容器相当于不同的主机。当容器停止运行后,可以使用 docker start 重新启动这个容器,然后使用 docker attach 重新进入这个容器。

docker run 的一些常用参数:

  1. --name 指定一个容器的名字,若不指定名字,Docker 会为容器随机生成一个名字;
  2. --hostname 指定容器的主机名;
  3. --mac-address 设置网络信息,这个参数用于设置容器的 MAC 地址;
  4. --ulimit nproc= 设置资源限制,设置容器中最大的线程数,包括 soft 和 hard 两个限制值,例如 --ulimit nproc=1024:2048

比如,我们可以通过这样的方式创建一个容器:

1
docker run --name changkun --hostname changkun --mac-address 92:d0:c6:0a:29:33 --ulimit nproc=1024:2048 -it ubuntu /bin/bash

容器创建好后,ulimit 命令不能够查看到容器本身对最大线程的限制情况,但可以通过 docker inspect 来查看具体的信息:

有时候,我们创建一个 Docker 容器会希望让容器在后台运行,而不影响当前的操作,这时候 -d 参数可以让一个容器创建后在后台执行需要执行的命令:

Docker 容器的状态与进程状态类似,一个容器具有运行、停止、挂起三个状态。上一篇文章中,我们已经了解过 docker start/stop/restart/ 这三个基本的命令了,它能够处理容器在运行和停止两个状态之间的切换,有时候我们可能不需要容器继续使用 CPU 资源,就可以将一个容器挂起,使用 docker pause/uppause 这一组命令。

而当容器出现不可描述的异常时,以上这些命令可能都无法去改变一个容器的状态,这时候就可以祭出杀技:docker kill

容器和镜像一样,同样也具有导入和导出的功能。这时候我们就可以使用 docker export/import。与镜像不同的地方在于,有时候我们可能会将一个容器直接进行导出,当再次被导入时,这个容器就会成为一个镜像,就如同我们进行了一次 docker commit

延伸阅读