部分摘自书籍《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. 基于本地模板导入
一般是在模板网站下载模板到本地,比如下面这个网站
任意下载个模板压缩包执行如下命令:
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>