Docker核心 - 镜像

部分摘自书籍《Docker入门与实战》
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

获取镜像

由于默认仓库被墙了,我们使用其他仓库:

网易云镜像中心

进入网易云镜像中心后,搜索想要的镜像即可。
下载镜像到本地:

docker pull <镜像地址>:<镜像标签>

例子:下载tomcat镜像到本地

docker pull hub.c.163.com/library/tomcat:latest

下面是下载Redis镜像的输出:

[root@xxx rc]# docker pull hub.c.163.com/library/redis:latest
Trying to pull repository hub.c.163.com/library/redis ... 
sha256:373f1f476089724ae20e555a5709f876f319f1b08613020232064f38feb0ae3d: Pulling from hub.c.163.com/library/redis
3d59d0c51bb7: Pull complete 
fa7bbc6b37ad: Pull complete 
e945d1598847: Pull complete 
9092a5d0a502: Pull complete 
a088f4159516: Pull complete 
4156899232a5: Pull complete 
Digest: sha256:373f1f476089724ae20e555a5709f876f319f1b08613020232064f38feb0ae3d
Status: Downloaded newer image for hub.c.163.com/library/redis:latest

查看下载过程,镜像文件一般由若干层组成,行首的3d59d0c51bb7这样的串代表了各层的ID。下载过程中会获取并输出镜像的各层信息。层是AUFS(一种联合文件系统)中的重要概念,是实现增量保存于更新的基础。

docker pull hub.c.163.com/library/tomcat

当我们使用如上的命令下载镜像时,默认选择latest标签,即下载仓库中最新版本的镜像。

查看镜像信息

查看本地存在的镜像列表:

docker images
输出信息:
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
镜像来自哪个仓库           镜像标签             镜像ID               创建时间             镜像大小
docker.io/mysql         latest              f008d8ff927d        3 weeks ago         4

镜像ID唯一标识了镜像。
TAG标识了统一仓库镜像的不同发行版本。

本地镜像添加新标签

docker tag <REPOSITORY>:<TAG> <new REPOSITORY>:<new TAG>

例如为前面下载的redis添加新的标签:

docker tag hub.c.163.com/library/redis:latest redis:memeda

再次查看本地镜像可发现新增的镜像,仔细观察新增的镜像与之前下载的镜像ID会发现相同,说明这两个镜像其实都指向的是同一个镜像。

获取镜像的详细信息

docker inspect <IMAGE ID>

例如,查看之前下载的Redis镜像的详细信息:

docker inspect d4f259423416
输出信息如下:
[
{
    "Id": "sha256:d4f259423416b3c82b46e1caf01829ac3a99a211dfc691c9d862464768112e7f",
    "RepoTags": [
        "hub.c.163.com/library/redis:latest"
    ],
    "RepoDigests": [
        "hub.c.163.com/library/redis@sha256:373f1f476089724ae20e555a5709f876f319f1b08613020232064f38feb0ae3d"
    ],
    "Parent": "",
    "Comment": "",
    "Created": "2017-07-24T18:37:50.919059977Z",
    "Container": "57446e506b23a05c18196d259d38924aa6fb7de3f5143f37851d68029d829955",
    "ContainerConfig": {
        "Hostname": "18b8c41eaff3",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "6379/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "GOSU_VERSION=1.10",
            "REDIS_VERSION=4.0.1",
            "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.1.tar.gz",
            "REDIS_DOWNLOAD_SHA=2049cd6ae9167f258705081a6ef23bb80b7eff9ff3d0d7481e89510f27457591"
        ],
        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) ",
            "CMD [\"redis-server\"]"
        ],
        "ArgsEscaped": true,
        "Image": "sha256:dbe734ddb2e3997c477c456c27b7a2001a27a3a512b5fbb05bb0b0003becace2",
        "Volumes": {
            "/data": {}
        },
        "WorkingDir": "/data",
        "Entrypoint": [
            "docker-entrypoint.sh"
        ],
        "OnBuild": [],
        "Labels": {}
    },
    "DockerVersion": "17.03.2-ce",
    "Author": "",
    "Config": {
        "Hostname": "18b8c41eaff3",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "ExposedPorts": {
            "6379/tcp": {}
        },
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
            "GOSU_VERSION=1.10",
            "REDIS_VERSION=4.0.1",
            "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.1.tar.gz",
            "REDIS_DOWNLOAD_SHA=2049cd6ae9167f258705081a6ef23bb80b7eff9ff3d0d7481e89510f27457591"
        ],
        "Cmd": [
            "redis-server"
        ],
        "ArgsEscaped": true,
        "Image": "sha256:dbe734ddb2e3997c477c456c27b7a2001a27a3a512b5fbb05bb0b0003becace2",
        "Volumes": {
            "/data": {}
        },
        "WorkingDir": "/data",
        "Entrypoint": [
            "docker-entrypoint.sh"
        ],
        "OnBuild": [],
        "Labels": {}
    },
    "Architecture": "amd64",
    "Os": "linux",
    "Size": 105875580,
    "VirtualSize": 105875580,
    "GraphDriver": {
        "Name": "devicemapper",
        "Data": {
            "DeviceId": "160",
            "DeviceName": "docker-253:1-262392-eac2bf57f5828506155e4d5d1b57d194aa989db7d6c5e5f544473f2d7aae0fdc",
            "DeviceSize": "10737418240"
        }
    },
    "RootFS": {
        "Type": "layers",
        "Layers": [
            "sha256:16ada34affd41b053ca08a51a3ca92a1a63379c1b04e5bbe59ef27c9af98e5c6",
            "sha256:4fff1e33079204a50e0afa1348a573f80f87d028be99fe2d6d5f9ba067bbfa13",
            "sha256:24b522855a5c0ada1394a5239ed042c6ba12f6c32ca0ed9560ad199ddf5fa11c",
            "sha256:c4d180ce7f67fcde431ca3094533dbd8737a56f2364c7f73845da6f7659343cb",
            "sha256:5f431975fb21618de604be43ce6385251b36accf4944a66307ae7291f9966bfe",
            "sha256:3192fe91222b9be534571fadf31ab74de3e531794e836668fa4418924b5b0a7f"
        ]
    }
}
]

上面返回的JSON信息量太大了,可以只获取单个对象信息:
获取Id:

docker inspect -f {{".Id"}} d4f259423416

获取ContainerConfig:

docker inspect -f {{".ContainerConfig"}} d4f259423416

获取ContainerConfig.Hostname:

docker inspect -f {{".ContainerConfig.Hostname"}} d4f259423416

经过上诉三个例子,又了解JSON的应该能找出规律了。

搜索镜像

搜索远端仓库共享的镜像,默认搜索Docker Hub官方仓库的镜像。

docker search <keyword> 搜索的关键字
比如:
docker search mysq

可选参数:

--automated=false 仅显示自动创建的镜像
--no-trunc=false 输出信息不截断显示
-s=<stars>/--starts=<stars> 仅显示评价为指定星级以上的镜像

显示的信息:名字、描述、星级、是否官方创建、是否自动创建等。
官方创建:说明由官方项目组创建和维护。
自动创建:允许用户验证镜像的来源和内容。

删除本地镜像

删除指定Tag的镜像:

docker rmi <REPOSITORY>:<TAG>

例如删除之前下载到本地的Redis镜像:

docker rmi hub.c.163.com/library/redis:latest

删除指定IMAGE ID的镜像:

docker rmi <IMAGE ID>

此命令会先删除所有指向此镜像的标签,再删除镜像文件本身。
在删除存在依赖某镜像的容器的某镜像时,默认将无法删除镜像。提供了一个强制删除镜像的方法:

docker rmi -f ....
不推荐,可能会造成不可预料的后果

创建镜像

1. 基于已有镜像的容器创建
2. 基于本地模板导入
3. 基于Dockerfile创建

1. 基于已有镜像的容器创建
docker commit <一些选项> <container ID> <REPOSITORY>:<TAG>
选项:
> -a=""/--author="" 作者
> -m=""/--message="" 提交信息
> -p=true/--pause=true 提交时暂停容器运行

前提:前面删除了Redis镜像,重新下载到本地:

docker pull hub.c.163.com/library/redis

第一步:启动Redis镜像

docker run -ti hub.c.163.com/library/redis:latest /bin/bash
输出如下:
root@ab8ed8c0177e:/data#
此时输入:exit退出
记住上面输出中的容器ID:ab8ed8c0177e

docker commit -a="author" -m="test" ab8ed8c0177e redis:test
查看创建的镜像
docker images

2. 基于本地模板导入

一般是在模板网站下载模板到本地,比如下面这个网站

https://openvz.org/Download/template/precreated

任意下载个模板压缩包执行如下命令:

cat <tar file name> | docker import - <REPOSITORY>:<TAG>
查看镜像:
docker images

3. 基于Dockerfile创建

在不久的将来,这里将会有个链接。

存出与载入镜像

将镜像存出到本地文件(会生成一个压缩文件)

docker save -o <REPOSITORY>:<TAG>

载入:

docker load --input <IMAGE tar file name>

上传镜像

上传镜像到远程仓库,默认上传到DockerHub官方仓库。
使用官方仓库之前,需要在DockerHub站点注册,在进行登录,登陆后即可对镜像进行上传。

docker push <REPOSITORY>:<TAG>

上一篇:Docker核心概念-镜像、容器、仓库
下一篇:Docker核心-容器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值