概念

  1. 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
  2. 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。

image.png

镜像操作命令

  1. $ docker image --help
  2. Usage: docker image COMMAND
  3. Manage images
  4. Commands:
  5. build Build an image from a Dockerfile
  6. history Show the history of an image
  7. import Import the contents from a tarball to create a filesystem image
  8. inspect Display detailed information on one or more images
  9. load Load an image from a tar archive or STDIN
  10. ls List images
  11. prune Remove unused images
  12. pull Pull an image or a repository from a registry
  13. push Push an image or a repository to a registry
  14. rm Remove one or more images
  15. save Save one or more images to a tar archive (streamed to STDOUT by default)
  16. tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  17. Run 'docker image COMMAND --help' for more information on a command.
命令 说明
build 通过Dockerfile构建镜像的命令
history 显示镜像构建历史过程
import 导入一个由容器
inspect 显示一个镜像的详细信息
load 从一个文件或标准输入流中导入镜像
ls 查看镜像列表
prune 删除未使用的镜像
pull 从registry拉取镜像
push 推送镜像到registry
rm 删除镜像
save 将镜像打包成tar压缩文件
tag 给镜像打标签

docker search

通过命令docker search查找

  1. docker search [OPTIONS] TERM

通过docker hub查找,docker hub是docker的官方镜像仓库地址

image.png
Docker——Image - 图3

docker search 可选的参数说明:
-f, —filter filter 根据条件过滤输出is-automated=(true|false), is-official=(true|false), stars=
—format string 使用go模板语法搜索输出
—limit int 搜索结果分页条数,默认25条
—no-trunc 显示完整镜像信息
显示start不小于20的 前五个centos镜像

  1. docker search -f=stars=20 --limit=5 centos
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. centos The official build of CentOS. 4585 [OK]
  4. jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86 99 [OK]
  5. openshift/base-centos7 A Centos7 derived base image for Source-To-I 31

只查找官方发布的mysql镜像

  1. docker search -f is-official=true mysql
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. mysql MySQL is a widely used, open-source relation 6792 [OK]
  4. mariadb MariaDB is a community-developed fork of MyS 2167 [OK]
  5. percona Percona Server is a fork of the MySQL relati 363 [OK]

可能因为某些不可抗力 打开很慢或者打不开,可以使用国内的镜像网站
七牛云镜像:https://hub.qiniu.com/home
image.png
daocloud镜像市场 https://hub.daocloud.io
image.png

docker pull

本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像,其命令格式是:

  1. docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。由于中国的特殊国情,我们在安装Dockek改成了阿里云的
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
拉取centos最新的镜像

  1. docker pull centos
  2. Using default tag: latest
  3. latest: Pulling from library/centos
  4. 256b176beaff: Pull complete
  5. Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
  6. Status: Downloaded newer image for centos:latest

拉取ubuntu 版本是16.04的镜像

  1. $ docker pull ubuntu:18.04
  2. 18.04: Pulling from library/ubuntu
  3. Digest: sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
  4. Status: Downloaded newer image for ubuntu:18.04
  5. docker.io/library/ubuntu:18.04

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。

docker run

使用 docker run 命令来在容器内运行一个应用程序

  1. docker run ubuntu echo "hello world"
  2. Unable to find image 'ubuntu:latest' locally
  3. latest: Pulling from library/ubuntu
  4. c64513b74145: Pull complete
  5. 01b8b12bad90: Pull complete
  6. c5d85cf7a05f: Pull complete
  7. b6b268720157: Pull complete
  8. e12192999ff1: Pull complete
  9. Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
  10. Status: Downloaded newer image for ubuntu:latest
  11. hello world

以命令行的方式运营Ubuntu16.04版本

  1. $ docker run -it --rm ubuntu:16.04 /bin/sh
  2. # cat /etc/os-release
  3. NAME="Ubuntu"
  4. VERSION="16.04.6 LTS (Xenial Xerus)"
  5. ID=ubuntu
  6. ID_LIKE=debian
  7. PRETTY_NAME="Ubuntu 16.04.6 LTS"
  8. VERSION_ID="16.04"
  9. HOME_URL="http://www.ubuntu.com/"
  10. SUPPORT_URL="http://help.ubuntu.com/"
  11. BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
  12. VERSION_CODENAME=xenial
  13. UBUNTU_CODENAME=xenial

-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
—rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 —rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
/bin/sh:放在镜像名后的是命令,这里我们希望有个交互式 Shell

docker image

列出本地主机上的镜像

  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. ubuntu 14.04 8789038981bc 3 days ago 188MB
  4. ubuntu 18.04 16508e5c265d 3 days ago 84.1MB
  5. centos latest 5182e96772bf 2 weeks ago 200MB
  6. ubuntu 16.04 7aa3602ab41e 4 weeks ago 115MB
  7. ubuntu latest 735f80812f90 4 weeks ago 83.5MB

其中各个选项表示的含义如下表所示,同一个仓库可以有多个TAG,代表着当前仓库中的各个版本,ubuntu就是仓库名称。14.04/16.04/18.04就是ubuntu的各个发行的版本号。因此使用REPOSITORY:TAG来定义不同的镜像。如果不指定一个镜像的TAG 默认会拉取最新的版本镜像,即REPOSITORY:latest

名称 说明
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小
  1. $ docker image ls --format "{{.ID}}: {{.Repository}}"
  2. d52f49cef6ec: baxiang/redis
  3. efdb9fd40b2e: baxiang/helloworld
  4. cf0f3ca922e0: ubuntu
  5. d757f913db32: gcc
  6. 6d90dea6994b: debian
  7. 105ec214185d: debian
  8. 961769676411: alpine

—digest摘要信息

sha256 digest摘要信息
拉取镜像 k8s.gcr.io/ingress-nginx/controller:v0.47.0

  1. docker pull k8s.gcr.io/ingress-nginx/controller:v0.47.0
  2. v0.47.0: Pulling from ingress-nginx/controller
  3. ....
  4. Digest: sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
  5. Status: Downloaded newer image for k8s.gcr.io/ingress-nginx/controller:v0.47.0
  6. k8s.gcr.io/ingress-nginx/controller:v0.47.0

拉取镜像registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0

  1. v0.47.0: Pulling from google_containers/nginx-ingress-controller
  2. Digest: sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
  3. Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0
  4. registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0

查看镜像摘要信息

  1. docker images --digests |grep v0.47.0
  2. k8s.gcr.io/ingress-nginx/controller v0.47.0 sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b bf621a764db5 5 weeks ago 278MB
  3. registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller v0.47.0 sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b bf621a764db5 5 weeks ago 278MB

docker rmi

docker中删除images的命令是docker rmi,但有时候执行此命令并不能删除images

  1. # docker rmi 735f80812f90
  2. Error response from daemon: conflict: unable to delete 735f80812f90 (must be forced) - image is being used by stopped container 32791792f112

docker对于运行过的image都保留一个状态(container),可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container。

  1. # docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 32791792f112 ubuntu "echo 'hello world'" 23 minutes ago Exited (0) 23 minutes ago happy_kilby
  4. e72902bf3e15 hello-world "/hello" About an hour ago Exited (0) About an hour ago stoic_kare

所以想要删除运行过的images必须首先删除它的container

  1. # docker rm 32791792f112
  2. 32791792f112

再次执行rmi

  1. # docker rmi 735f80812f90
  2. Untagged: ubuntu:latest
  3. Untagged: ubuntu@sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
  4. Deleted: sha256:735f80812f90aca43213934fd321a75ef20b2e30948dbbdd2c240e8abaab8a28
  5. Deleted: sha256:86267d11f0c14fca869691b9b32bdd610b6ab8d9033d59ee64bdcc2cf0219bce
  6. Deleted: sha256:d9a8b3f912eee0b322b86fa0f6888558a468c384611c71178987b20e3a0ebafc
  7. Deleted: sha256:4e627d1476f22151f05e5214147d6cc6e03ad79a082f01aca6560aa75c7ade3a
  8. Deleted: sha256:757b76a12baba45fcbe76abbdd99723be9d94c12a2ad40354dc49ff5fbe1f5c1
  9. Deleted: sha256:f49017d4d5ce9c0f544c82ed5cbc0672fbcb593be77f954891b22b4d0d4c0a84

或者增加-f 参数强制删除

  1. # docker rmi -f 32791792f112

虚悬镜像/

下面一些特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>。这类无标签镜像也被称为虚悬镜像(dangling image)

图片.png

  1. $ docker image prune
  2. $ docker images|grep none|awk '{print $3}'|xargs docker rmi
  3. $ docker rmi -f `docker images|grep none| awk '{print $3}'`
  4. $ docker rmi $(docker images | grep "none" | awk '{print $3}')

删除所有镜像

  1. docker image prune -a
  2. # 或者
  3. docker image prune -a -f   #-f强制,无需确认

docker commit

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  1. Options:
  2. -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  3. -c, --change list Apply Dockerfile instruction to the created image
  4. -m, --message string Commit message
  5. -p, --pause Pause container during commit (default tru

Options说明:
-a, —author string 提交的镜像作者;
-c, —change list 使用Dockerfile指令来创建镜像
-m, —message string 提交时的说明文字;
-p, —pause 将容器暂停。默认是true

docker tag

给镜像打标签

  1. docker tag 镜像ID 远程仓库地址/镜像名:标签

k8s.gcr.io 无法下载的问题

  1. k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0

k8s.gcr.io 替换成 registry.aliyuncs.com/google_containers

  1. docker pull registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0

然后

  1. docker tag registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0 k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0

docker push

推送到镜像远程仓库

  1. docker push 远程仓库地址/镜像名:标签

docker save

  1. docker save -o 要保存的文件名 要保存的镜像

eg:

  1. docker save -o ubuntu-v2 idp/ubuntu:v2

保存es

  1. $ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
  2. $ docker save -o elasticsearch-7.10.1 docker.elastic.co/elasticsearch/elasticsearch:7.10.1

docker load

  1. $ sudo docker load --help
  2. Usage: docker load [OPTIONS]
  3. Load an image from a tar archive or STDIN
  4. Options:
  5. --help Print usage
  6. -i, --input string Read from tar archive file, instead of STDIN
  7. -q, --quiet Suppress the load output

解压

  1. sudo docker load -i ubuntu-v2

docker image prune

参数

  1. docker image prune --help
  2. Usage: docker image prune [OPTIONS]
  3. Remove unused images
  4. Options:
  5. -a, --all Remove all unused images, not just dangling ones
  6. --filter filter Provide filter values (e.g. 'until=<timestamp>')
  7. -f, --force Do not prompt for confirmation

-a 删除所有未使用的镜像
-f 不需要删除确认(不需要输入y确认)