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

推荐订阅源

U
Unit 42
P
Proofpoint News Feed
The Last Watchdog
The Last Watchdog
S
Secure Thoughts
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News | PayPal Newsroom
Application and Cybersecurity Blog
Application and Cybersecurity Blog
O
OpenAI News
S
Security @ Cisco Blogs
宝玉的分享
宝玉的分享
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
TaoSecurity Blog
TaoSecurity Blog
Help Net Security
Help Net Security
Latest news
Latest news
NISL@THU
NISL@THU
S
Security Affairs
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 聂微东
AI
AI
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
P
Privacy & Cybersecurity Law Blog
小众软件
小众软件
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
博客园 - 司徒正美
AWS News Blog
AWS News Blog
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
I
InfoQ
Schneier on Security
Schneier on Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
The Exploit Database - CXSecurity.com
IT之家
IT之家
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
腾讯CDC
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
L
LINUX DO - 最新话题
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
H
Heimdal Security Blog
S
SegmentFault 最新的问题

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

延伸阅读