容器和镜像就像面向对象程序设计中的实例和类一样
镜像是一种静态的定义,容器是镜像运行时的实体
可以将容器看作是一个将应用程序和其所依赖的环境打包而成的集装箱
容器本质上是进程,与直接在主机上执行的进程不同的是容器进程运行在属于自己的独立的名称空间内,因此容器可以拥有自己的跟文件系统、自己的配置网络、自己的进程空间、自己的用户ID空间
通常容器之间彼此隔离、互不可见,可以使由容器封装的应用程序比直接在主机上运行的应用程序更加安全
容器的基本信息和标识
显示当前运行的容器
docker ps

IMAGE:显示容器所用的镜像的名称
COMMAND:显示容器启动时运行的命令
STATUS:容器运行的状态(UP表示运行中,EXITED表示停止)
PORTS:容器对外暴露的端口号
标识容器的方法
注意前面所说的三种方法是标识镜像的方法
1.容器ID
显示完整的容器ID,通常采取前十二个字符就行
docker ps --no-trunc
2.容器名称
容器名称默认是docker自动生成的一个随机名称,定义一个有意义的容器名称可以更方便地辨识容器
docker rename 容器ID 新名字
容器的可写层
一个镜像由多个可读的镜像层组成,运行的容器会在这个镜像的上面多加一个可写的容器层,所有写入容器的数据都保存在这个可写层,当容器被删除时,可写层也会被删除,底层的镜像层保持不变,因此任何对容器的操作都不会影响到镜像
每个容器都有自己的可写层,多个容器可以共享访问同一个底层镜像
如果需要多个镜像共享访问完全相同的数据,则应将此数据存储在docker卷中并将其挂载到容器中
docker使用存储驱动来管理镜像层和容器层的内容,每个存储区驱动的实现都是不同的,但所有驱动使用可堆叠的镜像层和写时拷贝策略
磁盘上的容器大小
查看一个运行中的容器大小
docker ps -s

第一个值表示每个容器的可写层当前所用的数据大小,第二个值是虚拟大小值,是该容器所用的只读镜像的数据小大加上容器可写层大小的和
多个容器可以共享一部分或者所有的只读镜像大小,从同一镜像启动的两个容器共享百分之八百的只读数据,从拥有公共镜像层的不同镜像启动会共享那些公共镜像层
如果多个容器从完全相同的镜像启动,这些容器的总磁盘量是容器大小的总和加上一个镜像的大小
容器还可以通过以下方式占据 磁盘空间:
1.用于日志文件的磁盘空间
2.用于容器的卷和绑定挂载
3.用于容器配置文件的磁盘空间
4.写入磁盘的内存空间
5.检查点
写时拷贝策略
CoW
共享有助于减少镜像大小
从镜像源获取镜像时,每个层都是独立拉取的,并保存在docker主机本地存储区域中各自的目录中。这些镜像如果存在公共的镜像层,则可以彼此共享,从而避免重复存储,减少镜像大小
复制使容器效率更高
启动一个容器,docker只需要创建很小的可写容器层
如果docker在每次启动一个新容器时都必须制作底层镜像栈的整个副本,则容器启动时间和用的磁盘空间都将显著增加,这与虚拟机的工作方式类似
容器操作命令
前面学的是镜像的操作命令
docker新版本提供的统一的容器管理命令
docker container COMMAND
与前面所说的镜像的操作命令相同,与传统的容器操作命令相对应,人员docker container run对应docker run......个别不同是docker container ls对应docker ps,docker container prune没有对应的docker命令
创建和运行容器
基于一个镜像可以创建多个容器,创建容器就是将镜像放入容器中
docker create:创建的容器处于未运行状态
docker run:创建的容器处于运行状态 在第一次运行时相当于执行了两步操作:1.创建一个容器
2.启动新创建的容器(相当于执行docker start)
一旦在本地创建了某容器,执行docker run就不会重复创建容器,而是直接启动该容器
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
通过IMAGE指定容器所用的镜像,IMAGE[:TAG]指定镜像版本,镜像名称还可以使用IMAGE[:DIGEST]格式

以分离模式在后台运行容器
-d/--detach,以守护进程(服务)的形式在后台运行,与终端无关,只有调用docker kill,docker stop才能使容器停止

1:由于本地主机原本没有myweb,所以要先pull,再启动
如果不用--name指定容器的名称,那么docker会自动生成一个名称
2:容器启动后在后台运行,并返回一个唯一的容器ID,可以发现与3处的id相同
3:证明确实运行了myweb
4:由于在后台运行,容器的输出不会显示在主机上,所以使用docker logs获取容器的输出信息
5:使容器停止并验证容器确实没有在运行
以前台模式运行容器
默认方式 以这种模式运行容器,docker run可以在容器中启动进程,并将控制台连接到这些进程的标准输入、标准输入和标准错误
启动容器执行指定的命令后自动终止容器

与在本地直接执行命令差不多
将容器ID写入文件
--cidfile指定一个目的文件
容器的PID设置
PID:进程ID
--pid='container:<name|id>':加入另一个容器的PID名称空间
--pid='host':在容器中使用主机PID名称空间
某些情况下需要容器共享主机的进程名称空间,基本上允许容器中的进程可以看到系统上的所有进程
1018

被折叠的 条评论
为什么被折叠?



