1. 镜像image

镜像和容器的关系就和安装包和程序的关系一样,有了镜像才可以启动容器,容器是镜像的一个运行实例。

1.1 镜像的结构

通过第二节仓库,可能很多看官已经查看到镜像是分层的,接下来将对镜像进行详细介绍。首先,通过一个我们最熟悉对hello-world开始入门。此处涉及很多关于镜像对命令。

  • 通过docker pull一个镜像
[centos@jiliguo ~]$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for hello-world:latest
  • 通过docker images查看镜像
[centos@jiliguo ~]$ docker images hello-world
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        3 months ago        1.84kB
  • 通过docker run运行镜像
[centos@jiliguo ~]$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

那么这个镜像包含写什么呢?我们查看一下构建该镜像对dockerfile文件
https://hub.docker.com/
查找hello-world镜像
在Supported tags and respective Dockerfile links选择一个查看即可

FROM scratch
COPY hello /
CMD ["/hello"]

这个文件就三行,其含义是 from一个基础镜像,拷贝hello文件,容器启动时执行hello文件。这里基础镜像是scratch,其含义是从0开始对,没有依赖其他镜像。
我们看看nginx这个镜像对dockerfile。

FROM debian:stretch-slim

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"

ENV NGINX_VERSION 1.14.2-1~stretch
ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
# run后面太长了,省略下
RUN ....
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
    && ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80

STOPSIGNAL SIGTERM

CMD ["nginx", "-g", "daemon off;"]

通过nginx可以看出,它是依赖于debian镜像对基础上创建的。

接下来将通过nginx的dockerfile文件详细介绍docker镜像的结构
dockerfile文件里,每一个命令都可以看成一层,第一层 from,第二层label,第三层env,第四层也是env。这样描述可能不是很清晰,接下来我们通过nginx的dockerfile构建一个镜像。让各位更加直观的感受下docker镜像分层。
-----一个尴尬的分割线,还是毕竟长----- 看一部分哈

[centos@jiliguo docker]$ docker build -t mynginx:v1.0 .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM debian:stretch-slim
stretch-slim: Pulling from library/debian
27833a3ba0a5: Already exists
Digest: sha256:bade11bf1835c9f09b011b5b1cf9f7428328416410b238d2f937966ea820be74
Status: Downloaded newer image for debian:stretch-slim
 ---> c08899734c03
Step 2/9 : LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"
 ---> Running in d01ec5c5a51c
Removing intermediate container d01ec5c5a51c
 ---> 2c123195c3f6
Step 3/9 : ENV NGINX_VERSION 1.14.2-1~stretch
 ---> Running in 0adfc50e4af7
Removing intermediate container 0adfc50e4af7
 ---> 088f48b30338
Step 4/9 : ENV NJS_VERSION   1.14.2.0.2.6-1~stretch
 ---> Running in 6f1ed07ec93b
Removing intermediate container 6f1ed07ec93b

再次确认了每行都是一层了吧。

1.2 分层结构

其实分层有个很大的优势,因为他将一个镜像分层了,则层之间是可以资源复用的,怎么说呢。如果我们需要对nginx再封装多个服务,则这多个服务对nginx层是可以复用的,这样的话就只需要保留一个nginx镜像。

note:即使复用了一些层,但是各个容器是相互隔离的,并不会因为某个容器修改了一个文件,另一个容器相对的文件也被修改了。

在容器启动的后,容器整个架构就在最上层存在一个容器层,下面都是镜像层,只有容器层是可写的。所有对容器修改等操作都发生再容器层。

1.3 镜像相关命令

  1. docker images 查看镜像
  2. docker pull 获取镜像
  3. docker push 上传镜像
  4. docker build 构建镜像
  5. docker search 查找镜像
  6. docker tag 给镜像打标签
  7. docker rmi 删除镜像
  8. docker save/load 保存/加载镜像
  9. docker commit 构建镜像

菜鸟系列docker——docker镜像上(3)的更多相关文章

  1. docker自定义镜像上传阿里云

    1.alpine制作jdk镜像 2.Alpine制作jre镜像(瘦身) 3.Docker镜像上传至阿里云 alpine制作jdk镜像 alpine Linux简介 1.Alpine Linux是一个轻 ...

  2. Docker本地镜像上传到阿里云仓库

    登录阿里云 在容器镜像服务中先创建命名空间 随后创建镜像仓库 我使用的代码源是本地仓库 创建后点击仓库的管理 就可以看到阿里云提供的操作指南 (下面的操作每个人都不同,详情查看阿里云的操作指南) 输入 ...

  3. Docker在Linux上运行NetCore系列(二)把本地编译好的镜像发布到线上阿里云仓库

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 开始 本篇文章结束在本地创建完成镜像后, ...

  4. 菜鸟系列docker——docker镜像下(5)

    1. docker镜像构建 该章节主要介绍2种构建docker镜像的方式.当然,当前基本上需要的基础镜像都有,直接使用即可.例如数据库.中间件之类的,只需要拿来使用即可,但是依然存在需要开发者构建镜像 ...

  5. 菜鸟系列docker——docker镜像中(4)

    docker镜像命令 该章节主要介绍docker image相关命令实践操作,建议都一起跑一边 1. docker images 列举本机docker镜像 [centos@jiliguo docker ...

  6. Docker在Linux上运行NetCore系列(三)在Linux上使用Docker运行Asp.NetCore

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 开始说明 上几篇文章都是通过Linux运 ...

  7. Docker在Linux上运行NetCore系列(五)更新应用程序

    转发请注明此文章作者与路径,请尊重原著,违者必究. 本篇文章与其它系列文章不同,为了方便测试,新建了一个ASP.Net Core视图应用. 备注:下面说的应用,只是在容器中运行的应用程序. 查看现在运 ...

  8. Docker在Linux上运行NetCore系列(四)使用私有Nuget与多个本地包引用运行ASPNetCore

    转发请注明此文章作者与路径,请尊重原著,违者必究. 本篇文章演示了使用Dockerfile在Linux(ubuntu16.04)系统上构建ASPNetCore应用,并且在一个解决方案中存在多个项目之间 ...

  9. Docker在Linux上运行NetCore系列(一)配置运行DotNetCore控制台

    转发请注明此文章作者与路径,请尊重原著,违者必究. 系列文章:https://www.cnblogs.com/alunchen/p/10121379.html 本篇文章操作系统信息 Linux:ubu ...

随机推荐

  1. 人工智能&物联网开发的目录

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  2. HTML表单标签

    <form>标签 1.在HTML中,<form></form>标记对用来创建一个表单,即定义表单的开始和结束位置,在标记对之间的一切都属于表单的内容.每个表单元素开 ...

  3. jtag、在线仿真器

    指令集模拟器 1.部分集成开发环境提供了指令集模拟器,可方便用户在PC机上完成一部分简单的调试工作,但是由于指令集模拟器与真实的硬件环境相差很大,因此即使用户使用指令集模拟器调试通过的程序也有可能无法 ...

  4. es6剩余参数

    function show(a,b,...args){ console.log(a) console.log(b) console.log(args) } show(10,20,30,30,36)

  5. 信号量(Semaphore)

    在python的多线程体系中,一共有4种锁: 同步锁(互斥锁):Lock: 递归锁:RLock: 信号量:Semaphore: 同步条件锁:Condition. 信号量(semaphore)是一种可以 ...

  6. usb2.0、usb3.0、usb3.1、type-c 接口含义与区别

    简单说: usb3.0 比2.0的传输速率快,充电快,能向下兼容2.0 usb3.1 通常是指 usb3.1 gen2,比3.0的传输速率更快.充电更快,同兼容 type-c 通常是指 usb3.1的 ...

  7. Cookie的使用(14)

    一:cookie的简要介绍: (1)什么是cookie a.cookie是一种客户端的状态管理技术b.当浏览器向服务器发送请求的时候,服务器会将少量的数据以set-cookie消息头的方式发送给浏览器 ...

  8. 两个VirtualBox版本装的语言不一样?

    两个VirtualBox版本装的语言不一样? 1.这个是我用的两个版本的VirtualBox. 2.用这个 VirtualBox-4.3.20-96997-Win.exe安装的时候,一直是英文. 3. ...

  9. 剑指C++面试

    传闻公司老总欠下巨款,带着小姨子跑路了~  树倒猢狲散,接下来要好好准备面试,以期找到一份满意的工作. 面试准备分下面几个方面进行,形成面试系列文章,文章内容以问答的方式呈现. 1.C++语言基础 传 ...

  10. MySQL9:索引实战

    索引 无论是面试,还是实际工作中,对于一个Java程序员来说,数据库优化是避不开的一个技术点,关于数据库的优化,在性能达不到要求的情况下,我大致给出以下几个方向: (1)优化表结构,对常用字段和非常用 ...