Docker-2

解析Docker Container:

Docker镜像和容器
一个Docker镜像是指构成软件应用的所有文件的集合。
对原有镜像的每一种变化都会被单独保持到一个层里,而不会影响原来的镜像。
也就是说每个Docker镜像都是继承自一个基础镜像,然后根据需求来扩展变化。
我们可以在此基础上额外添加其它模块到基础镜像来展现我们需要的行为。
每次我们提交一个Docker镜像,就是在Docker镜像上创建了一个新的层。
原来的镜像和在它上面已有的层都会保持不变。

换句话说,镜像通常是只读类型的,我们通过系统性的增加新模块来增强原来的镜像,那么新的镜像会以新的名字被单独创建,而原来的镜像得以保持。

每个镜像都有唯一的ID,基础镜像可以被增强功能来创建父镜像,然后通过父镜像来创建子镜像。
基础镜像没有父镜像,父镜像是建立在基础镜像之上的。
当我们使用一个镜像如果我们没有指定镜像的标识,则最新的镜像将被使用。

在每一个Docker的主页面,都有一个Docker镜像的只读模板。
比如一个镜像可能包含一个Ubuntu操作系统,一个装有我们应用程序的Apache安装在上面。
Docker为我们提供了很多简单的方式来创建新镜像以及更新原有镜像,我们还可以直接使用别人已经创建好的镜像。

Docker镜像是Docker容器的构成组件。
通常,基础镜像表现为一个操作系统,比如Linux,也可能是Linux的一个分支,比如Debin,添加额外的模块到基础镜像就够成了容器。
一个容器可以看作读写层创建在一个或者多个只读镜像之上。
当容器运行时,Docker引擎不仅合并所有需要的镜像,还会合并读写层所有的变化到容器本身。
这就构成了一个自包含,可扩展和可执行的系统。

可读写层的变化可以通过执行docker commit命令来进行合并。
新的容器将包含所有基于基础镜像的变化,形成一个在基础镜像之上的新层。

可读写的Container
-----------------
Apache Image
Emas Image
Debian Base Image
------------------
Linux Kernel bootfs

每一次提交都会创造一个新的镜像。新的镜像只会保存新增加的模块,这类似于云环境下的对象存储。
每当我们更新一个对象时,会使用最新的信息创建一个新对象,然后给它一个新的ID进行存储。

Docker 层
Docker Layer可以表现为只读镜像或者读写镜像。
容器堆栈的最上层总是读写层,它运行着一个Docker容器。

一个Docker容器
从上面的结构模型来看读写层是容器层。其下面有很多只读的镜像。
通常一个容器源自于一个只读镜像的一次commit行为。
当我们开启一个容器时,我们实际上是在通过它的唯一ID来引用一个镜像。
Docker会获取必须的镜像和它们的父镜像,持续的引用其父镜像的父镜像,直到到达基础镜像。

Docker Registry 寄存器
可以存储Docker镜像的地方,可以让公众发现,访问,共享使用的地方。
使用docker push命令,可以将自己的Docker镜像注册到Docker Registry
每个注册用户都会有一个唯一的Repository用于存放Docker镜像。

Docker Repository:
是一个用于存储Docker镜像的命名空间。

坐在基础镜像上面的是父镜像,这些父镜像支撑着子镜像。
基础镜像不存在父对象。

使用Docker镜像:
下载镜像的标准命令:
docker pull
该命令默认下载镜像的latest版本
$ sudo docker pull -a busybox
下载指定的镜像版本:
$ sudo docker pull busybox:ubuntu-14.04

查看可用的Docker镜像:
$ sudo docker images
启动一个容器:
$ sudo docker run -t -i busybox:ubuntu-14.04

Docker Hub Registry

Docker镜像库的公共可用的默认位置index.docker.io, 称之为 Docker index
docker pull命令就是在该位置查找。

malware, adware, viruses,恶意软件,广告软件,病毒
$ sudo docker pull thedockerbook/helloworld

指定下载镜像的路径
$ sudo docker pull registry.example.com/myapp

查找镜像
$ sudo docker search mysql


以一种交互模式运行一个容器:
docker run命令带有一个镜像名作为输入,它会启动该镜像作为一个容器。
我们还需要传入 -t和-i 来让该容器具备互动能力。
-i 标记是键盘驱动器,它让容器能够捕获标准的STDID输入。
-t 标记启动模拟终端

$ sudo docker run -i -t ubuntu:14.04 /bin/bash
该命令 的/bin/bash 指定我们使用bash命令来进行交互

我们可以使用Ctrl+P 和 Ctrl+Q 来从交互容器中分离,进入Docker主机控制窗口 $
该容器还会继续运行,Docker主机的 ps命令将显示所有运行的容器名单和它们的主要属性

$sudo docker ps

显示的内容包括 CONTAINER ID:64进制随机数字,默认docker ps只显示12进制数字,我们可以通过
添加 --no-trunc标记来显示64进制ID

IMAGE:制造容器所用的镜像
COMMAND:显示在容器启动过程中执行的命令
CREATED:显示容器被创建的时间
STATUS:容器的当前状态
PORTS:容器的端口
NAMES:容器自动生成的随机名字,我们可以通过在docker run命令中添加标记 --name 来手动配置

此后我们想重回容器对话:则可以使用docker attach 
$ sudo docker attach jolly_lovelace

root@742718c21816:/# pwd
/
root@742718c21816:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@742718c21816:/# cd usr
root@742718c21816:/usr# ls
bin games include lib local sbin share src
root@742718c21816:/usr# exit
exit
$

如果输入bash的终止命令exit
它将关闭容器,回到Docker主机对话框 $

跟踪容器内部变化:
我们使用ubuntu作为基础镜像,设计一个容器,运行一些基础命令,分离和附加容器等操作。
其中docker ps命令,提供了基础容器管理功能。

下面我们以bash交互模式启动一个容器:
$sudo docker run -i -t ubuntu:14.04 /bin/bash
root@d5ad60f174d3:/#
定向到/home 目录
root@d5ad60f174d3:/# cd /home

创建三个空文件:
root@d5ad60f174d3:/home# touch {abc,cde,fgh}

显示文件列表:
root@d5ad60f174d3:/home# ls -l

检查容器的文件系统,使用 docker diff 命令

为了检查容器文件系统,我们可以从容器中分离出去或者使用Docker主机上的其它终端来执行docker diff命令
我们知道任何ubuntu容器都有主机名hostname,而且它被作为提示命令符的一部分,
它也是容器ID,我们可以直接使用容器ID 来运行docker diff:
$sudo docker diff d5ad60f174d3

C /home
A /home/abc
A /home/cde
A /home/fgh

C指示 /home 目录被修改了,A指示 添加了这些目录,D指示 删除。


控制Docker 容器:
我们可以使用docker的命令对容器进行start,stop和restart等指令操作。
当我们执行docker stop指令时,Docker引擎会发送SIGTERM(-15)到主进程,我们的容器
就运行在这个进程中,SIGTERM信号请求进程终止自己。如果终止执行失败,强制终止信号SIGKILL(-9)
就会被发送执行。

启动容器:
$ sudo docker run -i -t ubuntu:14.04 /bin/bash
root@da1c0f7daa2a:/#

终止容器
$ sudo docker stop da1c0f7daa2a
da1c0f7daa2a

容器运行窗口显示:
root@da1c0f7daa2a:/# exit
$
我们使用 docker ps命令来查看运行的容器:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
da1c0f7daa2a ubuntu:14.04 "/bin/bash"
minutes ago Exited (0) 10 minutes ago
desperate_engelbart
$

启动关闭的容器:
$ sudo docker start da1c0f7daa2a
da1c0f7daa2a
$

默认情况下docker start不会将会话附加到启动的容器
我们需要添加 -a 选项或者 显式的执行 docker attach 命令。

$ sudo docker attach da1c0f7daa2a
root@da1c0f7daa2a:/#

docker restart是 stop和start两个指令的组合

docker pause 和 docker unpause 
pause会冻结所有容器的进程执行,unpause则是释放被冻结的进程,继续沿着冻结点执行。

$ sudo docker run -i -t ubuntu:14.04 /bin/bash
root@c439077aa80a:/# while true; do date; sleep 5; done
Thu Oct 2 03:11:19 UTC 2014
Thu Oct 2 03:11:24 UTC 2014
Thu Oct 2 03:11:29 UTC 2014
Thu Oct 2 03:11:34 UTC 2014
Thu Oct 2 03:11:59 UTC 2014
Thu Oct 2 03:12:04 UTC 2014
Thu Oct 2 03:12:09 UTC 2014
Thu Oct 2 03:12:14 UTC 2014
Thu Oct 2 03:12:19 UTC 2014
Thu Oct 2 03:12:24 UTC 2014
Thu Oct 2 03:12:29 UTC 2014
Thu Oct 2 03:12:34 UTC 2014
$

暂停容器
$ sudo docker pause c439077aa80a
c439077aa80a

$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
c439077aa80a ubuntu:14.04 "/bin/bash" 47
seconds ago Up 46 seconds (Paused)
ecstatic_torvalds

重启容器
$ sudo docker unpause c439077aa80a
c439077aa80a

停止容器
$ sudo docker stop c439077aa80a
c439077aa80a

容器管家 Housekeeping container
在容器启动时我们可以指定它在关闭状态时清理容器。
$ sudo doker run -i -t --rm ubuntu:14.04 /bin/bash

还可以通过 docker ps -a 列出所有容器,然后通过 docker rm 移除它们
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
7473f2568add ubuntu:14.04 "/bin/bash" 5 seconds ago Exited
(0) 3 seconds ago jolly_wilson
$ sudo docker rm 7473f2568add
7473f2568add
$

还可以组合两个命令,移除所有非活动容器
$ sudo docker rm 'sudo docker ps -aq --no-trunc'

在容器中创建镜像:
我们使用 ubuntu:14.04 作为基础镜像
安装wget程序,然后将运行的容器转换为一个镜像:
1.启动ubuntu:14.04 容器
$sudo docker run -i -t ubuntu:14.04 /bin/bash

2.检查wget在当前容器中是否可用,返回空,确认没找到wget
root@472c96295678:/# which wget
root@472c96295678:/#

3.同步ubuntu 包库:
root@472c96295678:/# apt-get update

4.安装wget
root@472c96295678:/# apt-get install -y wget

5.确认安装结果
root@472c96295678:/#which wget
/usr/bin/wget
root@472c96295678:/#

6.安装任何软件都会改变基础镜像的组成,我们可以使用docker diff来追踪容器变化
$ sudo docker diff 472c96295678

7.最后执行提交,docker commit在运行的容器或者关闭的容器都能执行。
如果容器正在运行,执行docker commit会首先暂停该容器执行。
所以,我们强烈推荐在关闭容器后执行该操作。
$ sudo docker commit 472c96295678 \
learningdocker/ubuntu_wget
a530f0a0238654fa741813fac39bba2cc14457aee079a7ae1fe1c64dc7e1ac
25

这里我们使用learningdocker/ubuntu_wget作为提交的镜像名,提交了当前容器。

可以通过如下命令查看 镜像状态
$ sudo docker images

以上的创建提交容器的方法,多用于测试,我们提倡使用Dockerfile 方法。


作为看护程序来启动一个容器:
在分离模式下启动一个容器,即以一种看护程序的方式启动容器。
docker run命令有个 -d选项,来指定容器以分离模式启动。

$ sudo docker run -d ubuntu \
/bin/bash -c "while true; do date; sleep 5; done"
0137d98ee363b44f22a48246ac5d460c65b67e4d7955aab6cbb0379ac421269b

此时我们可以通过看护容器来查看输出
$ sudo docker logs \
0137d98ee363b44f22a48246ac5d460c65b67e4d7955aab6cbb0379ac421269b
Sat Oct 4 17:41:04 UTC 2014
Sat Oct 4 17:41:09 UTC 2014
Sat Oct 4 17:41:14 UTC 2014
Sat Oct 4 17:41:19 UTC 2014


 

转载于:https://my.oschina.net/u/924064/blog/822864

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值