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. centos7 安装freetype

    1:下载: wget "http://download.savannah.gnu.org/releases/freetype/freetype-2.4.0.tar.bz2" 2:  ...

  2. 贪心-Wooden Sticks

    先将火柴按照长度(或重量)优先排序,在不断遍历数组,找出其中重量(长度)递增子序列,并标记 Problem Description There is a pile of n wooden sticks ...

  3. 算法学习笔记:knn理论介绍

    阅读对象:了解指示函数,了解训练集.测试集的概念. 1.简介 knn算法是监督学习中分类方法的一种.所谓监督学习与非监督学习,是指训练数据是否有标注类别,若有则为监督学习,若否则为非监督学习.所谓K近 ...

  4. The META for Mobile terminal

    近来想写一些好玩的手机网页,在这里整理了一下在手机端的meta标签,以免下次忘记,再去网上搜. meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描 ...

  5. 与我们息息相关的internet服务(2)---WWW服务

    在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的公司网站    网站,在初中,那时浏览一个网页可叫网上冲浪,听起来似乎比洗澡还爽快,可现在这词就是土鳖,网上冲浪火起来主要是应 ...

  6. STM32CubeMX+Keil裸机代码风格(1)

    1.打开STM32CubeMX,New project 选好自己要用的芯片 2.选上左侧SYS中的debug Serial Wire(定义烧程序的端口) . 3,选上左侧TIM6,使TIM6可用(TI ...

  7. ‘params’一个奇妙的东西

    params关键字表示函数的参数是可变个数的,即可变的方法参数,例如Console.WriteLine( "{0},{1} ",i,j); 就像DELPHI 里 WRITELN 函 ...

  8. Mybatis in 查询

    1.先创建一个传参的工具类 import java.util.HashMap; /** * * ClassName: DataMap * @Description: 封装Map, * @date 20 ...

  9. QT汇总

    1.QT介绍及其在Linux下的安装 2.windows下安装QT并与visual studio 2017搭建开发环境 参考资料: QT官网资料 QT实战一二三 Qt资料大全 <Qt 实战一二三 ...

  10. 我的C#跨平台之旅(五):使用IoC之依赖注入实现

    引入NuGet包:Unity 实现接口:IDependencyResolver 在启动类中注入依赖的类: 注意:左框中的内容为接口或抽象类,右框中为实际要注入的类. 修改控制类,使用构造方法注入类: ...