Docker 镜像管理

一、概念

Docker所宣称的用户可以随心所欲地“Build、Ship and Run”应用的能力,其核心是由Docker image来支撑的。Docker通过把应用运行时的环境和应用打包在一起,解决了环境部署依赖的问题,通过引入分层文件系统的概念,解决了空间利用的问题。

Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

1.1、docker镜像文件系统

Docker镜像含有启动容器所需要的文件系统及其内容,Docker采用分层构建机制,最底层为bootfs,其之为rootfs。

bootfs:用于系统引导的文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节约内存资源

rootfs:位于bootfs之上,表现为Docker容器的根文件系统。传统模式中,系统启动时内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检后将其重新挂载为读写模式。Docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层。

1.2、Docker Repository

仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。仓库的名字通常由两部分组成,中间以斜线分开,斜线之前是用户名,斜线之后是镜像名。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云 和时速云等,可以提供大陆用户更稳定快速的访问。当然,用户也可以在本地网络内创建一个私有仓库。

Docker Registry 拉取镜像

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

启动容器时,docker daemon会试图从本地获取相关的镜像,本地镜像不存在时,其将从Registry中下载镜像并保持到本地。

二、Docker image操作

2.1、列出本机的镜像

[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        6 days ago          17.4MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
nginx                    latest              06144b287844        13 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB

2.2、创建一个镜像

[[email protected] ~]# docker pull nginx   #可以直接pull镜像,默认pull的版本是latest版本
Using default tag: latest
latest: Pulling from library/nginx
802b00ed6f79: Already exists
e9d0e0ea682b: Pull complete
d8b7092b9221: Pull complete
Digest: sha256:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
Status: Downloaded newer image for nginx:latest
[[email protected] ~]# docker pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
c67f3896b22c: Pull complete
428de5b8d58a: Pull complete
7efd417f3e28: Pull complete
61a56b170416: Pull complete
Digest: sha256:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb
Status: Downloaded newer image for nginx:1.14-alpine

2.3、删除一个镜像

[[email protected] ~]# docker image rm nginx
Untagged: nginx:latest
Untagged: [email protected]:24a0c4b4a4c0eb97a1aabb8e29f18e917d05abfe1b7a7c07857230879ce7d3d3
Deleted: sha256:06144b2878448774e55577ae7d66b5f43a87c2e44322b3884e4e6c70d070b262
Deleted: sha256:824a442ee3c96744d75be3737a22cc6a47aebad1b30be67f3c2f8f29cb0aa879
Deleted: sha256:8e3d1e9e4945f930c93c30617512998437f6edafd86676770d29b1581f2520bb
[[email protected] ~]# docker image rm nginx:1.14-alpine
Untagged: nginx:1.14-alpine
Untagged: [email protected]:f87de4bf7449cd23fd484a130e5b1b329ae75dd736576550f9bdff0d70bc3dcb
Deleted: sha256:14d4a58e0d2e63431ccac050e4294bd92df76aba8864f5f201ee293797febf79
Deleted: sha256:e14286135e32e2b62ac9781215a212834d212e3c106c5b2afd28a099448e5ae6
Deleted: sha256:e6b2d19e9d67586b7562c319716029b04d5817bbd2716031e99a1147e6a9cb56
Deleted: sha256:6298dc8d140a4afb31b20b40e5f39955986aae3b744b3f372d1bd2c8a724954a
Deleted: sha256:ebf12965380b39889c99a9c02e82ba465f887b45975b6e389d42e9e6a3857888

2.4、创建一个容器

[[email protected] ~]# docker run --name b2 –it –d --rm busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var

命令注释:

  • -it : 进行交互式操作
  • -d : 等同于 -d=true,容器将会在后台运行,不然执行一次命令后,退出后,便是exit状态了。
  • --name : 容器启动后的名字,默认不指定,将会随机产生一个名字。或者使用 -name="containers_name"
  • --rm:退出删除容器
  • busybox:使用的镜像名称

2.5、基于容器制作镜像

[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[[email protected] ~]# docker run --name b1 -it busybox
/ # mkdir /data/html -p
/ # vi data/html/index.html
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # read escape sequence
[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fb101638ecd7        busybox             "sh"                5 minutes ago       Up 5 minutes                            b1
[[email protected] ~]# docker commit -p b1 yxr877431436/httpd:v0.1
sha256:a257de8b352a1cb7f42232360ccc1ae93b5149d5e0320b95b7cef9e28ec0e05e
[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.1                a257de8b352a        10 seconds ago      1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[[email protected] ~]# docker commit -a "Saviorsyang <[email protected]>" -c ‘CMD ["/bin/httpd","-f","-h","/data/html"]‘ -p b1 yxr877431436/httpd:v0.2
sha256:bf9bf96e457276b504151736b59356a9355e606840c5d978e88342f5ce0f6aa1
[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        4 seconds ago       1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        12 minutes ago      1.16MB
nginx                    1.14-alpine         14d4a58e0d2e        5 days ago          17.4MB
redis                    latest              e1a73233e3be        12 days ago         83.4MB
nginx                    latest              06144b287844        12 days ago         109MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[[email protected] ~]# docker run --name t1 yxr877431436/httpd:v0.2
[[email protected] ~]# docker inspect t1
[[email protected] ~]# curl 172.17.0.3
<h1>Welcome to busybox...</h1>

命令注释:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

2.6、镜像上传至docker hub

[[email protected] ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don‘t have a Docker ID, head over to https://hub.docker.com to create one.
Username: yxr877431436
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[[email protected] ~]# docker push yxr877431436/httpd:v0.2
The push refers to repository [docker.io/yxr877431436/httpd]
7a6545b4aa0f: Pushed
f9d9e4e6e2f0: Mounted from library/busybox
v0.2: digest: sha256:6aedc15d85442cb7b054d582a1518d22bd95c5a4716dfce88271c300b010df51 size: 734

上传成功之后,可以登录https://hub.docker.com/进行查看。

2.7、镜像导入和导出

[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[[email protected] ~]# docker save -o redis.gz redis
[[email protected] ~]# ls
anaconda-ks.cfg  redis.gz
[[email protected] ~]# docker image rm redis
Untagged: redis:latest
Untagged: [email protected]:b77926b30ca2f126431e4c2055efcf2891ebd4b4c4a86a53cf85ec3d4c98a4c9
Deleted: sha256:e1a73233e3beffea70442fc2cfae2c2bab0f657c3eebb3bdec1e84b6cc778b75
Deleted: sha256:f9db21ff8c82fc37f90caf90a7aee8155217522ad8c59fbfe370a3e3875e3ba8
Deleted: sha256:e8237a63680e91814c2187d36bf877b77bcdbe32f039e3830b971899ba3d9066
Deleted: sha256:ee3e8a7f98978d885f024af810e81c5111010a5ad04a506e108b8164c14ecc53
Deleted: sha256:19261f688dac95e95c456e918a4374328ce0f6e3fbccd8b8bf2aaf7fa64caf8f
Deleted: sha256:8a43eb91122ffb8c673e3c1c8191ef02af80d23b14758d3be28a09631bb8ec14
Deleted: sha256:8b15606a9e3e430cb7ba739fde2fbb3734a19f8a59a825ffa877f9be49059817
[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB
[[email protected] ~]# docker load -i redis.gz
8b15606a9e3e: Loading layer [==================================================>]  58.44MB/58.44MB
d98fb630fb3b: Loading layer [==================================================>]  338.4kB/338.4kB
714e32c05337: Loading layer [==================================================>]  3.033MB/3.033MB
a3514b4102be: Loading layer [==================================================>]  24.84MB/24.84MB
21497520b817: Loading layer [==================================================>]  1.536kB/1.536kB
685379d1594c: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: redis:latest
[[email protected] ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yxr877431436/httpd       v0.2                bf9bf96e4572        25 hours ago        1.16MB
yxr877431436/httpd       v0.1                a257de8b352a        25 hours ago        1.16MB
redis                    latest              e1a73233e3be        13 days ago         83.4MB
busybox                  latest              e1ddd7948a1c        6 weeks ago         1.16MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        7 months ago        44.6MB

三、Docker image扩展知识

3.1、联合挂载

联合文件系统这种思想由来已久,这类文件系统会把多个目录(可能对应不同的文件系统—)挂载到同一个目录,对外呈现这些目录的联合。

Docker联合文件系统Union File System,它是实现Docker镜像的技术基础,是一种轻量级的高性能分层文件系统,支持将文件系统中的修改进行提交和层层叠加,这个特性使得镜像可以通过分层实现和继承。同时支持将不同目录挂载到同一个虚拟文件系统下。在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制作各种不同的应用镜像。这些应用镜像共享同一个基础镜像层,提高了存储效率。

Docker 中使用的 AUFS(AnotherUnionFS)就是一种联合文件系统。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。

Docker目前支持的联合文件系统种类包括AUFS、OverlayFS、btrfs、vfs、zfs和Device Mapper等。

  • AUFS:最早支持的文件系统,对Debian/Ubuntu支持好,虽然没有合并到Linux内核中,但成熟度很高;
  • OverlayFS:类似于AUFS,性能更好一些,已经合并到内核,未来会取代AUFS,但成熟度有待提高;
  • Device Mapper:Redhat公司和Docker团队一起开发用于支持RHEL的文件系统,内核支持,性能略慢,成熟度高;
  • btrfs:参考zfs等特性设计的文件系统,由Linux社区开发,试图未来取代Device Mapper,成熟度有待提高;
  • vfs:基于普通文件系统(ext、nfs等)的中间层抽象,性能差,比较占用空间,成熟度也一般。
  • zfs:最初设计为Solaris 10上的写时文件系统,拥有不少好的特性,但对Linux支持还不够成熟。
  • 总结一下,AUFS和Device Mapper的应用最为广泛,支持也相对成熟,推荐生产环境考虑。长期来看,OverlayFS将可能具有更好的特性。

    3.2、写时复制(COW)

      写时复制docker 镜像使用了写时复制(copy-on-write)的策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制一份镜像文件,而是将所有镜像层以只读的方式挂载到一个挂载点,再在上面覆盖一个可读写的容器层。在未更改文件内容时,所有容器共享同一份数据,只有在 docker 容器运行过程中文件系统发生变化时,才会把变化的文件内容写到可读写层,并隐藏只读层中的老版本文件。写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间。

    原文地址:https://www.cnblogs.com/Saviorsyang/p/9681587.html

    时间: 2024-10-06 23:36:42

    Docker 镜像管理的相关文章

    paas架构之docker——镜像管理

    1. 镜像管理 1.1. 列出镜像 Sudo docker images 1.2. 查看镜像 Sudo docker images xxxx 1.3. 拉取镜像 Sudo docker pull ubuntu 1.4. 查找镜像 Sudo docker search mysql 1.5. 删除镜像 sudo docker rmi xxxxx (force) 1.6. 构建镜像 1.6.1. Docker commit 不推荐,建议使用docker build+ docker file 1.6.2

    docker(三):docker镜像管理

    一.基本介绍 docker镜像是容器启动的基础,镜像里面包含容器启动所需要的文件系统及其内容.docker镜像采用分层构建的机制,这种分层大致分为两部分,一部分是最底层的引导文件系统bootfs,类型有aufs,btffs或者overlay2等:另一部分真正让用户来构建用户空间并运行进程的容器称为rootfs. bootfs:用于引导文件系统,包括BootLoader和kernel,容器启动完成后会被卸载以节约内存资源.(这里说的卸载,是从内存中移除而不是删除) rootfs:位于bootfs之

    docker镜像管理和容器管理以及制作本地仓库

    1. 镜像管理 1.1 获取镜像 docker search centos docker pull centos:6.9 docker pull centos:7.5.1804 docker pull nginx 1.2 查询镜像 docker images docker images -q docker inspect ID/name:tag 1.3 删除镜像 docker rmi ID docker rmi `docker images -q` docker rmi $(docker ima

    Docker镜像管理

    docker pull  centos   //从docker.com获取centos镜像docker images  //查看本地都有哪些镜像docker tag centos aming123  //为centos镜像设置标签为aming123,再使用docker images查看会多出来一行,改行的image id和centos的一样docker search (image-name)   //从docker仓库搜索docker镜像,后面是关键词docker run -t -i cento

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

    一.Docker镜像 Docker镜像是启动Docker容器的一个非常重要的组件.Docker各组件之间的关系如图: Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建并启动容器.并且Docker镜像是采用分层构建,联合挂载的机制实现的.那什么是分层构建,联合挂载呢?如图: 在分层构建机制中,最底层为bootfs,用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节省内存资源.在bootfs之上的是rootfs,这里就是doc

    Docker 镜像-管理-导入-导出

    目录 Docker 镜像基本概念 Docker 镜像加速 Docker 镜像 常用命令 Docker 镜像的创建和导出导入 Docker 镜像基本概念 我们使用的容器都是基于镜像的,镜像是由多层组成的,容器是在镜像上面添加了一个读写层.镜像一般储存在 /var/lib/docker/image/. 多个容器是引用的同一个 镜像,容器不会更改镜像的内容,而是创建一个可写层,并将数据保存在 /var/lib/docker/containers 中. Docker 镜像加速 当我们在使用 Docker

    (五)Docker镜像管理3之上传镜像

    我这里使用自行在阿里云注册的云服务(免费) 首先创建命名空间 创建仓库 选择你所在的区域,这样是为了速度更快.输入仓库名称.摘要.仓库类型如果只是自己用就选择"私有".如果不需要做自动部署可以选择"本地部署" 建立好之后查看,点击管理:rexcheny是用户名.mycentos6是仓库名 查看本地镜像,并登陆到注册的云服务 docker login [email protected] registry.cn-qingdao.aliyuncs.com 打标签,实际上是

    (五)Docker镜像管理2之nginx镜像制作

    下面我们来制作一个Nginx的镜像,通过编译安装方式来完成. 重新制作一个基础镜像 文件内容 # Version: 0.0.1 # 指定使用哪个基础镜像 FROM centos:6.6 # 说明该镜像的制作者和联系方式 MAINTAINER Rex.chen [email protected] #设置标签,不是必须的只是为了说明里面的版本查看起来方便 LABEL Discrition="更换了epel源,并安装了相应库和组件" #备份系统默认的epel源,并设置新的EPEL源 RUN 

    (五)Docker镜像管理1之镜像操作

    这篇文章将介绍镜像的一般操作,包括查看.查找.下载.删除等. 下载镜像 使用下面的命令来下载镜像 docker pull 镜像名称或者镜像名称:标签 列出本地镜像 使用下面的命令来列出本地镜像 docker images 查看镜像内部的层 使用下面的命令来查看镜像内部的封装层 docker history 镜像ID或者名称:标签 这里面展示此镜像封装中的所有层以及每层执行的什么操作. 查找HUB中的镜像 使用下面的命令查找HUB中的镜像 docker search 关键字 这里搜索出来的就是HU