DICOM:Docker实现增量发布之前期准备

背景:

为了方便整体产品的发布,希望通过docker实现增量发布。大致的思路如下:
is-there-a-way-to-add-only-changed-files-to-a-docker-image-as-a-new-layer-with。本博文对这种方式进行了尝试,与此同时简单介绍如何通过Dockerfile来创建Docker镜像。

前期准备:

  1. 解决centos的网络问题【can not find a valid baseurl for repo: base/7/x86_64】,使用dhclient命令
    http://stackoverflow.com/questions/30424860/yum-error-centos-7-1-x86-64
  2. 解决下载docker官方镜像问题【Docker - dial tcp: lookup index.docker.io: no such host - Solution】,解决方案:https://linuxconfig.org/docker-dial-tcp-lookup-index-docker-io-no-such-host-fix
    这里写图片描述
  3. centos命令行中解析json串。【How to parse JSON string via command line on Linux】,使用一个开源库,详情参考:http://xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html
    【备注】:建议在windows下先下载jq库,然后再使用pscp等工具上传到linux中,我在多款linux系统下尝试使用wget直接下载,速度卡的要死。

docker镜像和容器再学习:

1. docker image

官方的解释
- 镜像:An image is a filesystem and parameters to use at runtime. It doesn’t have state and never changes.
- 容器:A container is a running instance of an image.
- 引擎:When you ran the command, Docker Engine:
(1)checked to see if you had the hello-world software image;
(2)downloaded the image from the Docker Hub (more about the hub later);
(3)loaded the image into the container and “ran” it

我们之所以使用docker,就如同他的logo中的集装箱一样:通过docker镜像来创建和分发软件,即

Docker Engine lets people (or companies) create and share software through Docker images. Using Docker Engine, you don’t have to worry about whether your computer can run the software in a Docker image — a Docker container can always run it.

2. docker image 在本地


之前博文中专门介绍过通过Docker来发布C-STORE服务Docker实现DICOM服务虚拟化,以及详细介绍过Docker的数据卷其实当我们安装完Docker服务后(Docker主要包括Server、Engine、Client三大模块,后续博文会详细介绍),会跟其他软件一样,在本地生成很多目录结构,对于AUFS文件系统的本地结构可以仔细阅读博文Where are Docker images stored?,但是由于AUFS一直没有纳入Linux内核,所以Docker会支持多种文件系统,我本地centos系统支持的是devicemapper文件系统,该文件系统在本地的存储结构如下(详细介绍可以阅读博文 Docker Supported Filesystems):
这里写图片描述

这里写图片描述

这里写图片描述
这里就不详细介绍每个目录、每个文件的含义了,后续有时间再补充。

Dockerfile创建docker镜像


docekr可以通过读取Dockerfile中的指令来自动创建镜像。下面简单介绍一下如何使用Dockerfile创建自己的镜像(关于Dockerfile的详细说明,参见官方文档Dockerfile Reference
本地的目录存档结构如下(【备注】:在本地如何有规律的归档各类文件是一种良好的习惯,提高效率的同时能够减少错误的发生,建议大家形成自己的习惯):
这里写图片描述
其中addfiles文件夹下存档的是一组dcm医学图像,用于测试后续Dockerfile中的ADD指令;copyfiles文件夹下存档的是一组放疗dicom-rt数据,用于测试后续Dockerfile中的COPY指令。详情见下文对应章节。

1. FROM指令


FROM指令是所有Dockerfile的第一条,目的是设置基础镜像来源,可以是远程仓库也可以是本地。FROM指令有三种格式,如下:

FROM <image> #只给出基础镜像名称
FROM <image>:<tag>#给出制定的tag标签
FROM <image>@<digest>

如果镜像在本地存在会优先使用本地镜像,如果不存在需要从官方仓库中pull下来。
我本地已经将centos:latest最新镜像拉了下来,所以对Dockerfile的build会很迅速,我本地的Dockerfile内容如下:

FROM centos #默认tag=latest,即我本地的centos镜像
MAINTAINER zssure@linkingmed.com

运行过程如下:
这里写图片描述
此时docker images查看本地镜像,结果如下:
这里写图片描述

2. ADD指令

有些时候使用docker来发布服务或软件时,需要将本地的项目拷贝到docker镜像中,ADD指令就是完成这个工作的。
例如我本地的目录结构如下
这里写图片描述
现在希望将上文提到的addfiles目录下的医学影像文件拷贝到镜像中,新的Dockerfile如下:
这里写图片描述
在Dockerfile当前目录运行,竟然出现了错误:Forbidden path outside of the build context: ../addfiles ()
这里写图片描述
出现该错误的原因是因为跟docker的build context有关,上述docker build指令会将路径作为build context,然而../addfiles并不包含在上述build context之内。所以两种解决方案:
1. 将addfiles目录拷贝到Dockerfile所在的目录
2. 返回到上一级运行docker build,(详情参考How to include files outside of Docker’s build context?
具体结果如下:
这里写图片描述
【备注】:注意此时需要修改之前的Dockerfile,将ADD ../addfiles /root/addfiles指令改成ADD ./addfiles /root/addfiles
此刻可以看到本地多了一个镜像:
这里写图片描述
虽然从上图镜像的大小我们可以推断出结果应该是成功的,但是还是使用docker run命令行启动一个容器进入该镜像确认一下是否已经将addfiles添加成功:
这里写图片描述
由上图所示已经成功。

3. COPY指令

COPY指令与ADD指令类似,同样可以将本地文件拷贝到镜像内,目前我了解的唯一区别是ADD可以添加src为URL的源数据到镜像,而COPY只能是本地数据。
本地运行测试结果如下:
这里写图片描述
同样进入到容器内部查看一下:
这里写图片描述
结果完全正确。

总结:


从上述ADD和COPY两次创建本地镜像的实际运行状态中可以看出,使用Dockerfile构建新的镜像与我们手动启动容器,运行相关指令,再commit容器到镜像是一样的。如下图所示:
这里写图片描述
这说明Dcokerfile中的上述指令MAINTAINER、ADD、COPY都会在基础影像Base Image(即FROM指向)之上创先新的layer并commit提交为新的镜像文件,使得修改固化存储在本地。这正是博文开头背景中希望通过Docker来实现增量发布的方式,即每次发布服务时,通过更新Dockerfile文件,将本地有所变动的文件通过ADD(或者COPY)指令添加到新的layer层并生成新的镜像,从而实现自动化的增量发布Docker镜像的目的。具体细节后续博文中会介绍,敬请期待。






作者:zssure@163.com
时间:2016-07-24

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。

pcap文件的python解析实例 - 2016-07-24 19:07:52

最近一直在分析数据包。 同时也一直想学python。 凑一块儿了...于是,便开工了。座椅爆炸! 正文 首先要说的是,我知道python有很多解析pcap文件的库,这里不使用它们的原因是为了理解pcap文件的格式细节。使用tcpdump你可以很容易抓取到一系列的数据包,然而tcpdump并没有分析数据包的功能,如果想从这个抓包文件中分析出一些端倪,比如重传情况,你必须使用wireshark之类的软件,用wireshark打开tcpdump抓取的pcap文件,如果你看到了一堆堆的深红色(类似静脉血管里流出的猪

CPU和内存监测 - 2016-07-24 19:07:07

CPU和内存监测 vmstat命令的VM模式 vmstat可以监测给定时间间隔的服务器的状态值,包括CPU的使用率,内存的使用,虚拟内存的交换情况,IO读写情况。 主要从/proc/meminfo,/proc/stat和/proc/*/stat中获取数据 常用手段vmstat [采样的时间间隔秒数] [采样的次数],举例如下: [root@dtbase-master- 2 /root] #vmstat 5 10 procs -----------memory---------- ---swap-- ---
正文 为了弥补pcap文件的缺陷,让抓包文件可以容纳更多的信息,pcapng格式应运而生。关于它的介绍详见《 PCAP Next Generation Dump File Format 》         当前的wireshark/tshark抓取的包默认都被保存为pcapng格式。         形而上的论述就不多谈了,直接给出一个pcapng数据包文件的例子: 然后我强烈建议,对着《 PCAP Next Generation Dump File Format 》来把一个实际抓取的pcapng文件里面
PS:历史原因作者账号名为:ymh198816,但事实上作者的生日并不是1988年1月6日 今天作者要在这里通过一个简单的电商网站订单实时分析系统和大家一起梳理一下大数据环境下的实时分析系统的架构模型。当然这个架构模型只是实时分析技术的一 个简单的入门级架构,实际生产环境中的大数据实时分析技术还涉及到很多细节的处理, 比如使用Storm的ACK机制保证数据都能被正确处理, 集群的高可用架构, 消费数据时如何处理重复数据或者丢失数据等问题,根据不同的业务场景,对数据的可靠性要求以及系统的复杂度的要求也会不同
一 协议端口 如果把IP地址比作一间房子 ,端口就是出入这间房子的门。真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。 在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,把数据包顺利的传送到目的主机。大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给众多同时运行的进程中的哪一个
MyBatis真正的强大,在于其映射语句的魔力。 SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): (1)cache  给定命名空间的配置缓存。 (2)cache-ref  其他命名空间缓存配置的引用。 (3)resultMap  是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象 (4)sql 可被其他语句引用的可重用语句块。 (5)insert 映射插入语句 (6)update  映射更新语句 (7)delete   映射删除语句 (8)select   映射查询语句
1、Maven构建Spring Boot 创建Maven Web工程,引入spring-boot-starter-parent依赖 project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/m

平衡搜索树之AVLTree - 2016-07-24 14:07:56

今天我想要在这里写下个人觉得比较难的数据结构---AVL树的一些些心得。 一。了解一种新的数据结构,首先要搞懂它的定义 : AVL树又称为高度平衡的二叉搜索树,是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度 平衡,尽量降低二叉树的高度,减少树的平均搜索长度。所以严格点来说,对于一棵搜索二叉树,能达到O(logn)的只是AVL树,因为他对于二叉树的深度控制的最为严格 ,那么这是为什么呢?让我们来看看 AVL树的性质 : 左子树和右子

linux基础知识 - 2016-07-24 14:07:48

1:基本知识 微内核:是一种提供必要服务的操作系统内核,大部分内核都作为单独的进程在特权模式先运行,他们通过消息传递进行通讯 单内核:单内核是个很大的进程,他的内部又悲愤为若干个模块,是个单独的二进制但印象,其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息传递。 linux分几种应用程序级别 Ring 0 特权模式 一般是系统底层运行级别 Ring3 应用程序级别 一般的级别 有时候应用进程为了调用系统底层的模块,可能会在用户空间和内核空间之间进行来回的切换,这是很耗时间的,平时工作中应注意
1. 概述 嵌入式系统由硬件环境、嵌入式操作系统和应用程序组成,硬件环境是操作系统和应用程序运行的硬件平台,它随应用的不同而有不同的要求。硬件平台的多样性是嵌入式系统的主要特点,如何使嵌入式操作系统在不同的硬件平台上有效地运行,是嵌入式系统开发中需要解决的关键问题。解决的方法是在硬件平台和操作系统之间提供硬件相关层来屏蔽这些硬件的差异,给操作系统提供统一的运行环境,这种硬件相关层就是嵌入式系统中的板级支持包BSP(Board Support Package,简称BSP)。 2. BSP及其作用 BSP是嵌