一、镜像是什么
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像是由文件系统叠加而成(是一种文件的存储形式)。最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导系统有什么交互。实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用。Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像。
1.分层的镜像
在pull界面我们就可以看到下载的文件是一层层的
2.分层结构的特点
好处:共享资源
比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
二、镜像的特点与操作
1.镜像的特点
大家需要注意,Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶层,这一层通常被称为容器层,容器层之下的都叫镜像层。
2.镜像的操作
我们现在已经掌握了从docker hub上获取相关镜像,然后运行容器,并作出我们自己的处理,但有时候我们需要将我们自己的容器制作为对应的镜像,以便后面继续使用,这时我们就需要用到docker commit …命令了
docker commit -m="要提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
操作案例
我们通过tomcat镜像来创建容器后操作处理,然后将容器制作为新的镜像然后我们通过新的镜像来制作容器来演示这个效果
2.1 下载tomcat镜像
docker pull tomcat
2.2 创建容器并启动
docker run -it -p 8888:8080 tomcat
参数 | 说明 |
-p | 主机端号 |
-P | 随机分配端口 |
-i | 交互 |
-t | 终端 |
404
说明访问到了
2.3 修改容器
我们发现启动的容器中没有访问的资源,那么我们自己创建对应的资源即可
docker exec -it 容器ID /bin/bash
2.4 创建镜像
我们现在的容器和下载的有区别了,我们可以在这个基础上来创建新的镜像
docker commit -a='biao' -m='add index.html' 容器ID biao/tomcat:1.6
2.5 启动新的镜像
docker run -it -p 8888:8080 biao/tomcat:1.6
三、Docker数据卷
1.数据卷
前面介绍过了镜像和容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个问题。
1.1 数据卷是什么
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。简单来说,容器卷就想当于Redis中持久化方式的RDBheAOF。
1.2 解决了什么问题
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
1.3 数据卷的特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
2.数据卷的使用
2.1 直接添加
运行一个CentOS容器
docker run -it -v /宿主机绝对路径:/容器内目录 镜像名
Ctrl+P+Q可退出进程
在宿主的根目录下会多出对应的文件夹
然后在容器的根目录下也可以看到这个文件夹
通过inspect命令可以查询容器的详情
2.1.1数据共享操作
2.1.1.1 宿主机添加相应的文件
2.1.1.2 容器中可以同步看到,然后在容器中修改数据
修改数据
宿主机可以同步到
停止掉容器后,数据仍然存在
2.1.1.3 权限控制:不允许在容器中修改
修改权限
ro:只读的意思
docker run-it-v /宿主机绝对路径:/容器目录:ro 镜像名
2.2 DockerFile方式添加
2.2.1 创建一个文件dockerFile1
宿主机根目录下创建一个mydocker,并在该目录下创建一个文件,内容如下
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
2.2.2 根据dockerFile构建我们的镜像文件
docker build -f dockerFile1 -t biao/centos .
-f DockerFile文件的路径
-t 标签
. 当前的路径
2.2.3 根据新创建的镜像文件创建一个容器
根据新创建的镜像文件创建一个容器,启动后我们可以看到在容器中创建的有对应的目录
2.2.4 查看目录在宿主机的映射目录
这两个目录和宿主机的映射目录在哪呢?这时我们可以通过inspect命令查看
2.2.5 验证
验证就只需要在宿主机创建文件,然后再到容器对应的文件夹中查看即可
3.数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个 容器实现数据共享,挂载数据的容器,称之为数据卷容器
3.1 启动一个父容器
3.2 创建两个父容器
docker run -it --name dc02 --volumes-from dc01 biao/centos
docker run -it --name dc03 --volumes-from dc01 biao/centos
3.3 数据共享
创建了两个子容器后,首先都可以看到dc01中的共享资源。第二个在dc01中修改了共享资源文件后,在两个容器中也是可见的。
注意 :删除dc01父容器后,dc02和dc03两个子容器之间数据还是共享的
注意: 容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
四、DockerFile
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本
1.构建过程
DockerFile中的指令需要满足如下的规则
docker执行一个Dockerfile脚本的流程大致如下:
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
- Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
- Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行Docker镜像时,会真正开始提供务;
- Docker容器,容器是直接提供服务的。
2.DockerFile命令
3.DockerFile案例
我们从官方pull下来的centos是没有vim命令的,我们可以自定义一个镜像,功能比官方提供的强大一点
3.1 创建DockerFile文件
FROM centos
MAINTAINER biao<biao163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "success ------- 66666"
CMD /bin/bash
3.2 构建镜像文件
docker build -f DockerFile文件路径 -t 镜像名称:tag .
例子
[root@biao mydocker]# docker build -f /mydocker/dockerFile2 -t biao/centos:1.7 .
成功:
3.3 运行容器
docker run -it biao/centos:1.7
3.4 测试vim命令