Docker镜像管理基础与基于容器的镜像制作示例

一、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
                        <[email protected]>")
  -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        38 seconds ago      1.2MB
busybox             latest              3a093384ac30        2 weeks ago         1.2MB

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

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

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

~]# docker run --name new1 -it ready/httpd:v0.1
/ # 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.2sha256:d2eee7f29cc73a7bd64487752133772be8dd69fbf6c2f0db92ff07e33bc8c5ee

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

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/readygood/p/10283950.html

时间: 2024-10-05 04:58:45

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

docker入门之镜像管理基础

docker镜像管理基础 首发:arppinging 一.镜像概述 1.1 联合挂载 在之前的文章我们提到过,容器是基于镜像启动的,镜像的存储驱动是overlay2 overlayFS将单个Linux主机上的两个目录合成一个目录,这些目录称为层,统一过程被称为联合挂载. 下图是一个docker镜像和docke容器的分层图,docker镜像是lowdir,docker容器是upperdir.而统一的视图层是merged层.如果一个镜像有多层的话,那么它的启动过程需要进行联合挂载,如下图,cento

Docker 之 基于容器的镜像制作

1  概述 镜像包含启动容器所需的文件系统和内容,可以理解为打包的文件,用于创建并启动docker容器. 镜像的生成途径有三个: 1.基于dockerfile实现,镜像制作的程序文件 2.基于容器实现,启动容器后,将新的操作制作为新镜像 3.docker hub automated builds 镜像文件采用分层构建机制,最底层为bootfs,上面为rootfs,rootfs上还可以有多层.位于最下层的镜像文件为父镜像(parent image),最底层为基础镜像(base image,root

Docker入门(二):容器与镜像常用指令

零.docker常用命令 #镜像名 版本标签 镜像id 创建时间 镜像大小 REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest fce289e99eb9 6 months ago 1.84kB docker version/info #查看版本/信息 docker --help #查看说明文档 docker logs -f -t --tail 日志条数 容器ID #查看容器日志 docker inspect #获取容器/镜像的元数据 一

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

Dockerfile 支持系统启动 运行ssh 服务 原文链接:http://blog.csdn.net/kongxx/article/details/38395305 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "[email protected]" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y ope

docker容器管理基础

1.命令: docker info #查看服务器上docker详细信息 docker search #搜索镜像 docker image pull nginx:1.14-alpine #下载一个镜像 docker image ls #查看镜像 docker rmi -f image id #删除镜像 -f:强制删除 docker rm 容器名 #删除容器 docker run --name b1 -it busybox:latest #启动一个容器 -it:交互运行 b1:名字 docker r

Docker容器——镜像管理,端口映射,容器互联

docker镜像的分层  Dockerfile 中的每个指令都会创建一个新的镜像层: 镜像层将会被缓存和复用: 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效: 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效: 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式 可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建 基于

Docker容器之镜像管理、端口映射、容器互联

docker镜像的分层 ?Dockerfile 中的每个指令都会创建一个新的镜像层:?镜像层将会被缓存和复用:?当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效:?某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效:?镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建基于本地

Docker容器之镜像管理,端口映射,容器互联

docker镜像的分层 Dockerfile 中的每个指令都会创建一个新的镜像层: 镜像层将会被缓存和复用: 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效: 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效: 镜像层是不变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然包含该文件 docker镜像 是应用发布的标准格式 可支撑一个docker容器的运行 docker镜像的创建方法 基于已有镜像创建 基于本

10张图带你深入理解Docker容器和镜像

图解Docker容器和镜像 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对Docker技术还是一知半解的时候,我发现理解Docker的命令非常困难.于是,我花了几周的时间来学习Docker的工作原理,更确切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来再看Docker的命令,一切变得顺理成章,简单极了. 题外话:就我个人而言,