Testops之路2.Docker入门

Docker架构

image

Docker 采用了 C/S 架构,包括客户端(Client)和服务端(Server),服务端通过 socket 接受来自客户端的请求,这些请求可以是创建镜像,运行容器,终止容器等等。

image

可以通过docker version命令,看到docker server和clien对应的版本。

image
image
image
  • Client是docker的客户端,执行常用的docker命令。服务端既可以运行在本地主机,也可以运行在远程服务器或者云端,只要你可以访问docker的服务端,你甚至可以在容器里运行容器。
  • DOCKER_HOST是docker的server端,也就是docker daemon的安装的机器。
  • Registry是 Docker仓库的位置。

镜像

image

Docker 镜像是一个特殊的文件系统,类似于 Linux 的 root 文件系统,镜像提供了容器运行时所需的程序、库、资源、配置等文件,还包含了一些为运行时准备的一些配置参数。镜像是一个静态的概念,镜像不包含任何动态数据,其内容在构建之后也不会被改变。

由于镜像包含完整的 Linux root 文件系统,所以它可能会很庞大。因此,Docker 的设计者充分利用 Unions FS 技术,把 Docker 设计为分层存储的结构。什么意思呢?也就是说,镜像是分层构建的,每一层是上面一层的基础,每一层在构建完成之后都不会再发生变化。

构建镜像的时候我们要保证每一层都只包含我们的应用需要的东⻄,不要包含不需要的文件,因为每一层在构建之后不再发生变化,所以即使你在之上的层删除了那些不需要的文件,这些文件也只是被标记为删除,实际上并没有真正删除

下面,用一个形象的例子来讲解镜像拷贝的工作原理。
首先,我们有一张没有斑点的奶牛图片(相当于我们有一个基础镜像)


image

现在,我希望从这张图片得到一张有斑点的奶牛图像,我不是直接在这个原始图片画斑点,而是将斑点单独作为一层,把斑点层和原始图片叠加,就得到了斑点奶牛:

image
image

这样做有什么好处呢?设想一下,如果你直接把你想要的黑色斑点画到原图上,那么其他人想在原始的无斑点奶牛图片上做一些其它的创作就会很麻烦。但是,如果采取分层的方式,他们也只需要设计自己想要的斑点就可以了,从而原始的无斑点奶牛图片可以共享:

image

这样,每次你想查看自己的斑点奶牛的时候,就会把原始的无斑点奶牛复制一份给你,然后叠加你的斑点图层,你就可以看到你的斑点奶牛了。而你不查看的时候,原始的无斑点奶牛图片是共享存储的,这就是写时拷贝——只有在需要叠加斑点图给你看效果的时候才把原图拷贝一份给你,在拷贝的上面叠加一层来画斑点,否则,你与其他人的无斑点奶牛图层是共享存储的。

image

通过上面的图片也可以看出来,docker在从镜像仓库Regsitry拉取镜像的时候也是分层拉取的。

image

通过dockerfile,也能看出来docker的分层机制。
分层存储机制使得镜像之间可以共享很多层,节约大量存储空间!

可以从docker hub上拉取镜像。

从镜像到容器

#拉取一个镜像
docker pull ubuntu:16.04

#查看拉取下来的镜像
docker images

好了,现在我们已经有一个 Ubuntu 镜像了,下面我们从这个镜像运行一个容器,Docker run 命令可以从一个镜像运行一个包含一个主进程进程的容器:

image
docker run -ti --name first ubuntu:16.04 bash

命令解释:
Docker run 是从一个镜像运行一个容器的指令。
-ti 参数的含义是:terminal interactive,这个参数可以让我们进入容器的交互式终端。
--name 指定容器的名字,后面的 first 就是我们给这个容器起的名字。
ubuntu:16.04 是致命从哪个镜像运行容器,ubuntu是仓库名,16.04是标签。
bash 指明我们使用 bash 终端。

运行完以上命令,你会得到下面的结果,你会发现我们已经进入了容器:

image

现在,你可以在容器里运行一些指令,就好像在一个全新的系统里一样,比如我们运行一个创建文件的指令:

touch daidekun.py
image

在上一节课我们强调,镜像是一个静态的概念,容器是一个动态的概念。这里我们就来看看这是什么意思,现在我们从相同的镜像再运行一个新的容器:

image

会发现之前创建的文件没有了。

从容器到镜像

image

并不是容器被删除了,而是容器被终止了,我们依旧可以看到我们的容器,运行以下指令可以查看我们当前的容器:

docker ps -a
image

我们刚刚在名字为 first 的容器里创建了一个文件“daidekun.py”,如果这是很重要的文件,你以后还需要它,你希望每次运行一个新容器,这个文件都要存在于新的容器中,怎么办呢?我们可以把容器变成一个新镜像。

image
#把刚才名为 first 的容器提交为一个新的镜像:
docker commit first my_image:v1.0 

其中,my_image:v1.0 就是“仓库名:版本号”。

image

其他容器操作

Docker run

我们一直在用“Docker run”命令来创建容器,那么“Docker run”到底做了什么?

  • 检查本地是否存在指定的镜像,不存在就从公共仓库下载;
  • 利用镜像创建并启动一个容器;
  • 给容器包含一个主进程(Docker 原则之一:一个容器一个进程,只要这个进程还存在,容器就会继续运行);
  • 为容器分配文件系统,IP,从宿主主机配置的网桥接口中桥接一个虚拟接口等。

守护态运行

其实就是后台运行(background running)

在运行“docker run”命令的时候加上 “-d”参数(-d means detach)

下面举个例子说明一下:

如果不使用“-d”参数:

docker run --name withoutD ubuntu:16.04 bash -c "echo hello world"

容器会把输出结果打印到宿主主机上。

docker run -d --name withD ubuntu:16.04 bash -c "echo hello world"

如果使用“-d”参数的话,容器启动后会返回容器 ID,但是不会将输出结果打印到宿主主机:

进入容器

常用的两种进入容器的方法

ssh 登录
attach 和 exec

image

删除容器

docker rm nameOfContainer
image

停止容器

sudo kill nameOfContainer
image

查看日志

比如你在后台运行一个容器,可是你把“echo”错误输入成了“eceo”:

docker run -d --name logtest ubuntu:16.04 bash -c "eceo hello"
image

其他命令

#查看容器详细信息
sudo docker inspect [nameOfContainer]

#查看容器最近一个进程
sudo docker top [nameOfContainer]

#停止一个正在运行的容器
sudo docker stop [nameOfContainer]

#继续运行一个被停止的容器
sudo docker restart [nameOfContainer]

#暂停一个容器进程
sudo docker pause [nameOfContainer]

#取消暂停
sudo docker unpause [nameOfContainer]

#终止一个容器
sudo docker kill [nameOfContainer]

容器的生命周期

image

要在容器里面保存重要文件,因为容器应该只是一个进程,数据需要使用数据卷保存。

尽量坚持“一个容器,一个进程”的使用理念,当然,在调试阶段,可以使用exec命令为容器开启新进程。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容