简单介绍
Docker架构
Docker解决了开发与运维环境差异问题,使得开发和运维可以使用同一种语言沟通,并且与微服务、持续集成等概念相辅相成。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境,而且在项目实施中,测试环境和生产环境可以实现持续集成。大量节约开发、测试、部署的时间。
Docker不是虚拟机
Docker容器不像虚拟机那样需要额外的管理程序,它依赖系统内核运行,所以在资源开销上比虚拟机那种形式要低很多。
使用Dockerfile,可以代替以往的繁琐的更新,而且这些更新是可跟踪的,在开发环境中这种形式更为可靠。
容器与镜像
镜像(Image)就是一堆只读层(read-only layer)的统一视角。
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
要点:容器 = 镜像 + 读写层。详细解释参看10张图带你深入理解Docker容器和镜像。
使用Dockerfile文件创建镜像
Dockerfile是一个包含用于组合镜像的命令的文本文档。可以使用在命令行中调用的任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。为了指定基本映像,第一条指令必须是FROM。
以上是关于Dockerfile文件的一个简单介绍,下面来看看具体如何做。
首先使用以下命令创建一个目录。
$ mkdir -p /home/chm/docker/java-docker-app
使用touch命令创建一个Hello.java文件。这个 Hello.java 的代码内容如下 :
class Hello{
public static void main(String[] args){
System.out.println("This is first java app \n by using Docker");
}
}
创建Java文件后,接着创建一个Dockerfile文件,其中包含了Docker的说明。 Dockerfile不包含任何文件扩展名。 所以这个文件简单使用Dockerfile作为名称保存即可。此 Dockerfile 文件的内容如下:
:
所有指令要使用大写字母编写,因为这是它的惯例(约定)。
此时java-docker-app目录下就包含以下两个文件:
现在,按照以下命令创建一个镜像,在以下命令中,java-app是的镜像名称。
如果未安装Java 8,那么会自动下载Java 8安装再执行。注意在Docker中镜像是分层存储的,Dockerfile文件中的每一行都会产生一个新层,从上图可以看到,每层都会产生一个新的id。这样做的好处很明显,对于多个images可以共享相同的层。
在成功构建镜像后。 我们可以通过docker images命令查看到我们创建的镜像。接下来,我们可以运行Docker镜像了。
运行Docker镜像
在这里可以看到,在运行sudo docker run java-app之后,它产生了一个输出。
向容器提交
使用下面的命令启动nginx镜像,如果没有可以pull一下。
然后将index.html文件拷贝到容器当中
$ docker cp index.html 1dc318c97a09://usr/share/nginx/html
index.html文件内容很简单:
<html>
<h1>Docker is fun!</h1>
</html>
这时打开浏览器,访问本地的8080端口,可以看到nginx的欢迎也改成了我们拷贝进去的页面。
但是如果关闭容器,再去访问本地8080端口是,会发现我们的提交的就无效了,也就是说容器不会主动记住你的copy进去的内容。
这时如果想要容器记住你的修改,那么需要使用docker commit命令。提交会生成一个新的镜像。nginx-fun就是镜像名。
原来的nginx镜像并不会记住我们提交的文件,我们运行nginx-fun镜像才可以看到我们提交的文件。nginx-fun镜像是一个在nginx镜像基础上生成了包含我们提交内容的一个新的镜像。