Docker容器技术的相关概念及Dockerfile的编写

1.什么是虚拟化技术?

虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU 并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

2.什么是服务器虚拟化?

服务器虚拟化是将服务器物理资源抽象成逻辑资源,让一台服务器变成几台甚至上百台相互隔离的虚拟服务器,其核心目的是为了在一台主机上同时运行多个系统或应用,让CPU、内存、磁盘、I/O等硬件变成可以动态管理的“资源池”,从而提高资源的利用率,简化系统管理,实现服务器整合,降低成本。

其他相关虚拟化概念,请移步到这篇文章。https://blog.csdn.net/duozhishidai/article/details/88716344

3.容器与虚拟服务器的比较?

容器与虚拟服务器的比较如下图所示。传统虚拟化技术需要借助虚拟化管理程序(如VMware、KVM等),为用户提供了一个完整的包括内核在内的一个完整的系统镜像;容器为应用程序提供了隔离的运行空间,每个容器内都包含一个独享的完整用户环境空间,并且一个容器内的变动不会影响其他容器的运行环境。容器之间共享同一个系统内核,这样当同一个库被多个容器使用时,内存的使用效率会得到提升。

Docker容器技术的相关概念及Dockerfile的编写_第1张图片

两者的特点对比归纳如下:

特性 Docker 容器 传统虚拟机
启动速度 秒级 分钟级
性能 接近原生 较差
消耗内存 很小 较多
硬盘容量 MB 级 GB 级
单机运行密度 上千个容器 几十个容器
隔离性 安全隔离 完全隔离
迁移性 一般

4.Docker容器的三个概念

容器技术有其他几种实现形式,Docker是其中应用最广泛的一种。

4.1 Docker镜像

Docker镜像类似于虚拟机镜像,可以将它了理解为一个只读模板,镜像是创建Docker容器的基础。对于一个Java应用的镜像来说,应该包含基础的操作系统,并需要在其中安装jdk,并将Java应用添加到镜像中。

4.2 Docker容器

容器是从镜像创建的应用运行实例,类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用,可以把容器看做一个简易版的linux系统环境以及运行在其中的应用程序打包而成的盒子。

4.3 Docker仓库

Docker仓库类似于代码仓库,是Docker几种存放镜像文件的场所。通常我们会把Docker仓库和仓库注册服务器(Registry)混为一谈,每个仓库只存放某一类镜像,通过不同的标签(tag)进行区分,如存放Ubuntu操作系统镜像的仓库被称为Ubuntu仓库,其中Ubuntu可能有很多歌版本;而仓库注册服务器是存放仓库的地方,其中往往存放着多个仓库。目前最大的公开仓库是官方提供的Docker Hub,我们也可以创建自己的私有仓库。

5.在CentOS7中主安装docker引擎

https://www.cnblogs.com/ddstudy/p/12897257.html

6.使用Dockerfile创建jdk镜像

6.1 创建目录

mkdir –p /usr/local/dockerjdk8

6.2 下载jdk

下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录

6.3 在 dockerjdk8中创建Dockerfile文件

#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER chen
#切换工作目录,workdir为后续RUN CMD ENTRYPOINT指令配置工作目录,工作目录,类似于cd命令
WORKDIR /usr
RUN mkdir /usr/local/java #在基础镜像centos:7中创建一个文件
#ADD 将当前目录下的jdk安装包复制并解压到基础镜像centos中的/usr/local/java文件夹下
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#在基础镜像中配置Java的环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH
$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

6.4 创建镜像

创建名为jdk1.8镜像,最后的.表示Dockerfile在当前路径:

docker build ‐t jdk1.8 .

6.5 查看镜像是否建立完成

docker images

7.使用Dockerfile创建一个Java应用

将jar包与Dockerfile放于统一文件夹下,以上节中创建的jdk1.8镜像作为基础镜像

#jar包要与Dockerfile文件在同一个文件夹下
# 该镜像需要依赖的基础镜像
FROM jdk1.8
# 指定维护者的名字
MAINTAINER chen

#在基础镜像(安装jdk的centos)中创建一个文件夹/root/demo
RUN mkdir /root/demo/

#设置工作目录,相当于cd指令,指定执行命令的目录为/root/demo/
#当路径不在根目录/而在/root/demo文件下时,可以使用workdir命令指定工作目录为/root/demo,
#在指定容器启动命令时就不用写/root/demo/springboot_demo.jar了,相当于已经进入demo文件夹了
WORKDIR /root/demo/

# 将当前目录下的jar包复制到jdk1.8镜像的根目录  /目录下
ADD /springboot_demo.jar /root/demo

# 修改这个文件的访问时间和修改时间为当前时间
RUN bash -c 'touch /springboot_demo.jar'

# 声明服务运行在80端口,该指令只是起到声明的作用,并不会自动完成端口映射
EXPOSE 80

# 指定容器启动时运行的命令
#ENTRYPOINT与CMD的区别,cmd是容器启动时执行的命令,在将镜像通过docker run命令创建并启动时也可以
#在这条命令中加入其他命令,docker run命令行中的命令会覆盖CMD指令,ENTRYPOINT命令则不会被
#docker run命令行中的命令覆盖,且docker run命令行中指定的任何参数都会被当做参数再次传递给
#ENTRYPOINT指令中指定的命令。
ENTRYPOINT ["java", "-jar","springboot_demo.jar"]

你可能感兴趣的