一、Docker镜像

  Docker镜像是启动Docker容器的一个非常重要的组件。Docker各组件之间的关系如图:

  Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建并启动容器。并且Docker镜像是采用分层构建,联合挂载的机制实现的。那什么是分层构建,联合挂载呢?如图:

  在分层构建机制中,最底层为bootfs,用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节省内存资源。在bootfs之上的是rootfs,这里就是docker容器的根文件系统,要指出的是在docker中,由内核挂载为“只读模式”,而后通过“联合挂载”额外挂载一个可写层。

  例如我们需要做一个httpd的Docker镜像,通常是在一个最小的Linux系统之上利用分层构建技术再新建一个层用来构建httpd服务。所有的写操作都只能在writable层实现。

二、Overlayfs和Aufs

  要实现分层构建需要特殊的文件系统来支持,最早是使用Aufs,但现在Docker中默认的是使用Overlayfs。

三、Docker Registry

  启动容器时,Docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从Registry中下载该镜像并保存到本地,在不指定Registry时会默认指向dockerhub。Docker Registry分类:Sponsor Registry、Mirror Registry、Vendor Registry、Private Registry。

  Registry是由repository和index组成。repository可分为顶层仓库和用户仓库,用户仓库的格式为“用户名/仓库名”。镜像的开发与维护:

四、基于容器的Docker镜像制作示例

  下面举一个简单的小例子:在busybox镜像的基础上制作一个网页镜像,每次启动运行这个镜像时,这个网页页面都会自动存在并运行。

  1.启动一个最小系统,如busybox,创建一个页面:

]# docker run --name box1 -it busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # mkdir -p /data/html
/ # vi /data/html/index.html
<h1>Hello Docker.</h1>

  2.保证容器处于运行状态,使用docker commit命令制作:

~]# docker commit -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith
<hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the
created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true) #容器运行时还在不停的生成新文件,为了完整性,可以使用这一选项。
~]# docker commit -p box1
sha256:15cb8525323f4287b2977b4f0d4809421aaab194b39985ad8f3cd32b9a721bc9
~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 15cb8525323f seconds ago .2MB
busybox latest 3a093384ac30 weeks ago .2MB

  <none>就是刚才制作的的镜像,因为没有指定Repository名和Tag所以显示为<none>。为了使用便利,也可以用 docker tag 打上标签和Repository名:

~]# docker tag 15cb8525323f ready/httpd:v0.
~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ready/httpd v0. 15cb8525323f minutes ago .2MB
busybox latest 3a093384ac30 weeks ago .2MB

  启动镜像,可以看到文件都在:

~]# docker run --name new1 -it ready/httpd:v0.
/ # ls data/html/index.html
data/html/index.html
/ #

  3.查看docker容器启动时默认运行的程序

  用 docker inspect 命令可以查看容器启动时默认运行的程序:

~]# docker inspect new1
...略去...
"Cmd": [
"sh" #说明启动时默认运行的是shell
    ]
...略去...
~]# docker inspect nginx:1.14-alpine
"Cmd": [
"nginx",
"-g",
"daemon off;" #nginx必须运行在前台,不然就代表启动即停止
]

  用 docker commit 修改容器启动时默认运行的程序:

~]# docker commit -a "Ready" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p new1 ready/httpd:v0.2
sha256:d2eee7f29cc73a7bd64487752133772be8dd69fbf6c2f0db92ff07e33bc8c5ee

  -a :是指明作者,-c :是修改默认配置,上面的示例只是修改了CMD的参数。

  启动新镜像,现在默认运行的不是shell了,所以不使用-it选项:

~]# docker container run --name new2 ready/httpd:v0.

  再启一个终端,用curl命令就可以直接访问这个容器的页面了:

~]# curl 172.17.0.2
<h1>Hello Docker.</h1>

4.做好容器后就能根据需要push到容器仓库中了

  可以根据实际情况push到docker hub或者阿里云的容器仓库,或者其他的仓库。

  虽然这个容器中的httpd服务和网页都已经搭建好了,但只有容器的宿主机和同一宿主机上的其他容器能够访问这个页面,这是因为容器的网卡是链接在宿主机上的虚拟网卡上的,如果要外部能访问容器的网页,需要打开宿主机Linux的核心转发功能。

Docker镜像管理基础与基于容器的镜像制作示例的更多相关文章

  1. Docker镜像管理基础篇

    Docker镜像管理基础篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker Images Docker镜像还有启动容器所需要的文件系统及其内容,因此,其用于创建并启 ...

  2. 3、Docker镜像管理基础

    Docker image     # docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis -alpine 23d561d12e92 d ...

  3. Docker创建支持ssh服务的容器和镜像

    原文链接:Docker创建支持ssh服务的容器和镜像 1. 这里使用的centos作为容器,所以首先下载centos的images # sudo docker pull centos 2. 下载后执行 ...

  4. Docker 学习3 Docker镜像管理基础

    一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...

  5. docker第三篇 镜像管理基础

    docker 工作原理: 常用的命令docker run .create .start... 都是客户端命令 Docker Daemon 接收到客户端传过来的命令以后 docker daemon会根据 ...

  6. 3.docker镜像管理基础

    一.docker镜像相关 1.About Docker Image Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器. 采用分层构建机制,最底层为bootf ...

  7. Docker基于容器创建镜像

    docker commit -m "提交信息" -a "作者信息" imgId imgName

  8. docker镜像管理基础

    [root@node01 ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64 v0.10.0-amd64: Pulling from coreos ...

  9. UVM基础总结——基于《UVM实战》示例

    一.前言 工作一直在做SoC验证,更关注模块间的连接性和匹配性,所以相比于擅长随机约束激励的UVM来说,定向测试的概念更容易debug.当然前提是IP已经被充分验证.因此觉得接触UVM的机会较少.到现 ...

随机推荐

  1. Oracle创建物化视图

    1.物化视图语法 create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | s ...

  2. Runnable和Callable 的区别

    Runnable和Callable 的区别 01.Runnable接口中只有一个run()没有返回值 没有声明异常   Callable接口中只有一个call()有返回值 有声明异常 02.Calla ...

  3. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  4. self_vs_default_definee_vs_receiver

    最近在学习ruby的过程遇到很多有趣的博客,随记录学习,这篇学习笔记摘自http://yugui.jp/articles/846 #self ruby中self无处不在,或是显示的调用或是隐含调用,方 ...

  5. 【转】RPC介绍

    转自:http://www.cnblogs.com/Vincentlu/p/4185299.html 摘要: RPC——Remote Procedure Call Protocol,这是广义上的解释, ...

  6. 网络编程 —— UPD

    UDP协议(数据报协议:SOCK_DGRAM) udp是无链接的,先启动哪一端都不会报错 udp协议的特点: 传输数据不可靠,发送完后没有确认就删除 传送内容可为空 对于查寻速度快 支持的是一对多的模 ...

  7. Centos6.5---samba文件共享服务配置(一)

    Linux---------samba文件共享服务配置(一) samba是一个实现不同操作系统之间文件共享和打印机共享的一种SMB协议的免费软件. https://www.cnblogs.com/zo ...

  8. spring-data-redis和jedis版本对应收集总结

    基于spring主版本为4.3.13.RELEASE的项目,测试以下对应版本可用. spring-data-redis版本 jedis版本 备注 1.5.2.RELEASE 2.7.3   1.6.0 ...

  9. Using iSCSI On Ubuntu 10.04 (Initiator And Target)

    This guide explains how you can set up an iSCSI target and an iSCSI initiator (client), both running ...

  10. Idea环境下git 图形化操作

    大家好,之前我们介绍了<IDEA环境下GIT操作浅析之一Idea下仓库初始化与文件提交涉及到的基本命令>和<IDEA环境下GIT操作浅析之二-idea下分支操作相关命令>,本文 ...