Docker超详细讲解镜像操作

目录
  • 1. 镜像简介
  • 2. 获取镜像
  • 3. 查看镜像信息
  • 4. 搜索镜像
  • 5. 创建镜像
    • 5.1 基于已有镜像创建
    • 5.2 使用Dockerfile 新建镜像
  • 6. 删除镜像

1. 镜像简介

Docker 镜像(Image)是用于创建 Docker 容器的模板。Docker 镜像相当于一个 root 文件系统,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。在实际使用中,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

镜像仓库服务(Image Registry)包含多个镜像仓库(Image Repository),一个镜像仓库中可以包含多个镜像。

对于用户来说,镜像操作一般是指docker的客户端操作,包括镜像获取,创建,修改,运行,删除,搜索,查看等一系列操作。docker最重要的操作命令是docker build,docker pull和docker run。

2. 获取镜像

Docker使用镜像仓库来集中存放Docker镜像,如同代码库一样,我们可以自建私有Registry和使用公用Registry。

通常在仓库中存放有多个镜像,而每个仓库可以包含多个标签(Tag),每个标签对应着一个镜像。我们可以通过<仓库名>:<标签>的格式来指定具体是哪个软件哪个版本的镜像,如果不给出标签,将以 Latest 作为默认标签。

通过docker pull命令可以从仓库下载镜像,其完整格式为:

docker pull [OPTIONS] NAME[:TAG]

OPTIONS:

-a:–all-tags=true|false: 是否获取仓库中的所有镜像,默认为否

–disable-content-trust:忽略镜像的校验,默认开启

NAME:镜像仓库名(用来区分镜像)

TAG:镜像标签(通常表示软件版本信息)

对于Docker镜像来说, 如果不显式指定TAG, 则默认会选择latest标签,此时会下载仓库中最新版本的镜像。

一般来说, 镜像的latest 标签意味着该镜像的内容会跟踪最新版本的变更而变化, 内容是不稳定的。因此,如果需要从稳定性上考虑,则不要在生产环境中忽略镜像的TAG使用默认的latest 来标记镜像。

可以直接从官方Docker Hub 镜像源来下载镜像,例如:

$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
b51569e7c507: Pull complete
da8ef40b9eca: Pull complete
fb15d46c38dc: Pull complete
Digest: sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04

如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址,例如:

$ docker pull hub.c.163.com/public/ubuntu:16.04

另外,有时需要使用镜像代理服务来加速Docker 镜像获取 过程 ,在前面《Docker安装及加速》一文中已经讲述。

3. 查看镜像信息

使用docker images或docker image ls命令可以列出本地主机上已有镜像的基本信息。

$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
ubuntu        18.04     5a214d77f5d7   10 months ago   63.1MB
hello-world   latest    feb5d9fea6a5   10 months ago   13.3kB
ubuntu        16.04     b6f507652425   11 months ago   135MB

参数说明:

  • REPOSITORY:镜像仓库,比如ubuntu表示ubuntu系列的基础镜像;
  • TAG:镜像标签,比如 18.04是以ubuntu版本号作为了镜像标签;
  • IMAGE ID:镜像ID,每个镜像的ID事唯一的,如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;
  • CREATED:创建时间,显示的是镜像最后更新时间;
  • SIZE:镜像大小。

使用docker inspect命令获取镜像的详细信息,其中,包括创建者,各层的数字摘要等,其格式为:

docker inspect [IMAGE_NAME|ID

例如:

$ docker inspect ubuntu:18.04
[
    {
        "Id": "sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972",
        "RepoTags": [
            "ubuntu:18.04"
        ],
        "RepoDigests": [
            "ubuntu@sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-10-01T02:23:24.179667784Z",
        "Container": "20d614d2eca1b5a9ad6d5a56a80efce44096b87ca76a98256eb51f8dbaf7a8d2",
        "ContainerConfig": {
            "Hostname": "20d614d2eca1",
            ......

4. 搜索镜像

使用 docker search 命令可以搜索Docker Hub 官方仓库中的镜像,显示信息包括镜像名字、描述、收藏数、是否官方创建、是否自动创建等,命令格式为:

docker search [option] keyword

option选项主要包括:

  • -f,–filter filter: 过滤输出内容;
  • –format string: 格式化输出内容;
  • –limit int:限制输出结果个数, 默认为 25 个;
  • –automated :只列出 automated build类型的镜像;
  • –no-trunc :显示完整的镜像描述.

例如从官方库中搜索mysql相关镜像:

$ docker search -f stars=10 mysql
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                         MySQL is a widely used, open-source relation…   12976     [OK]
mariadb                       MariaDB Server is a high performing open sou…   4972      [OK]
phpmyadmin                    phpMyAdmin - A web interface for MySQL and M…   594       [OK]
percona                       Percona Server is a fork of the MySQL relati…   583       [OK]
bitnami/mysql                 Bitnami MySQL Docker Image                      72                   [OK]
linuxserver/mysql-workbench                                                   40
ubuntu/mysql                  MySQL open source fast, stable, multi-thread…   36
linuxserver/mysql             A Mysql container, brought to you by LinuxSe…   36
circleci/mysql                MySQL is a widely used, open-source relation…   26
google/mysql                  MySQL server for Google Compute Engine          21                   [OK]
rapidfort/mysql               RapidFort optimized, hardened image for MySQL   13     

参数说明:

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

5. 创建镜像

镜像的来源有两种,其一是从镜像库下载镜像,其二是我们创建一个新的镜像。创建镜像也分为两种,其一是基于已有镜像创建,其二是使用 Dockerfile 来创建一个新的镜像。

5.1 基于已有镜像创建

首先,我们需要使用镜像来创建一个容器,以运行目标镜像,并在容器内创建一个测试文件test.txt。在完成操作之后,输入 exit 命令来退出这个容器。

$ docker run -t -i ubuntu:18.04 /bin/bash
root@49152c044299:/# touch test.txt
root@49152c044299:/# exit

此时 ID 为 49152c044299 的容器,就是我们完成更改的容器,可以通过命令 docker commit 来提交容器副本。

$ docker container commit -m "add test.txt" -a "testdocker" 49152c044299 testdocker/ubuntu:test
sha256:9c44392a137352f2b22acbe322543eb6f30970b9bd2edf9145d19c28d5fe21fc

参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • 49152c044299:容器 ID
  • testdocker/ubuntu:test : 指定要创建的目标镜像名

我们可以使用 docker image ls命令来查看我们的新镜像 testdocker/ubuntu:test:

$ docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
testdocker/ubuntu   test      9c44392a1373   19 seconds ago   63.1MB
ubuntu              18.04     5a214d77f5d7   10 months ago    63.1MB
hello-world         latest    feb5d9fea6a5   10 months ago    13.3kB
ubuntu              16.04     b6f507652425   11 months ago    135MB

5.2 使用Dockerfile 新建镜像

使用命令 docker build 可以从零开始创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建镜像。

首先使用vim编写一个Dockerfile文件:

FROM ubuntu:18.04
MAINTAINER test <xxxxx@163.com>
WORKDIR /home
RUN touch testImage.txt
EXPOSE 80

内部指令:

  • FROM:指定使用哪个镜像源
  • RUN :告诉docker 在镜像内执行什么命令

然后,使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像:

$ docker build -t testimage/ubuntu:testimage1 .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu:18.04
 ---> 5a214d77f5d7
Step 2/5 : MAINTAINER test <chenhua2820@163.com>
 ---> Running in 92f0afdaf3bf
Removing intermediate container 92f0afdaf3bf
 ---> 88d4b9bc0c0e
Step 3/5 : WORKDIR /home
 ---> Running in ec9fd2b1cbcc
Removing intermediate container ec9fd2b1cbcc
 ---> 6a91a52c5589
Step 4/5 : RUN touch testImage.txt
 ---> Running in d60d6a8de1db
Removing intermediate container d60d6a8de1db
 ---> 1a7c4f1cd570
Step 5/5 : EXPOSE 80
 ---> Running in 7c2922e1bb55
Removing intermediate container 7c2922e1bb55
 ---> f3fdbec0b0f9
Successfully built f3fdbec0b0f9
Successfully tagged testimage/ubuntu:testimage1

参数说明:

  • -t :指定要创建的目标镜像名
  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为f3fdbec0b0f9:

$ docker image ls
REPOSITORY          TAG          IMAGE ID       CREATED          SIZE
testimage/ubuntu    testimage1   f3fdbec0b0f9   38 seconds ago   63.1MB
testdocker/ubuntu   test         9c44392a1373   45 minutes ago   63.1MB
ubuntu              18.04        5a214d77f5d7   10 months ago    63.1MB
hello-world         latest       feb5d9fea6a5   10 months ago    13.3kB
ubuntu              16.04        b6f507652425   11 months ago    135MB

运行新的镜像,可以看到/home目录下已经创建了测试文件testImage.txt:

$ docker run -t -i testimage/ubuntu:testimage1 /bin/bash
root@952d273dc630:/home# ls
testImage.txt

6. 删除镜像

当我们不再需要某个镜像的时候,可以通过 docker image rm 或者docker rmi 命令从 Docker 主机删除该镜像。其格式为:

docker rmi [image]

docker image rm [image]

删除操作会在当前主机上删除该镜像以及相关的镜像层。这意味着无法通过 docker image ls 命令看到删除后的镜像,并且对应的包含镜像层数据的目录会被删除。但是,如果某个镜像层被多个镜像共享,那只有当全部依赖该镜像层的镜像都被删除后,该镜像层才会被删除。

例如,删除掉前面创建的测试镜像testimage/ubuntu:testimage1:

$ docker rmi testimage/ubuntu:testimage1
Untagged: testimage/ubuntu:testimage1
Deleted: sha256:f3fdbec0b0f96a8f3bb2e6a4b07ba04dc45b9c59618c2b376ebea7b68ed53971
Deleted: sha256:1a7c4f1cd57038116b7a5eff05a323fc244a135741c2fd69ad89f21569f00afb
Deleted: sha256:22997b7cad7e4294d4eb9b02bc475e2bcc94c2dd168b8a8499adb02cfc4cb573
Deleted: sha256:6a91a52c5589c29f6439bf6c7def37942037a5346a2fd8520f3d8a1fc3d49ccb
Deleted: sha256:88d4b9bc0c0ee678efad3b8192d3c0cf017dfae142dbc7e87af4fecaafb4f847

删除完成后,docker image ls查看一下当前镜像列表,可以看到testimage/ubuntu:testimage1已不在列表内:

$ docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED             SIZE
testdocker/ubuntu   test      9c44392a1373   About an hour ago   63.1MB
ubuntu              18.04     5a214d77f5d7   10 months ago       63.1MB
hello-world         latest    feb5d9fea6a5   10 months ago       13.3kB
ubuntu              16.04     b6f507652425   11 months ago       135MB

如果被删除的镜像上存在运行状态的容器,那么删除操作不会被允许。再次执行删除镜像命令之前,需要停止并删除该镜像相关的全部容器。例如删除时遇到如下错误:

$ docker rmi testimage/ubuntu:testimage1
Error response from daemon: conflict: unable to remove repository reference "testimage/ubuntu:testimage1" (must force) - container 952d273dc630 is using its referenced image f3fdbec0b0f9

可以先使用docker ps -a查看依赖的容器id,然后docker rm [容器ID]删除容器后,最后执行docker rmi [镜像名]来删除镜像。

到此这篇关于Docker超详细讲解镜像操作的文章就介绍到这了,更多相关Docker镜像操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Docker镜像的基本操作方法

    目录 一.获取镜像 二.运行镜像 三.列出镜像 四.镜像大小 五.删除本地镜像 一.获取镜像 之前我们提到过 Docker 官⽅提供了⼀个公共的镜像仓库:Docker Hub,我们就可以从这上⾯获取镜像,获取镜像的命令:docker pull,格式为: $ docker pull [选项] [Docker Registry 地址[:端⼝]/]仓库名[:标签] Docker 镜像仓库地址:地址的格式⼀般是 <域名/IP>[:端⼝号],默认地址是 Docker Hub. 仓库名:这⾥的仓库名是两段

  • Docker镜像的commit操作示例及作用

    目录 Docker 镜像是什么 UnionFS(联合文件系统) Docker 镜像加载原理 分层的镜像 Docker 镜像 commit 操作 docker commit 能做什么 案例演示 Docker 镜像是什么 UnionFS(联合文件系统) UnionFS(联合文件系统):Union文件系统是一种分层.轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a

  • docker镜像导入导出备份迁移的操作

    导出: docker save -o centos.tar centos:latest #将centos:latest镜像导出为centos.tar文件 导入: docker load -i centos.tar #加载centos.tar,加载后的镜像各标签与原导出的镜像标签相同 补充知识:docker将镜像保存为tar文件 将单个文件保存为tar文件,并加载到本地 docker save ****.v1 > images.tar docker load < images.tar 将多个文件

  • Docker和镜像的操作方法

    查找镜像 我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/ 我们也可以使用 docker search 命令来搜索镜像.比如我们需要一个 httpd 的镜像来作为我们的 web 服务.我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像. docker search httpd 拖取镜像 我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像.

  • Docker 彻底删除私有库镜像的操作

    首先看看网上一般的做法 私有库默认是不支持删除镜像的,需要修改config.yml配置文件,在storage节点下加入 delete: enabled: true ,然后重启私有库. docker 提供的镜像删除api为: DELETE ip:端口/v2/<repository>/manifests/<reference> repository 为镜像的repository reference 为镜像push成功后生成的 digest:sha256 值 获取 digest : cu

  • Docker 拉取镜像及标签操作 pull | tag

    重翻Fabric项目的源码,发现Docker部分内容,有很多不尽理解的地方,看着看着,就看到使用docker pull拉取Fabric镜像及使用docker tag为镜像重命名,稍作思虑,发现虽然使用过,却未求甚解,得过且过,如今已经忘了如何运用-- 1. docker pull 从镜像源拉取镜像,一般来说是从Docker Hub拉取镜像(image) docker pull [OPTIONS] NAME[:TAG|@DIGEST] 选项,简写 默认 描述 –all-tags , -a 从镜像库

  • Docker超详细讲解镜像操作

    目录 1. 镜像简介 2. 获取镜像 3. 查看镜像信息 4. 搜索镜像 5. 创建镜像 5.1 基于已有镜像创建 5.2 使用Dockerfile 新建镜像 6. 删除镜像 1. 镜像简介 Docker 镜像(Image)是用于创建 Docker 容器的模板.Docker 镜像相当于一个 root 文件系统,比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统.在实际使用中,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖

  • Java 超详细讲解IO操作字节流与字符流

    目录 IO操作 字节流 FileInputStream FileOutputStream 字节流读写案例 字符流 FileReader FileWriter 字节流与字符流的区别 IO操作 字节流 java.io.InputStream 输入流,主要是用来读取文件内容的. java.io.OutputStream 输出流,主要是用来将内容字节写入文件的. FileInputStream 该流用于从文件读取数据,它的对象可以用关键字 new 来创建. 有多种构造方法可用来创建对象. 可以使用字符串

  • Python OpenCV超详细讲解调整大小与图像操作的实现

    目录 准备工作 重新调整图像大小 图像裁剪 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 查看图像大小 调用imread()方法获取我们资源文件夹中的图片lambo.png 输出图像的shape属性 img=cv2.imread("Resources/lam

  • C语言超详细讲解文件的操作

    目录 一.为什么使用文件 二.什么是文件 1.程序文件 2.数据文件 3.文件名 三.文件指针 四.文件的打开和关闭 五.文件的顺序读写 六.文件的随机读写 fseek ftell rewind 七.文件结束判定 一.为什么使用文件 当我们写一些项目的时候,我们应该要把写的数据存储起来.只有我们自己选择删除数据的时候,数据才不复存在.这就涉及到了数据的持久化的问题,为我们一般数据持久化的方法有,把数据存在磁盘文件.存放到数据库等方式.使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久

  • C语言超详细讲解顺序表的各种操作

    目录 顺序表是什么 顺序表的结构体 顺序表的接口函数 顺序表相关操作的菜单 顺序表的初始化 添加元素 陈列元素 往最后加元素 往前面加元素 任意位置加元素 删除最后元素 删除前面元素 删除任意元素 整体代码(fun.h部分) 整体代码(fun.cpp部分) 整体代码(主函数部分) 结果展示 顺序表是什么 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数

  • java反射超详细讲解

    目录 Java反射超详解✌ 1.反射基础 1.1Class类 1.2类加载 2.反射的使用 2.1Class对象的获取 2.2Constructor类及其用法 2.4Method类及其用法 Java反射超详解✌ 1.反射基础 Java反射机制是在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法:对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. Java反射机制主要提供以下这几个功能: 在运行时判断任意一个对象所属

  • 超详细讲解Linux C++多线程同步的方式

    目录 一.互斥锁 1.互斥锁的初始化 2.互斥锁的相关属性及分类 3,测试加锁函数 二.条件变量 1.条件变量的相关函数 1)初始化的销毁读写锁 2)以写的方式获取锁,以读的方式获取锁,释放读写锁 四.信号量 1)信号量初始化 2)信号量值的加减 3)对信号量进行清理 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通过多线程模拟多窗口售票为例: #include <iostream> #include<pthread.h> #include<stdio.h&

  • 超详细讲解python正则表达式

    目录 正则表达式 1.1 正则表达式字符串 1.1.1 元字符 1.1.2 字符转义 1.1.3 开始与结束字符 1.2 字符类 1.2.1 定义字符类 1.2.2 字符串取反 1.2.3 区间 1.2.4 预定义字符类 1.3 量词 1.3.1 量词的使用 1.3.2 贪婪量词和懒惰量词 1.4 分组 1.4.1 分组的使用 1.4.2 分组命名 1.4.3 反向引用分组 1.4.4 非捕获分组 1.5 re模块 1.5.1 search()和match()函数 1.5.2 findall()

  • 超详细讲解Java异常

    目录 一.Java异常架构与异常关键字 Java异常简介 Java异常架构 1.Throwable 2.Error(错误) 3.Exception(异常) 4.受检异常与非受检异常 Java异常关键字 二.Java异常处理 声明异常 抛出异常 捕获异常 如何选择异常类型 常见异常处理方式 1.直接抛出异常 2.封装异常再抛出 3.捕获异常 4.自定义异常 5.try-catch-finally 6.try-with-resource 三.Java异常常见面试题 1.Error 和 Excepti

  • Python 数据可视化超详细讲解折线图的实现

    绘制简单的折线图 在使用matplotlib绘制简单的折线图之前首先需要安装matplotlib,直接在pycharm终端pip install matplotlib即可 使用matplotlib绘制简单的折线图,再对其进行定制,实现数据的可视化操作 import matplotlib.pyplot as plt # 导入pyplot模块并设置别名为plt squares = [1, 4, 9, 16, 25] plt.plot(squares) plt.show() # 打开matplotib

随机推荐