带你了解docker是什么----基础原理篇(二)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Docker
前言
上一篇较为详细地介绍了docker的构架和其中有关镜像方面的核心原理。在这一篇就大致介绍一下docker中有关容器部分以及docker之间的网络构建与存储的机制。
docker 容器
下图是常用命令之间的联系
在我看来这个容器就类似我们的一个软件。镜像类似与为这个软件配置好了软件正常运行的环境配置。当我们使用commit将改变之后的容器环境再次保存为镜像。
为了使得这个软件在容器中运行的时候像在一个独立的电脑中该电脑中只有这一个软件环境也是为了这个软件运行而配置的。这就需要其中一些机制来处理。实际中容器在docker host 上就是一个进程
容器的常用命令
- create 创建容器
- run 运行容器
- pause 暂停容器
- unpause取消暂停继续运行容器
- stop发送 sigterm 停止容器本质是向该进程发送信号。如果一个容器有多个进程想快速停止应该使用kill命令
- kill发送sigkill 快速停止容器
- start启动容器
- restart重启容器。其作用是依次执行 stop和start 命令
- attach attach 到容器启动进程的终端
- exec在容器中启动新进程通常使用
-it
参数 - logs显示容器启动进程的控制台输出用
-f
持续打印 - rm从磁盘中删除容器。其一次可以指定多个容器。如果希望批量删除所有已经退出的容器可以执行该命令
docker rm -v $(docker ps -ap -f status=exited)
容器运行
- 使用的是run命令
- 让容器长期运行因为容器的生命周期依赖于启动时执行的命令只要该命令不结束则容器就不会退出。因此就可以在run 命令后边执行一个长期运行的命令来保持容器的运行状态。如
docker run -d Ubuntu /bin/bash -c "while true ;do sleep 1;done"
其中的 -d 参数是以后台方式启动容器 - 在运行之后docker 会返回一串字符它就是容器的长ID
- 通过
docker ps
可以查看容器(运行中的。使用docker ps -a
则会显示所有状态的容器。如下图
其中 第一列是容器的“短ID”短ID是长ID的前12个字符。
指定容器的三种方式
- 短ID
- 长ID
- 容器名称。可通过 --name 为容器命名。重命名容器可执行
docker rename
进入容器的方法
我们经常需要进到容器里去做一些工作比如查看日志、调试、启动其他进程等。有两种方法进入容器attach和exec
以下为使用两种方式的例子
attach 与exec主要区别如下
- attach 直接进入容器启动命令的终端不会启动新的进程
- exec则是在容器中打开新的终端并且可以启动新的进程。
- 如果想直接在终端中查看启动命令的输出用attach;其他情况使用exec
实现容器的底层技术
cgroup和namespace 是最重要的两种技术。cgroup实现资源限额namespace 实现资源隔离。
- cgroup全称Control Group。Linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。
- namespace。在每个容器中我们都可以看到文件系统、网卡等资源这些资源看上去是容器自己的。拿网卡来说每个容器都会认为自己有一块独立的网卡即使host上只有一块物理网卡。这种方式非常好它使得容器更像一个独立的计算机。
Linux实现这种方式的技术是namespace。namespace管理着host中全局唯一的资源并可以让每个容器都觉得只有自己在使用它。换句话说namespace实现了容器间资源的隔离。
Linux使用了6种namespace分别对应6种资源Mount、UTS、IPC、PID、Network和User。如下图
docker存储
- Docker为容器提供了两种存储资源数据层和Data Volume。
- 数据层包括镜像层和容器层由storage driver管理。
- Data Volume有两种类型bind mount和docker managed volume。
- bind mount可实现容器与host之间、容器与容器之间共享数据。
- volume container是一种具有更好移植性的容器间数据共享方案特别是data-packed volume container。