自己学Docker:4.開始了解Docker的工作模式

上一章在学习中有2个疑问:

  1. 怎样保存我们在容器里的改动?
  2. 假设apt-get假设不能安装时,怎样在Docker中安装软件?

关于run创建的容器问题

对于第一个问题。原来每次运行(当非root用户时,须要在命令前加sudo)

sudo docker run -i -t docker/whalesay /bin/bash

都会创建一个新的容器,这一点应该是明白的。

可是退出时,创建的容器并没有被删除,还是存在与系统中的。通过,

sudo docker ps -a

能够查看。

列表中。第一列CONTAINER ID 就是镜像的ID,上表中第一个也就是id为7409de9e92f0就是我上一篇中创建的安装了vim的容器。

IMAGE就是创建该容器使用的镜像。

COMMAND 是镜像最后运行的动作。

CREATED 是创建时间。

STATUS是容器当前状态。

PORTS

NAMES是为容器取得唯一的名称。

这个那么默认是docker在运行run创建容器是命名的。假设我们想指定名称须要使用name选项,

sudo docker run -i -t --name test docker/whalesay /bin/bash

这样创建的容器名称就是test。

就像上面的id为cc8a23b1d624的容器。

当我们再次创建名称为test容器时就会出异常。

这也说明。docker容器的名称要是唯一的。

可是上面的提示信息提示在创建名称为test的容器时,与id为“cc8a23b1d624a63ec2147b7f1a6f965852df4a20e3ca1f50bbb08d3dabaccf0b”容器冲突。

这个id却不是ps -a列出来的test的id的cc8a23b1d624。

那么这个长id是哪里来的。

这就涉及到docker run命令创建的容器在本地怎样保存了。

默认docker创建的容器都保存早文件夹:

/var/lib/docker/

查看这个文件夹须要权限,所以我们可能须要切换到root用户下。

这里就能够看到上面的id”cc8a23b1d624a63ec2147b7f1a6f965852df4a20e3ca1f50bbb08d3dabaccf0b”了。这也是docker创建容器保存的地方。

进去看下。相应的文件夹下保存在该容器的描写叙述文件。

通过,

sudo docker inspect ID

能够查看容器配置具体信息,

此时,会返回一个json格式的信息。

简说Docker工作模式

为什么会产生这些文件,这就要涉及到docker的工作模式。

Docker在创建容器时。Docker这时会载入我们指定的仅仅读镜像。并在其上加入一个读写层(即将镜像文件夹复制一份到/var/lib/docker/aufs/mnt以ID为文件夹下,这个id就是我们上面看到的长id。这时假设我们使用chroot进入此文件夹,会发现其文件夹结构与容器里面的文件夹一样)。

假设运行中的容器改动现有的一个已经存在的文件,那该文件将会从读写层以下的仅仅读层拷贝到读写层,该文件的仅仅读版本号仍然存在,仅仅是已经被读写层中的该文件的副本所隐藏。当删除docker容器。并通过该镜像又一次启动时,之前的更改将会丢失。

这也就是为什么,当我们已run再次启动容器时,之前的改动都没了的原因。

进入之前创建的容器

既然我们创建的容器被已可写的方式保存了下来,我们应该是能够再次进入的。

上面我们已经知道怎样列出创建过得容器。就像我们上一篇安装了vim的容器id–7409de9e92f0。

容器的id知道了,如今该想办法再次进入这个容器了。之前我们已经退出了容器。要想再次进入首先就要再次启动它。

sudo docker start ID/NAME

后面指定id-7409de9e92f0,或者name-pensive_darwin。

能够看到。id为7409de9e92f0的容器状态变成启动了“Up 3 seconds”。

然后我们就能够进入该的容器了,

sudo docker attach ID/NAME

这里能够看到,我们进入了id为7409de9e92f0的容器,相同。通过dpkg命令能够看到,我们上次安装的vim也是存在的。

这次就先到这里,尽管没有全然解决之前的两个问题。可是对Docker的理解有深入了一点,相信问题总会解决的。

时间: 2024-11-05 12:30:37

自己学Docker:4.開始了解Docker的工作模式的相关文章

送给刚刚開始学cocos2d-x引擎 移植Android的同学

刚刚開始学cocos2-x,不过依照教程把已经安了一般Android的开发环境的eclipse又一次升级到安装好cdt和ndk就花了我几十小时,差点都要放弃了. 參考博客 http://blog.csdn.net/b1boy/article/details/14645277 说说大概的过程: 下载ndk插件,ndk包,cdt插件.最開始我依照书上的下载了cocos2d-x 2.0.1,希望跟书上统一起来,这样以后学习的时候能够參考书上的也不会遇到太多问题.下好了之后就遇到了问题,我的电脑上仅仅有

《PHP 5.5从零開始学(视频教学版)》内容简单介绍、文件夹

<PHP 5.5从零開始学(视频教学版)>当当网购买地址: http://product.dangdang.com/23586810.html <PHP 5.5从零開始学(视频教学版)>源码.教学视频下载地址: http://pan.baidu.com/s/1zt9hW 内 容 简 介 本书循序渐进地介绍了PHP 5.5开发动态站点的主要知识和技能,提供了大量的PHP应用实例供读者实践.每一章节都清晰讲述了代码作用及其编写思路,使读者能在最短时间内迅速掌握PHP的应用开发技能. 全

从零開始学Swift之Hello World进化版

上节课,也就是昨晚啦,我们学习到从零開始学Swift之Hello World.那一节仅仅有一句代码,大家会认为不够过瘾. 那么这节课,就给大家来多点瘾货吧! 先上图! //var 代表变量的类型, start 代表变量的名称. "Hello" 代表变量的值. var start = "Hello" var dot = " , " var end = "world!" // let 是什么意思呢? let total = sta

第13章、布局Layouts之RelativeLayout相对布局(从零開始学Android)

RelativeLayout相对布局 RelativeLayout是一种相对布局,控件的位置是依照相对位置来计算的,后一个控件在什么位置依赖于前一个控件的基本位置,是布局最经常使用,也是最灵活的一种布局. 我们以下通过XML布局和Java代码布局两种方式分别举例: 一.XML方式布局 1.创建一个空白Activity 2.打开"res/layout/activity_main.xml"文件,改动成下面代码. (1)第①部分 <?xml version="1.0"

从零開始学Java之线程具体解释(1):原理、创建

Java线程:概念与原理 一.操作系统中线程和进程的概念 如今的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中执行的应用程序.每一个进程都有自己独立的一块内存空间.一个进程中能够启动多个线程. 比方在Windows系统中.一个执行的exe就是一个进程. 线程是指进程中的一个执行流程.一个进程中能够执行多个线程.比方java.exe进程中能够执行非常多线程. 线程总是属于某个进程,进程中的多个线程共享进程的内存. "同一时候"运行是人的感觉,在线程之间实际上

从零開始学android&amp;lt;mediaplayer自带播放器(视频播放).四十九.&amp;gt;

MediaPlayer除了能够对音频播放之外,也能够对视频进行播放,可是假设要播放视频仅仅依靠MediaPlayer还是不够的.还须要编写一个能够用于视频显示的空间,而这块显示空间要求能够高速的进行GUI的更新,并且能够在渲染代码时进行无堵塞的的对GUI进行渲染,而假设要完毕此种功能,则必须依靠android.view.SurfaceView组件完毕.SurfaceView组件封装了一个Surface对象,而不是一个Canvas对象,使用Surface能够完毕对后台线程的控制,对于像视频.3D图

自己学Docker:4.开始了解Docker的工作模式

上一章在学习中有2个疑问: 如何保存我们在容器里的修改? 如果apt-get如果不能安装时,如何在Docker中安装软件? 关于run创建的容器问题 对于第一个问题,原来每次执行(当非root用户时,需要在命令前加sudo) sudo docker run -i -t docker/whalesay /bin/bash 都会创建一个新的容器,这一点应该是明确的.但是退出时,创建的容器并没有被删除,还是存在与系统中的.通过, sudo docker ps -a 可以查看. 列表中,第一列CONTA

《从零開始学Swift》学习笔记(Day5)——我所知道的标识符和keyword

?? Swift 2.0学习笔记(Day5)--我所知道的标识符和keyword   原创文章,欢迎转载.转载请注明:关东升的博客 好多计算机语言都有标识符和keyword,一直没有好好的总结,就是这种用着,如今小小的整理一下Swift中的标识符和keyword. 什么是标识符呢? 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等由开发者指定的名字. 事实上.构成标识符的字母是有一定规范的,Swift中命名规则是: 区分大写和小写.Myname与myname是两个不同的标识符: 标识

从零開始学android&amp;lt;SeekBar滑动组件.二十二.&amp;gt;

拖动条能够由用户自己进行手工的调节,比如:当用户须要调整播放器音量或者是电影的播放进度时都会使用到拖动条,SeekBar类的定义结构例如以下所看到的: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.SeekBar 经常用法 public SeekBar(Context context) 构造 创建SeekBar类的对象 p