- 再次强调:镜像类似于我们重装系统的ISO或者ghost文件,有了镜像我们才可以启动容器。
- 我们可以通过原有的镜像扩展新的镜像。
基础知识
一个典型的 Linux 系统要能运行的话,它至少需要两个文件系统:
boot file system (bootfs)
: 包含 boot loader 和 kernel。用户不会修改这个文件系统。实际上,在启动(boot)过程完成后,整个内核都会被加载进内存,此时 bootfs 会被卸载掉从而释放出所占用的内存。同时也可以看出,对于同样内核版本的不同的 Linux 发行版的 bootfs 都是一致的。
root file system (rootfs)
:包含典型的目录结构,包括 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等再加上要运行用户应用所需要的所有配置文件,二进制文件和库文件。这个文件系统在不同的Linux 发行版中是不同的。而且用户可以对这个文件进行修改。
base镜像
特点
- 最原始的镜像,从 scratch 构建。
- 其它镜像都是在它的基础上进行扩展的
哪些
Linux发行版的docker镜像,比如centos,Ubuntu等...
获取
docker pull centos
为什么下载下来的centos那么小?
利用docker images
可以查看到我们刚刚拉下来的centos的镜像只有200M的大小,和我们平常看到几个G大小的centos差的有点多。这是因为这里下载的centos其实只是rootfs,不包括bootfs,而bootfs和宿主机共用一套。
docker结构
加载后的docker结构图如上所示,蓝色是以Debian为base镜像进行扩展,添加了emacs、Apache的一个新镜像(不包括最上面的container);而黄色是busybox的base镜像。我们可以把docker的镜像结构分成三个部分,最上面是可以读写的容器层(docker容器运行后从镜像中提取并加载到顶部),中间是只读的镜像层,最下面是所有镜像层共用宿主机的内核bootfs。
Dockerfile
扩展镜像的两种方式
- dockerfile
- docker commit(后面再讲)
Dockerfile是什么
dockerfile是一个文本文件,我们可以根据这个文件,使用docker build
构建新的镜像。
举个栗子
在一个新的文件夹中,创建一个名为Dockerfile的文件,并且把下面的代码黏贴进去,保存后执行docker build -t centos-redis .
(注意后面有 . ),此时便生成一个可以快速部署redis服务器的镜像。
FROM centos
MAINTAINER 271967835@qq.com
RUN yum -y update &&yum -y install epel-release&& yum -y install redis&&yum -y install net-tools
EXPOSE 6379
RUN sed -i -e 's@bind 127.0.0.1@bind 0.0.0.0@g' /etc/redis.conf
RUN sed -i -e 's@protected -mode yes@protected -mode no@g' /etc/redis.conf
ENTRYPOINT ["/usr/bin/redis-server","/etc/redis.conf"]
CMD []
参数详解
FROM
指定base镜像
MAINTAINER
指定作者
WORKDIR
指定docker容器的工作目录,登陆docker会进入该目录。
COPY
复制文件 copy src desc
ADD
添加 src desc 唯一的区别是 add 会把tar/gz/zip的src 解压出来
EXPOSE
暴露指定接口
ENV
设置环境变量
RUN
运行命令
CMD
启动容器后运行的命令
ENTRYPOINT
设置容器启动命令
VOLUME
设置文件或者目录为volume
run/cmd/entrypoint 的区别
- RUN 执行命令生成新的镜像
- CMD 容器启动后执行命令,但是会被替代docker命令替代
- ENTRYPOINT 容器启动后执行命令
Dockerfile构建镜像过程
- 从base镜像运行一个容器
- 执行一个指令, 对容器进行修改
- 执行docker commit的操作,生成一个新的镜像,
- docker再基于刚刚提交的镜像运行一个新容器
- 以此重复 2-4
相关api
docker history
查看镜像的构建历史