docker(三):docker镜像管理

一、基本介绍

  1. docker镜像是容器启动的基础,镜像里面包含容器启动所需要的文件系统及其内容。docker镜像采用分层构建的机制,这种分层大致分为两部分,一部分是最底层的引导文件系统bootfs,类型有aufs,btffs或者overlay2等;另一部分真正让用户来构建用户空间并运行进程的容器称为rootfs。

    • bootfs:用于引导文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节约内存资源。(这里说的卸载,是从内存中移除而不是删除)
    • rootfs:位于bootfs之上,表现为docker的根文件系统,比如/dev、/bin之类。
      • 传统模式中,系统启动时,内核挂载rootfs时会先将其挂在为”只读“模式,自检完成后将其重新挂载为读写模式。
      • docker中,rootfs由内核挂载为”只读“模式,而后通过”联合挂载“技术额外挂载一个”可写“层。(我们在docker container中的操作就是可写层)
  2. 分层构建最底层的是基础镜像,位于上层的镜像称为父镜像(系统层),每添加一个镜像都是一个独立的层次。最上层为“可写层”。其它均为“只读”层。删除容器的时候,可写层会一并被删除

  3. 启动容器时,docker daemon会试图从本地获取相关镜像;本地不存在时,会从docker Registry(默认就是docker hub)中下载并保存到本地。
  4. docker registry用于保存docker镜像,包括镜像的层次结构和元数据,用户可以自建registry,也可以使用官方的docker hub。registry里面的镜像通常由开发人员制作,而后推送至registry上保存,以供用户使用。另外,为了安全起见,docker daemon要求docker registry必须是https的,如果不是就需要配置docker daemon。registry分类如下:
    • Sponsor registry:第三方的Registry,供客户和docker社区使用
    • Mirror registry:第三方的Registry,只让客户使用
    • Vendor registry:由发布docker镜像的供应商提供的registry。如Redhat自己的registry
    • private registry:通过设有防火墙和额外安全层的私有实体提供的registry。
  5. repository是由某个特定docker镜像的所有迭代版本所组成,一个registry可以存在多个repository。repository分为顶层仓库和用户仓库。
    • 顶层仓库是直接由仓库名命名的,一般用docker search搜索的第一个就是顶层仓库
    • 用户仓库名称格式为:用户名或者成为项目名/仓库名。一般除了docker search搜索的第一个,其它的都是用户仓库。
  6. 镜像的生成途径
    • 通过编写dockerfile
    • 基于容器制作:也就是把容器最上层的可写层提交成一个新的镜像。比如起了一个centos的容器,然后在上面搭建一个nginx,最后用docker container commit提交完就是一个nginx的镜像了。
    • docker hub automated builds:这个其实也是基于dockerfile构建的。首先在docker hub上面设置与GitHub的集成,然后本地写完dockerfile后推到GitHub上面,docker hub检测到GitHub的变化就会触发build,生成新的镜像。

二、镜像制作

  1. 基于dockerfile制作镜像
  2. 基于容器制作镜像
    • 就以busybox镜像起一个容器,创建httpd启动所需要的文件
    [[email protected] ~]# docker run --name busy01 -it busybox
    / # mkdir -p /data/html
    / # echo 'this is a test ' >/data/html/index.html
    / # ps
    PID   USER     TIME  COMMAND
     1 root      0:00 sh
     7 root      0:00 ps
    / # which httpd
    /bin/httpd
    • 此时不要退出本窗口,另外开一个终端窗口进行镜像制作。

      上面使用ps命令可以看到,PID为1的进程是sh,容器中PID为1的进程就相当于我们宿主机的systemd进程,1进程是bash,它运行完就会结束的,PID为1的进程结束也就意味着容器就exit了。所以上面运行busybox容器的窗口是不可以关闭也不可以放在后台运行的。这里就顺便再提一下应用程序的运行:如果想让一个应用类的容器长久的运行下去,要么起一个类似busybox的容器,然后前台运行一个应用(比如httpd:httpd -f -h /data/html),这个窗口永远不能关闭;要么在把容器的CMD设置为前台运行应用的命令(也就是设置应用的PID为1)。

    • 我们先看下busybox的CMD,可看到这个容器的CMD是sh。
    [[email protected] ~]# docker container inspect busy01 | grep Cmd -A1
             "Cmd": [
                 "sh"
    • 基于busybox镜像重新commit一个CMD为httpd的镜像。
    [[email protected] ~]# docker container commit -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p busy01 hamerle/httpd:v1
     # -c:以列表的形式修改dockerfile的指令。此例只修改CMD指令,使新容器CMD指令为httpd(也就是PID为1的进程是httpd),之前是sh。
     # -p:提交过程中暂停容器的运行,防止文件保存的不完整。
     # -p的后面跟的要操作容器的名字,最后是提交后生成新镜像的名字和tag。
    [[email protected] ~]# docker image ls
    REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
    hamerle/httpd            v1                  099c89327481        2 minutes ago       1.2MB
    busybox                  latest              64f5d945efcc        3 weeks ago         1.2MB
    • 以这个新镜像创建一个httpd的容器,然后访问httpd服务
    [[email protected] ~]# docker container run --name httpd01 -d hamerle/httpd:v1
    [[email protected] ~]# docker container inspect httpd01 | grep Cmd -A4
             "Cmd": [
                 "/bin/httpd",
                 "-f",
                 "-h",
                 "/data/html"
    [[email protected] ~]# docker container inspect httpd01 | grep IPAddress
             "IPAddress": "172.17.0.3",
    [[email protected] ~]# curl 172.17.0.3
    this is a test        # 访问成功

三、镜像分享

  1. 镜像分享至docker hub

    • 注册hub.docker.com的账号
    • 点击"Repositories"菜单,然后点击"Create Repository +"来创建一个仓库,创建完成后浏览器的窗口不要关闭

    • 创建完仓库,就可以把上面制作的httpd镜像推上去了。当然,推之前需要先进行登录验证
    [[email protected] ~]# docker login --help
    Usage:  docker login [OPTIONS] [SERVER]
    # 从上面命令帮助可以看出,登录是要跟server地址的,但是默认登录就是docker hub,所以不用加server地址
    [[email protected] ~]# docker login -u hamerle
    Password:
    Login Succeeded
    # 验证成功,开始进行push操作。此处我加了tag,如果不加tag,就是将此镜像的所有版本都push上去。
    [[email protected] ~]# docker image push hamerle/httpd:v1
    • push完成后,回到浏览器docker hub的窗口,刷新就可以看到tag的位置已经有push的镜像了

  2. 镜像分享至阿里云
    • 首先注册阿里云的账号
    • 点击"控制台"菜单,然后上面的搜索框搜索"容器镜像服务 控制台",首次使用需要同意开通容器镜像服务,然后点击"创建镜像仓库",使用命名空间(也就是你的用户名),创建过程还需要创建registry的密码,创建完成后浏览器窗口不要关闭。


    • 创建完成后,点击"管理"就可以看到操作指南了。首页也是登录验证,注意:阿里云的registry的密码和阿里云登录密码不是一个。
    [[email protected] ~]# docker logout
    [[email protected] ~]# docker login --username=hamerle registry.cn-shanghai.aliyuncs.com
    Password:
    Login Succeeded
    # 验证完成后,需要以阿里云的访问路径及仓库名称重新打一个tag才能进行后续的push操作。
    [[email protected] ~]# docker tag hamerle/httpd:v1 registry.cn-shanghai.aliyuncs.com/hamerle/httpd:v2
    [[email protected] ~]# docker image ls
    REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
    hamerle/httpd                                     v1                  099c89327481        2 hours ago         1.2MB
    registry.cn-shanghai.aliyuncs.com/hamerle/httpd   v2                  099c89327481        2 hours ago         1.2MB
    busybox                                           latest              64f5d945efcc        3 weeks ago         1.2MB
    [[email protected] ~]# docker image push registry.cn-shanghai.aliyuncs.com/hamerle/httpd:v2
    • push完成之后,点击左侧菜单栏的"镜像中心"里面的"镜像搜索",搜索自己的仓库名,就可以看到push上去的镜像了。

写作不易,转载请注明出处,谢谢~

原文地址:https://www.cnblogs.com/ccbloom/p/10979440.html

时间: 2024-11-13 15:57:32

docker(三):docker镜像管理的相关文章

Docker安装与镜像管理(一)

一.安装docker yum install epel-resase yum install docker-io  (RHEL6) yum install docker (RHEL7) 系统: [[email protected] ~]# uname -a Linux kvm.huangming.org 2.6.32-573.el6.x86_64 #1 SMP Thu Jul 23 15:44:03 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [[email 

docker入门之镜像管理基础

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

Docker安装及镜像管理

1.docker简介 容器虚拟化,比传统虚拟化轻量 2013年出现,发展非常迅猛 Redhat在6.5版本开始支持docker 使用GO语言开发,基于apache2.0协议 开源软件,项目代码在github维护 2.容器虚拟化和传统虚拟化比较 3.Docker的优势 启动非常快,秒级实现 资源利用率很高,一台机器可以跑上千个docker容器 更快的交付和部署,一次创建和配置后,可以在任意 地方运行 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率 易迁移,平台依赖性不强

Docker学习04_镜像管理

运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载. 可以在浏览器中访问 https://hub.docker.com/search?q=&type=image 来搜索和查看官方镜像仓库. 使用 docker images 列出本地镜像: 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如果不指定一个镜像的版本标签,docker 将默认使用 最新版本即”仓库源名称:latest” 镜像. 执行

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

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

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

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

OpenStack Pike Minimal安装:三、镜像管理

1.创建服务凭据 #先使用脚本登陆admin [[email protected] ~]# . admin-openstack.sh ①创建glance user openstack user create --domain default --password-prompt glance ②关联 openstack role add --project service --user glance admin ③创建glance service openstack service create

dcoker镜像仓库配置和镜像管理

一.概念简单来说镜像是具体封装好的一个容器环境,不包括内核而又精简的操作系统 二.配置镜像加速站点我们在pull Image 的时候,docker默认会从国外的Docker Hub上下载,因此会很慢:下面我们通过配置国内加速站点的方式解决该问题1.编辑/etc/docker/daemon.json文件,配置如下{"registry-mirrors":["http://hub-mirror.c.163.com"]} 2.重启dockersystemctl restar

docker技术剖析--镜像、容器管理

防伪码:博观而约取,厚积而薄发                                 docker技术剖析--镜像.容器管理 一.Docker简介 Docker是什么? Docker的英文本意是"搬运工",在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的.可移植的.自管理的组件,可以在任何主流系统中开发.调试和运行. 说白了,docker是一种用了新颖方式实现的轻量级虚拟机,