目录

知识点1:镜像的分层

示例:进入 docker hub查看Jenkins的Dockerfile

知识点2:base镜像

知识点3:scratch镜像

scratch 镜像是什么?

示例:在docker hub里面查看busybox的Dockerfile,

知识点4:bootfs 和 rootfs

知识点5:为什么Docker镜像要采用这种分层结构?

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?

可写层的概念:

Cpoy-on-Write

知识点6:制作一个busybox镜像

1、编写Dockerfile

ENTRYPOINT和CMD的区别

2、编写while.sh

3、制作镜像

4、启动容器,使用镜像

给while.sh赋予可执行权限


知识点1:镜像的分层

镜像:镜像是一个软件单元

镜像是各个不同的层组合而成的,这就是镜像的分层

        最底层是基础镜像  --   base  images

镜像里的系统使用宿主机的内核,基础镜像里面有操作系统,

[root@sc-docker-server mydocker]# vim Dockerfile
FROM python:2.7-slim
WORKDIR /app # 进入到容器后进入的文件夹
ADD . /app # 将linux系统当前目录下的内容到容器的/app目录下,类似于docker cp
RUN pip install --trusted-host  pypi.python.org -r requirements.txt  # 在容器内部执行的命令
EXPOSE 80   # 暴露80端口
ENV NAME World   # 定义了环境变量NAME赋值world
ENV AUTHOR cali  # 定义了环境变量AUTHOR ccali
CMD ["python","app.py"]  # 容器启动的时候执行命令  python app.py

 在镜像制作的过程中,每执行一次RUN命令,镜像就会多一些内容,镜像就会大一些

镜像是要加载到容器里面去运行的,一个容器对应一个进程,进程是需要消耗cpu和内存的。

示例:进入 docker hub查看Jenkins的Dockerfile

 FROM openjdk:8-jdk  :  指定镜像使用的基础镜像  --  》底座

                                        因为jenkins是使用java开发的软件,必须有java环境 jdk

知识点2:base镜像

base镜像有两层含义

1. 不依赖其他镜像,从 scratch 构建。
2. 其他镜像可以之为基础进行扩展。

base镜像通常都是各种linux发行版的Docker镜像,例如Ubuntu,Debian,Centos等

知识点3:scratch镜像

scratch 镜像是什么?

scratch是最基础的一个空白镜像,可以用于构建busybox等超小镜像,可以说实真正的从零开始构建属于自己的镜像

示例:在docker hub里面查看busybox的Dockerfile,

busybox镜像是使用功scratch作为基础镜像的,如果被容器使用的话,只有一个shell解释器,

知识点4:bootfs 和 rootfs

bootfs --》容器启动的时候需要的内容,是linux kernel 提供了 bootfs     boot 启动/引导  fs  file system,容器启动后,bootfs会被卸载

                 对于 base 镜像来说,底层直接用 宿主机 的 kernel,kernel 会提供bootfs  自己只需要提供 rootfs 就行了。

rootfs --》容器内部的操作系统,镜像里的操作系统提供的  root :根   file system,

                rootfs加载完成后,容器里就形成了一个封闭的环境。类似于一个操作系统的环境

                里面有 /dev  /proc  /bin /etc/  /usr  /tmp 等

不同linux 发行版的区别主要就是rootfs的区别

知识点5:为什么Docker镜像要采用这种分层结构?

最大的好处是:共享资源

例如:有多个镜像都是从相同的base镜像构建而来,那么只需要再Docker 宿主机上面保存一份base镜像,同时内存中也只需要加载一份base镜像

        就可以为所有容器服务了,而且镜像的每一层都可以被共享,可以节约磁盘和内存资源

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?

可写层的概念:

当容器启动时,一个新的可写层会被加载到镜像的顶部,这一层通常被称作 容器层,容器层之下的都叫镜像层

 镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统

Cpoy-on-Write

容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改

所有对容器的改变,无论是添加,删除,还是修改都只会在容器层发送

容器启动的时候是自下而上,容器读数据是自上而下的 

1、添加文件

在容器中创建文件时,新文件被添加到容器层中

2、读取文件

在容器中读取某个文件时,Docker会从上往下依次在各进行层中查找此文件,一旦找到,打开并读入内存

3、修改文件

在容器中修改已存在的文件时,Docker会从上往下依次在各镜像层中查找这个文件,一旦找到,立即将其复制到容器层,然后修改

4、删除文件

在容器中删除文件时Docker也是从上往下依次在镜像层中查找此文件,找到后,会在容器层中记录下次删除操作。

示例:制作一个镜像,观察容器层的变化

[root@docker1 scdocker]# cat Dockerfile
FROM centos:7
RUN yum install vim -y
RUN yum install net-tools tree -y
RUN mkdir /sanchuang
RUN touch /sanchuang/fengdeyong{1..10}.txt
RUN rm -rf /sanchuang/fengdeyong1.txt
CMD ["/bin/bash"]
[root@docker1 scdocker]# docker build -t sccentos:7.9 .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM centos:7---> eeb6ee3f44bd
Step 2/7 : RUN yum install vim -y---> Running in 93af96c0310c
Loaded plugins: fastestmirror, ovl
...........
..........
Complete!
Removing intermediate container 4a96fbf70500---> 6fa74b2106fa
Step 4/7 : RUN mkdir /sanchuang---> Running in 3a1cf78d4ca0
Removing intermediate container 3a1cf78d4ca0---> 01a4d2f21282
Step 5/7 : RUN touch /sanchuang/fengdeyong{1..10}.txt---> Running in c25513038189
Removing intermediate container c25513038189---> f39a961d3899
Step 6/7 : RUN rm -rf /sanchuang/fengdeyong1.txt---> Running in f6dc4e06812b
Removing intermediate container f6dc4e06812b---> 56c7f9f45d6f
Step 7/7 : CMD ["/bin/bash"]---> Running in 3f959c0752c6
Removing intermediate container 3f959c0752c6---> c66b1be73d66
Successfully built c66b1be73d66

Removing intermediate container 4a96fbf70500 

每执行一次操作,都会产生一个临时的容器,来执行操作,执行完成后就会删除这个临时容器

CMD ["/bin/bash"]

CMD里面接的命令,必须一致在容器里面运行,在前台运行,

只要容器里运行的命令结束,容器就会退出

知识点6:制作一个busybox镜像

1、编写Dockerfile

[root@docker1 busybox]# cat Dockerfile
FROM busybox
COPY . /
RUN cat /hello.txt
ENTRYPOINT ["/bin/sh","/while.sh"]

ENTRYPOINT :指定启动容器的时候运行的命令

 executable :可执行程序

param1:参数1

param2:参数2

ENTRYPOINT和CMD的区别

1、docker run 启动容器的时候,可以传递参数进入给ENTYRPOINT 里面的命令

2、当2者都存在的时候,CMD里的内容会成为ENTRYPOINT里的参数(位置参数)

2、编写while.sh

[root@docker1 busybox]# cat while.sh
#! /bin/bash
i=1
while:
doecho "hello world,sanchuang $i"let i++sleep 1done
[root@docker1 busybox]# ls
Dockerfile  hello.txt  while.sh

Dockerfile 制作镜像的配置文件

        hello.txt 故意放到容器里的,要来验证从宿主机复制文件到容器里面

        while.sh 真正在容器里面运行的程序

3、制作镜像

[root@docker1 busybox]# docker build -t scbusybox:1.0 .
Sending build context to Docker daemon  4.096kB
Step 1/4 : FROM busybox
latest: Pulling from library/busybox
2c39bef88607: Pull complete
Digest: sha256:20142e89dab967c01765b0aea3be4cec3a5957cc330f061e5503ef6168ae6613
Status: Downloaded newer image for busybox:latest---> c98db043bed9
Step 2/4 : COPY . /---> 2cffc30469ea
Step 3/4 : RUN cat /hello.txt---> Running in 776107d1c216
welcome to sanchuang!
Removing intermediate container 776107d1c216---> 20a16576f67a
Step 4/4 : ENTRYPOINT ["/while.sh"]---> Running in 9b742e805ee6
Removing intermediate container 9b742e805ee6---> 7fb76760295e
Successfully built 7fb76760295e
Successfully tagged scbusybox:1.0
[root@docker1 busybox]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED             SIZE
scbusybox    1.0            7fb76760295e   40 seconds ago      1.24MB

4、启动容器,使用镜像

会报错,因为while.sh没有可执行权限

[root@docker1 busybox]# docker run -d --name scbusybox-1 scbusybox:1.0
e19ac4541e0908bcc60c5b685a7968a35f9f600a3d307095c3c5ab64920613ee
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/while.sh": permission denied: unknown.
[root@docker1 busybox]# ls
Dockerfile  hello.txt  while.sh
[root@docker1 busybox]# ll
总用量 12
-rw-r--r--. 1 root root 66 9月   3 16:48 Dockerfile
-rw-r--r--. 1 root root 22 9月   3 17:34 hello.txt
-rw-r--r--. 1 root root 84 9月   3 17:38 while.sh

给while.sh赋予可执行权限

[root@docker1 busybox]# chmod +x while.sh
[root@docker1 busybox]# ll
总用量 12
-rw-r--r--. 1 root root 66 9月   3 16:48 Dockerfile
-rw-r--r--. 1 root root 22 9月   3 17:34 hello.txt
-rwxr-xr-x. 1 root root 84 9月   3 17:38 while.sh

还是会报错,因为我们只是在宿主机上面修改了,但是镜像里面还没有修改,所以我们要重新制作镜像

[root@docker1 busybox]# docker run -d --name scbusybox-2 scbusybox:1.0
40b729eeede30cfb75119001c6ad489ead452322ced8188b5f2306534c37e135
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/while.sh": permission denied: unknown.
[root@docker1 busybox]#
[root@docker1 busybox]# docker build -t scbusybox:1.1 .
Sending build context to Docker daemon  4.096kB
Step 1/4 : FROM busybox---> c98db043bed9
Step 2/4 : COPY . /---> ec25c9060e17
Step 3/4 : RUN cat /hello.txt---> Running in ec27802a5ca9
welcome to sanchuang!
Removing intermediate container ec27802a5ca9---> d10143844fcb
Step 4/4 : ENTRYPOINT ["/while.sh"]---> Running in f698d042c7fd
Removing intermediate container f698d042c7fd---> 4883eded6503
Successfully built 4883eded6503
Successfully tagged scbusybox:1.1

然后启动容器

[root@docker1 busybox]# docker run -itd --name scbusybox-6 scbusybox:1.1
2e55c707993466b6f13ee004ad022790219dacbdbceb21b3a63503aa3100727b
[root@docker1 busybox]# docker ps
CONTAINER ID   IMAGE           COMMAND               CREATED         STATUS        PORTS     NAMES
2e55c7079934   scbusybox:1.1   "/bin/sh /while.sh"   2 seconds ago   Up 1 second             scbusybox-6

Docker - 镜像的分层 - busybox镜像制作相关推荐

  1. Docker镜像的分层和镜像的创建(Dockerfile)

    目录 一.docker镜像分层(基于AUFS构建) 二.镜像分层模型 三.Dockerfile结构四部分 操作指令 四.实验 1.nginx镜像 2.构建ssh镜像 3.Tomcat镜像 一.dock ...

  2. docker 仓库镜像 替换_自己动手创建 Docker 镜像并分享到镜像仓库,容器引擎的用途越来越广泛!...

    ↑ 点击上面 "时代Java"关注我们,关注新技术,学习新知识! 前面在公众号里讲过Docker安装和基本用法和概念,新来的小伙伴可以先去学习一下: docker yum快速安装和 ...

  3. Docker容器(配置+镜像建立及优化+镜像加速器制作)

    一.docker简介 Docker是管理容器的引擎. Docker为应用打包.部署平台,而非单纯的虚拟化技术 1.VM vs Container 2.传统虚拟机和容器的技术对比 3.容器是如何工作的 ...

  4. Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像

    文章目录 Docker的安装 Docker的使用:docker run命令 查看本地存在的镜像:docker images命令 编写Dockerfile,制作容器镜像 docker build制作镜像 ...

  5. [docker]七、docker镜像的制作(超详细)、docker镜像结构原理、镜像的分享——harbor

    目录 1.镜像(images) 1.1.Dockerfile:是制作镜像的文件 2.镜像结构原理 2.1.base 镜像 2.1.1.rootfs和bootfs 2.1.2.base 镜像提供的是最小 ...

  6. java基础巩固-宇宙第一AiYWM:为了维持生计,架构知识+分+微序幕就此拉开之Docker(Docker概念:容器、镜像、仓库)、操作命令、Docker网络、分层、K8S<->Docker~整起

    架构知识+分+微序幕就此拉开之Docker 一.为什么要搞这个Docker,咱们为啥要学,盖房子? 二.Docker的镜像与容器 1.预备知识:虚拟(机).容器(化) 2.Docker.镜像.容器 3 ...

  7. 系统制成docker镜像_Docker学习以及镜像制作流程

    一.何为Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后 ...

  8. docker中使用golang:alpine镜像制作开启goweb的dockerfile

    docker中使用golang:alpine镜像制作开启goweb的dockerfile go的web代码 package mainimport("net/http""f ...

  9. Linux拉取代码启动镜像,基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法...

    基于Linux源代码及Busybox源代码制作精简可启动内核镜像技术实验方法总结 熊海泉 内核源代码 下载地址 这里下载的是linux-2.6.38.tar.bz源代码 下载地址 这里下载的是busy ...

最新文章

  1. mysql减少锁等待_降低锁竞争 减少MySQL用户等待时间
  2. 分析JVM双亲委派模型的类加载源码 自定义类加载器
  3. POJ3272 Cow Traffic
  4. 支持 简体,繁体,英文的js日历控件
  5. 【numpy】20道numpy题目
  6. 优秀的程序员都避开了哪些坑?
  7. android通过xmpp实现服务器到客户端的推送功能
  8. mysql 再查询结果的基础上查询(子查询)
  9. IDEA 常用快捷键与设置
  10. javascript/js计算器的基础制作
  11. web资源优化-图片篇(一)
  12. 实验2014052801:动态网页中的动态思想
  13. 通达信筹码循环指标源码 显示吸筹拉升出货的过程
  14. 微信小程序简单留言板
  15. 拼音翻译为阿拉伯数字
  16. 把Excel里的url链接转换为图片显示
  17. 天池- IJCAI-18 阿里妈妈搜索广告转化预测新手入门经历(一:数据预处理、特征工程)
  18. BZOJ[3620]似乎在梦中见过的样子 KMP
  19. 这可能是目前最方便的网站中英文切换(理论支持所有语言)
  20. The CompactFlash Association宣布推出CFexpress(R)2.0规范

热门文章

  1. C语言-判断语句if-else
  2. 社区共建合作须知:合作者实现美好的故事
  3. 苹果cms如何去掉首页帮助提示信息模板
  4. Office 文档在线预览
  5. 读后感:物以类聚,人以群分--走出软件作坊:三五个人十来条枪 如何成为开发正规军(十一)
  6. 中国大学MOOC-陈越、何钦铭-数据结构-2019夏
  7. WEB创业的十条规则
  8. 必胜客联合创办人去世 享年82岁
  9. Joel的比尔盖茨评审回忆
  10. iphone开发中图标的设置