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. C#中get和set属性的作用

    c#在定义类时,通常要把类中声明的对象封装起来,使得外界不能访问这个属性.上述代码中如果去掉set部分,则外界只能读取name的值,如果去掉get部分,则只能给name赋值.这样就可以控制外界对私有属 ...

  2. 用HTML做登录网页

    <html>  <head> 这里是文档的头部 ... ... ...<title>定义文档标题...</title> </head> &l ...

  3. 移动端--用PX为单位+JS框架 实现页面布局

    一:大家先下载metahandler.js 二:准备一个用px实现的移动页面(宽度固定死的页面),引入metahandler.js框架 1.视口设置 width=640,是根据psd图来设置,有多宽设 ...

  4. mysql实现多实例

    > mariadb安装    yum install mariadb-server > 创建相关目录,及设置权限    mkdir /mysqldb; mkdir /mysqldb/{33 ...

  5. CentOS7安装OpenLDAP+MySQL+PHPLDAPadmin

    安装环境:CentOS 7 1.安装和设置数据库 在CentOS7下,默认安装的数据库为MariaDB,属于MySQL数据库的一个分支,所以我还是使用了MariaDB.安装命令为: [root@loc ...

  6. JavaScript视频分享,学无止境。

    http://blog.sina.com.cn/s/blog_735ed39a0102voy3.html

  7. C++的用法心得

    在报这个专业之前就听说C++很难,c++学习了俩个学期,感觉真的很难.自己学着学着就有点放弃了 ,课上没认真听 ,课下也没花时间,就这样浑浑噩噩的度过了大一上学期.后来班主任开班会说学计算机的一定要学 ...

  8. jenkins:一个jenkins项目远程触发另一个jenkins项目构建配置

    很多时候,我们会有这样的应用场景:一个jenkins上的项目构建后,需要远程触发另一台机子上的jenkins中某个项目的构建,可以通过Parameterized Remote Trigger Conf ...

  9. MySQL分布式事物(XA事物)的使用

    有时一个系统的数据 放在不同的库之中.如果用普通的事物 一个分支库提交成功了,另外一个分支库提交失败了, 这候 两个库没有同步的成功或者失败.会导致系统数据的不完整. 对于处理这种情况 MySQL有了 ...

  10. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...