docker 镜像管理基础

docker 镜像管理基础


docker常用操作

命令功能
docker search在 Docker 中心搜索映像
docker pull从注册表中拉取映像或存储库
docker images列出图像
docker create创建新的连接器
docker start启动一个或多个已停止的容器
docker run在新容器中运行命令
docker attach连接到运行容器
docker ps列出容器
docker logs获取容器的日志
docker restart重新启动容器
docker stop停止一个或多个正在运行的容器
docker kill杀死一个或多个正在运行的容器
docker rm删除容器或更多容器
docker exec在正在运行的容器中运行命令
docker info显示系统范围的信息
docker inspect返回有关Docker对象的低级信息

docker search(搜索镜像)

[root@localhost ~]# docker search httpd
NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                                The Apache HTTP Server Project                  4106      [OK]       
centos/httpd-24-centos7              Platform for running Apache httpd 2.4 or bui…   44                   
centos/httpd                                                                         35                   [OK]
clearlinux/httpd                     httpd HyperText Transfer Protocol (HTTP) ser…   2                    
hypoport/httpd-cgi                   httpd-cgi                                       2                    [OK]                    

docker pull(在镜像仓库拉取镜像)

[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
a2abf6c4d29d: Pull complete 
dcc4698797c8: Pull complete 
41c22baa66ec: Pull complete 
67283bbdd4a0: Pull complete 
d982c879c57e: Pull complete 
Digest: sha256:0954cc1af252d824860b2c5dc0a10720af2b7a3d3435581ca788dff8480c7b32
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

docker info(查看镜像信息)

[root@localhost ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
  scan: Docker Scan (Docker Inc., v0.17.0)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0

docker images(列出镜像)

[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
httpd        latest    dabbfbe0c57b   7 months ago   144MB

docker create(创建容器)

[root@localhost ~]# docker create --name web -p 80:80 httpd
0c91a90465ed63bb17fee779847c85c87f9fca0d5cf8693cd66f32e4b1c4bc78

docker ps(列出容器)

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS    PORTS     NAMES
0c91a90465ed   httpd     "httpd-foreground"   45 seconds ago   Created             web  

docker start(启动镜像)

[root@localhost ~]# docker start web
web
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND              CREATED              STATUS         PORTS                               NAMES
0c91a90465ed   httpd     "httpd-foreground"   About a minute ago   Up 7 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

docker stop(停止镜像)

[root@localhost ~]# docker stop 0c91a90465ed
0c91a90465ed
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS                      PORTS     NAMES
0c91a90465ed   httpd     "httpd-foreground"   3 minutes ago   Exited (0) 14 seconds ago        

docker restart( 重启一个容器)

[root@localhost ~]# docker restart 0c91a90465ed
0c91a90465ed
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS          PORTS                               NAMES
0c91a90465ed   httpd     "httpd-foreground"   8 minutes ago   Up 10 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   web

docker kill(杀死镜像的进程)

[root@localhost ~]# docker kill web
web
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS                       PORTS     NAMES
0c91a90465ed   httpd     "httpd-foreground"   10 minutes ago   Exited (137) 3 seconds ago            

docker run (运行容器)

[root@localhost ~]# docker run nickistre/centos-lamp
Unable to find image 'nickistre/centos-lamp:latest' locally
latest: Pulling from nickistre/centos-lamp
f9f73d801f05: Pull complete 
31a920671517: Pull complete 
21c34a1a7bde: Pull complete 
dc05bf237fc1: Pull complete 
001edf96df50: Pull complete 
273de3312284: Pull complete 

docker rm(删除容器)

[root@localhost ~]# docker rm web
web
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE                   COMMAND            CREATED          STATUS                     PORTS     NAMES
cba817360196   nickistre/centos-lamp   "supervisord -n"   11 minutes ago   Exited (0) 7 minutes ago             recursing_vaughan

docker inspect(查看容器的详细信息)

[root@localhost ~]# docker inspect cba817360196
[
    {
        "Id": "cba8173601961c427325b36abbad644dbfc4093e54dffa5931174ba9e96b3749",
        "Created": "2022-08-03T13:40:32.012295652Z",
        "Path": "supervisord",
        "Args": [
            "-n"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
 ......  

docker logs(获取日志)

[root@localhost ~]# docker run --name web03 -d -p 82:80 httpd
c1a45d1c42756847d8c27236764a3c199faa09a5307a5dede4ce9374d843f646
[root@localhost ~]# docker logs web03
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Thu Aug 04 06:37:53.458406 2022] [mpm_event:notice] [pid 1:tid 139878037044544] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Thu Aug 04 06:37:53.458767 2022] [core:notice] [pid 1:tid 139878037044544] AH00094: Command line: 'httpd -D FOREGROUND'

[root@localhost ~]# docker logs -f web03
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
[Thu Aug 04 06:37:53.458406 2022] [mpm_event:notice] [pid 1:tid 139878037044544] AH00489: Apache/2.4.52 (Unix) configured -- resuming normal operations
[Thu Aug 04 06:37:53.458767 2022] [core:notice] [pid 1:tid 139878037044544] AH00094: Command line: 'httpd -D FOREGROUND'

docker attach(进入容器 退出后容器终止)

[root@localhost ~]# docker run --name web04 -d -p 81:80 httpd
a2ac48ebd5d5cfe778bbbf2443159c3e225d62044d19931342703fb1ba9c0b2b
[root@localhost ~]# docker attach web04
10.12.28.253 - - [04/Agu/2022:14:55:42 +0000] "GET /httpd_access_testweb02 HTTP/1.1" 404 220

docker exec(进入容器 退出后容器继续运行)

[root@localhost ~]# docker start xyx 
xyx
[root@localhost ~]# docker exec -it xyx /bin/sh
/ # exit
[root@localhost ~]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS          PORTS     NAMES
98b74ab02ea5   busybox   "/bin/sh"   4 minutes ago   Up 21 seconds             xyx

镜像的概念

镜像可以理解为应用程序的集装箱,而docker用来装卸集装箱。

Docker镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的程序,它包含运行某个程序所需要所有内容,包括代码、库文件、环境变量和配置文件。

简单来说Docker镜像就好比是一个模板,可以通过这个模板来创建容器服务;一个镜像可以创建多个容器(程序运行在容器中)。

在这里插入图片描述

docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动容器。

docker镜像采用分层构建机制,最底层为bootfs,其上为rootfs

  • bootfs:用于系统引导的文件系统,包括bootloader和kernel,容器启动完成后会被卸载以节约内存资源
  • rootfs:位于bootfs之上,表现为docker容器的根文件系统
    • 传统模式中,系统启动之时,内核挂载rootfs会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式
    • docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

注意:当删除容器时,这个容器自有的“可写”层会一起被删除
在这里插入图片描述

docker镜像层

在这里插入图片描述

位于下层的镜像称为父镜像(parrent image),最底层的称为基础镜像(base image);
最上层为“可读写”层,其下的均为“只读”层。

docker存储驱动

docker提供了多种存储驱动来实现不同的方式存储镜像,下面是常用的几种存储驱动:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • VFS

AUFS

AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS是一个能透明覆盖一个或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container。

AUFS文件系统据说有3W行代码,而ext4文件系统却只有4000-5000行左右代码,这些代码是要被整合进内核的,后来AUFS申请要被合并进内核代码的时候,linuz觉得它这代码太过臃肿,于是拒绝了。因此AUFS这个文件系统一直以来就不是linux内核中自有的文件系统,想用AUFS这个文件系统的话,必须自己向内核打补丁并去编译使用它,但redhat系列的操作系统一向以稳定著称,不会干这种出格的事,所以在redhat系列操作系统中使用AUFS并无可能。而ubuntu上的docker默认使用的就是AUFS。

UnionFS(联合文件系统)
UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同的文件系统挂载到同一个虚拟文件系统下。UnionFS(联合文件系统)是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像可以制作各种应用镜像。

UnionFS(联合文件系统)特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
在这里插入图片描述

OverlayFS

Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。目前最新的OverlayFS为Overlay2。

AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有。目前AUFS已基本被淘汰。

DeviceMapper

Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并没有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。

OverlayFS是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容大小都会复制整个文件,对大文件进行修改显然要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都只复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景。而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。

docker registry

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

Registry用于保存docker镜像,包括镜像的层次结构和元数据。用户可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分类:

  • Sponsor Registry:第三方的Registry,供客户和Docker社区使用
  • Mirror Registry:第三方的Registry,只让客户使用
  • Vendor Registry:由发布docker镜像的供应商提供的registry
  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry

docker registry的组成:

  • Repository
    • 由某特定的docker镜像的所有迭代版本组成的镜像仓库
    • 一个Registry中可以存在多个Repository
      • Repository可分为“顶层仓库”和“用户仓库”
      • 用户仓库名称格式为“用户名/仓库名”
    • 每个仓库可包含多个Tag(标签),每个标签对应一个镜像
  • Index
    • 维护用户帐户、镜像的检验以及公共命名空间的信息
    • 相当于为Registry提供了一个完成用户认证等功能的检索接口

Docker Registry中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry上保存,供其他人员使用,例如“部署”到生产环境。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值