Docker 使用镜像创建容器的过程:现在本机查找有无该镜像,如果不存在,就去官方Docker Hub 仓库查找并下载到本机,然后基于该容器创建容器。
docker run --name gitlab-redis -d sameersbn/redis:latest
镜像分层
Docker 镜像采用分层机制,相同部分独立成层,所以,相同部分只需要存储一份即可,大大节省了镜像空间。
Docker镜像的两个特性:
- 一个已有的分层只能读不能修改
-
上层镜像的优先级高于底层镜像
举例:
image.png
通过修改读写层生成镜像(通过容器的方式创建镜像)存在的弊端:会导致镜像的层数越来越多,允许的最大层数为128;底层镜像修改,影响大量的上层镜像。
Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。
在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建
语法规则:
- From:表示新的镜像从以那个镜像为基础进行构建
- MAINTAINER:指定镜像的创建者
- ENV:设置环境变量
- RUN:运行shell命令,如果有多条命令可以用 && 连接
RUN apt-get update
RUN [ "apt-get", "update" ]
- COPY:将编译机本地文件拷贝到镜像文件系统中
- EXPOSE:指定监听的端口
- ENTRYPOINT:创建的容器启动后才执行
- CMD:和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。
上下文路径:
上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。
注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。