概念简述

  • 镜像 一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数。
    Docker镜像是一个只读的模板。比如一个镜像可以包含Ubuntu系统以及安装在Ubuntu上的Apache Web服务器和你自己的应用。镜像是用来创建容器的。Docker提供了一个简单的方式用以创建新的镜像或者更新现存的镜像,甚至你可以下载其他地方提供的镜像。镜像是Docker服务的组件之一。
    由于Docker使用一个统一文件系统,Docker镜像其实就是一堆文件的集合,并不是像VM那样的是一个操作系统。镜像可以简单到只有一个程序文件,比如如果你写了一个简单的hello world程序放到一个空的镜像中,那么整个镜像的大小,就是你编译后的二进制文件的大小。
    总结来说就是:
    镜像(image)是 Docker 的三大组件之一;
    镜像是用来启动容器的基石;
    镜像是只读的,也即是无状态的,一个镜像是永久不会变的;
    一个没有任何父镜像的镜像,称之为基础镜像;
    在Docker容器中所有的变更都发生顶层的镜像可写层;
    Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载( 默认是 Docker Hub 公共注册服务器中的仓库)。

  • 容器 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库 镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务 1)docker hub 2)私有仓库
  • Dockerfile 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
  • 数据卷 一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

创建docker镜像的两种方法

  • 第一种:启动镜像后进入容器中操作,将需要的软件或者项目移动到容器中,安装或者部署,然后退出即可
  • 第二种:编写dockerfile,将需要的镜像一层层叠加上去,比如我们要部署项目,可以先下载一个ubuntu基础镜像,然后叠加jdk,然后tomcat,然后项目

区别在于,第二种比较体现docker的镜像叠加特性,第一种到最终只有一层镜像.本文讲述第二种

环境准备

(运行环境:Ubuntu 16.04)

利用DockerFile制定镜像
通过编写Dockerfile的方式制作镜像。
需要在Dockerfile中完成如下几项工作:
(1)安装jre
(2)安装tomcat,并完成在tomcat中部署web应用的基本配置(为实现此功能:在制作镜像之前直接先完成tomcat的基础配置,然后直接拷贝到镜像中即可)。
(3)对外开发8080端口(具体的端口值可以根据实际Tomcat配置参数为准)。

$mkdir docker
$cd docker

建立docker文件夹,并把之前下好的jre文件夹和tomcat文件夹(或者压缩包,均可)拖入其中,docker文件夹下目录如下:
1

编写Dockerfile文件

补充:关于Dockerfile文件
在容器中配置运行环境(此处是jre和tomcat)的任务主要是在容器中安装软件,并进行相应的配置,如果把这个过程所要执行的命令全都提取出来,写入一个文件中,若需要构建镜像则直接运行该文件,基于其中的命令生成一个镜像。这就是基于Dockerfile构建镜像的方式,这个文件就称为Dockerfile
Dockerfile文件一共分为四个部分,分别是:注释信息、基础镜像、创建者信息、构建镜像所需的命令:
详细介绍可参考:http://www.tuicool.com/articles/vqAVRrE或http://blog.csdn.net/wsscy2004/article/details/25878223
Dockerfile文件内容如下:
(以系统Ubuntu镜像为基础镜像)

#Build java web app container image
FROM ubuntu:16.04
MAINTAINER zhaokx3 "zhaokx3@mail2.sysu.edu.cn"

#Make java and tomcat install directory
RUN mkdir /usr/local/java
RUN mkdir /usr/local/tomcat

#Copy jre and tomcat into image
ADD jre1.8.0_131 /usr/local/java/
ADD apache-tomcat-9.0.0.M21 /usr/local/tomcat/

ENV PATH $PATH:/usr/local/java/bin

#Expose http port
EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

创建镜像

sudo docker build -t="ubuntu/mine:tomcat" .

2

启动容器

sudo docker run -p 8090:8080 --name tomcat -v /home/zhaokx3/docker/webapps/:/webapps/ ubuntu/mine:tomcat

3

简要说明:参数-v指定挂载的卷,如没有可不使用,参数-p将8080端口映射成主机的8090端口,这样就可以访问主机的8090端口就到容器的8080端口。
docker run 命令详解可参考:http://www.lupaworld.com/article-250439-1.html

最后成功通过http://localhost:8090/your_test 访问自己的web应用(端口8090):
4
可对比直接利用Tomcat部署web应用(端口8080):
5

转载:http://blog.csdn.net/zhaokx3/article/details/72757527