文章目录
一、docker镜像分层
docker里的镜像绝大部分都是在别的镜像的基础上去创建的,也就是使用镜像的分层结构。一个docker镜像由多个可读的镜像层组成,然后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层。因此任何对容器均不会影响到镜像。如果需要获取某个文件,那么容器会从上到下去下一层的镜像层去获取文件,如果改层文件不存在,那么就会去下一层镜像层去继续寻找,直到最后一层。对于用户而言,用户面向的是一个叠加后的文件系统。
二、镜像分层的好处
1、基本上每个软件都是基于镜像去运行的,因此一旦某个底层的环境处了故障,就不需要去修改全部基于这个镜像的软件的镜像,只需要修改底层环境的就好了
2、资源共享。其他相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像去创建一个底层环境。
三、docker镜像的创建方法
3.1 基于已有的镜像容器创建
[root@localhost ~]# docker commit -m "test" -a "yun" 41 nginx:new
sha256:aabae718c1f67ec9fcd3264e350721c95422cb155820a9321cdfe72649c4ef96
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx new aabae718c1f6 2 seconds ago 133MB
nginx latest 871e34536e32 3 minutes ago 133MB
3.2 基于本地模板创建
[root@localhost ~]# ll
total 964
-rw-------. 1 root root 1259 Feb 18 21:09 anaconda-ks.cfg
-rw-r--r--. 1 root root 981687 Mar 11 10:12 nginx-1.12.2.tar.gz
[root@localhost ~]# cat nginx-1.12.2.tar.gz | docker import - nginx:newsha256:f8ddca0f19d9ca95049ecffa743c6bcf5548e82509a1ca06266a34c3a2c36d9e
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx new f8ddca0f19d9 7 seconds ago 5.8MB
3.3 基于Dockerfile创建
3.3.1 什么是dockerfile?
dockerfile是一个包含用于组合映像的命令文本文档。可以使用在命令行中调用任何命令。docker通过读取dockerfile中的指令自动生成映像。docker bulid命令用于从dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的dockerfile
3.3.2 dockerfile的基本机构
dockerfile一般分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行的指令。“#”为dockerfile中的注释
3.3.3 dockerfile常用的指令
- FROM——指定基础镜像,必须为第一个命令
## 格式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
## 注意:tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
- MAINTAINER: 维护者信息
MAINTAINER <name>
- RUN:构建镜像时执行的命令
run用于在镜像容器中执行命令,有两种命令执行方式:
## shell执行
RUN <command>
## exec执行
RUN ["executable", "param1", "param2"]
## 注意:RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数
- ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
- COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
- CMD:构建容器后调用,也就是在容器启动时才进行调用
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD