Docker - 镜像
一:镜像简介
镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等
通过镜像可以创建一个或多个容器
二:镜像管理
1.获取镜像
镜像是运行容器的模板,官方 Docker Hub 仓库已经提供了许多镜像共开发者使用
如果我们需要获取某 个镜像则可以去 docker 仓库下载所需的镜像
官方镜像仓库
语法
docker pull [仓库的URl]/[名称空间]/[仓库名称]:[版本号]
默认使用官方仓库
# 例如:安装redis的命令docker pull redis(下面是它完整的)
docker pull docker.io/library/redis:latest
实例
docker pull redis
2.查看已下载的镜像列表
语法
docker images
docker image ls
选项
选项 | 释义 |
---|---|
-a | 列出所有(包括临时文件)镜像文件 |
-q | 仅显示镜像 ID |
列出镜像的数字摘要值 |
显示的参数
名称 | 释义 |
---|---|
REPOSITORY | 镜像仓库中的镜像名称 |
TAG | 镜像版本 |
IMAGE ID | 镜像ID(不完整,其余隐藏了) |
CREATED | 镜像创建日期(多久之前创建) |
SIZE | 镜像大小 |
其中镜像的 ID 信息十分重要,它唯一标识了镜像(全球唯一)
在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个 字符组成的可区分串来替代完整的 ID
TAG 信息用于标记来自同一个仓库的不同镜像
TAG 在同一个仓库中是唯一的
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用 的存储空间会小于各镜像逻辑体积之和
3.为镜像添加标签
为了方便后续工作中使用特定的镜像,还可以使用 docker tag 命令来为本地的镜像添加标签
语法
docker tag [原镜像ID] [新的名称]:[新的版本号]
docker tag [原镜像名称]:[版本号] [新的名称]:[新的版本号]
docker tag [原镜像仓库URL]/[原命名空间]/[原仓库名称]:[版本号] [新的名称]:[新的版本号]
实例
docker tag redis:latest redis:latest1
这只会添加标签,并不能修改,并且添加的标签和原镜像名的ID相同
4.登录
docker login [选项] [仓库URL]
docker login --username=用户名 [仓库URL]
cd /etc/docker
5.推送命令
# 先给镜像打标签
docker tag [镜像ID] [仓库URL]/[命名空间]/[仓库名称]:[镜像版本号]
# 推送
docker push [完整的仓库名称/镜像名称]
docker push [仓库URL]/[命名空间]/[仓库名称]:[镜像版本号]
6.查看镜像详情信息
使用 docker inspect 命令获取镜像的详细信息,包括 PID、作者、架构等等
docker inspect [选项] [镜像ID]
docker inspect [选项] [镜像名称]:[版本号]
# 筛选某一个需要的部分
docker inspect -f '{{.Id}}' 74d107221092 # 获取ID
docker inspect -f '{{.Config.Hostname}}' 74d107221092 # 获取配置主机名
docker inspect -f '{{ .ContainerConfig.Hostname }}' 74d107221092 # 获取容器配置主机名
7.查看历史记录
语法
docker history [镜像名称]
docker history [镜像ID]
实例
docker history redis
docker history 560f3f47e448
[root@localhost ~]# docker history nginx
IMAGE CREATED CREATED BY SIZE COMMENT
bc9a0695f571 6 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 6 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 6 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 6 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> 6 days ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 6 days ago /bin/sh -c #(nop) COPY file:08ae525f517706a5… 1.95kB
<missing> 6 days ago /bin/sh -c #(nop) COPY file:e7e183879c35719c… 1.2kB
<missing> 6 days ago /bin/sh -c set -x && addgroup --system -… 63.6MB
<missing> 6 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~buster 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.4.4 0B
<missing> 6 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.19.5 0B
<missing> 12 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 13 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 13 days ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB
8.搜索镜像
在docker中搜索镜像主要使用Search子命令,默认只搜索Docker Hub官方镜像仓库中的镜像
语法
docker search [选项] [镜像名称/简介]
选项
选项 | 释义 |
---|---|
--limit n | 只显示n条记录 |
-f | 过滤查询 |
--no-trunc | 不截断参数查询(显示全部信息) |
实例
# 查询redis
docker search redis
# 只查询出前3条记录
docker search redis --limit 3
--limit 3 # 只显示前3条
# 查询收藏数大于150的
docker search redis -f stars=150
# 查询官方的redis
docker search redis is-official=true
查询结果参数
参数 | 释义 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像描述 |
STARS | 镜像收藏个数(类似于Github中的stars) |
OFFICIAL | 是否是官方构建的镜像 |
AUTOMATED | 是否是自构建的镜像 |
9.删除镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像
语法
docker rmi [镜像ID]
docker rmi [镜像名称]:[版本号]
选项
选项 | 释义 |
---|---|
-f | 强制执行 |
实例
# 删除redis镜像
docker rmi 74d107221092
docker rmi redis
# 删除所有镜像
docker rmo $(docker images -q)
10.清理镜像
使用一段时间之后,docker 会产生很多临时文件,以及一些没有被使用的镜像,我们可以通过 docker image prune 命令来进行清理
语法
docker image prune [选项]
选项
选项 | 释义 |
---|---|
-a | 清理所有(未被使用的)镜像 |
-f | 强制执行 |
实例
# 删除所有的未被使用的镜像
docker image prune -a
# 强制删除所有的未被使用的镜像(不进行提示)
docker image prune -a -f
11.提交镜像
语法
docker commit [容器ID] [选项] [新的版本号]
docker commit -a "作者" -m "简介" 容器ID
选项
选项 | 释义 |
---|---|
-a | 作者 |
-m | 简介 |
-p | 保存时,容器停止运行 |
实例
docker commit -a "darker" -m "简介" 容器ID
12.保存镜像
export - 将容器导出为镜像包(仅仅保存了镜像)
docker export [容器ID|容器名称] > xxx.tar
# 实例:将nginx容器导出为nginx.tar镜像压缩包
docker export nginx > nginx.tar
import - 将镜像包导入为镜像
docker import [压缩包名称] [镜像名称(自定义)]
# 实例:将nginx.tar镜像压缩包导入为nginx镜像
docker import nginx.tar test/nginx:v1
commit
是导出为镜像export
是导出为镜像包(压缩包)
save - 导出镜像为镜像压缩包(不仅保存了镜像,还保存了名称)
选项 | 释义 |
---|---|
-o | 指定在1个压缩包内导入多个镜像 |
docker save [镜像ID|镜像名称] > [镜像压缩包名称]
# 实例
docker save test/nginx:v2 > nginx_v2.tar
# 将多个镜像打包到1个压缩包中
docker save -o test_2.tar nginx:1.19.2 redis python
load - 将压缩包导入为镜像
选项 | 释义 |
---|---|
-i | 指定导出压缩包内的镜像 |
docker load < [镜像压缩包]
docker load -i < [镜像压缩包]
# 实例:
docker load < nginx.tar
docker load -i test_2.tar
导出方式 | 保存的完整性 | 保存体积 | 镜像重命名 | 保存的数量 |
---|---|---|---|---|
save与load | 保存完整 | 大 | 否(镜像名是原来的) | 可以保存多个镜像 |
export与import | 仅保存了镜像 | 小 | 是(镜像名可以自定义) | 只能保存1个容器 |
save 和 export 的使用场景
- 打包镜像一般使用
save
,打包容器一般使用export
- 需要构建历史信息的,可以使用
save
实例
# 查看所有镜像
[root@localhost blog]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest bc9a0695f571 7 days ago 133MB
mysql 5.7.32 ae0658fdbad5 11 days ago 449MB
centos latest 0d120b6ccaa8 3 months ago 215MB
python 3.6.8 48c06762acf0 18 months ago 924MB
# 把 nginx:latest 打包成 nginx_save.tar
[root@localhost blog]# docker save nginx:latest > nginx_save.tar
# 把 nginx:latest centos:latest 打包成 all1_save.tar
[root@localhost blog]# docker save -o all1_save.tar nginx:latest centos:latest
# 将 all1_save.tar 导入成 nginx:v1
[root@localhost blog]# docker import all1_save.tar nginx:v1
sha256:95195f2f5ee8c32d997b78c8f15009f66fcfd8544ca394e4c09fe28397ba11f0
# 查看所有镜像
[root@localhost blog]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 95195f2f5ee8 6 seconds ago 359MB
nginx latest bc9a0695f571 7 days ago 133MB
mysql 5.7.32 ae0658fdbad5 11 days ago 449MB
centos latest 0d120b6ccaa8 3 months ago 215MB
python 3.6.8 48c06762acf0 18 months ago 924MB
# 运行导入的镜像(会报错)
[root@localhost blog]# docker run -d -p 80:80 --name all_saved nginx:v1
docker: Error response from daemon: No command specified.
See 'docker run --help'.
export
保存的镜像压缩包 只能由import
导入
save
保存的镜像压缩包 只能由load
导入
13.配置镜像加速器
配置Docker加速器,将会提升在国内获取Docker官方镜像的速度,否则后面下载镜像(docker pull)的过程会很慢,甚至有可能无法下载镜像
针对Docker客户端版本大于 1.10.0 的用户
可以通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://rxsa4cyh.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker