docker 系列(三) - 镜像

  • 再次强调:镜像类似于我们重装系统的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镜像

特点
  1. 最原始的镜像,从 scratch 构建。
  2. 其它镜像都是在它的基础上进行扩展的
哪些

Linux发行版的docker镜像,比如centos,Ubuntu等...

获取

docker pull centos

为什么下载下来的centos那么小?

利用docker images可以查看到我们刚刚拉下来的centos的镜像只有200M的大小,和我们平常看到几个G大小的centos差的有点多。这是因为这里下载的centos其实只是rootfs,不包括bootfs,而bootfs和宿主机共用一套。

docker结构

docker 系列(三) - 镜像_第1张图片
结构图

加载后的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 [email protected]
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构建镜像过程
  1. 从base镜像运行一个容器
  2. 执行一个指令, 对容器进行修改
  3. 执行docker commit的操作,生成一个新的镜像,
  4. docker再基于刚刚提交的镜像运行一个新容器
  5. 以此重复 2-4

相关api

docker history 查看镜像的构建历史

你可能感兴趣的:(docker 系列(三) - 镜像)