概念
- 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
- 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。
镜像操作命令
$ docker image --help
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
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查找
docker search [OPTIONS] TERM
通过docker hub查找,docker hub是docker的官方镜像仓库地址
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镜像
docker search -f=stars=20 --limit=5 centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 4585 [OK]
jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 99 [OK]
openshift/base-centos7 A Centos7 derived base image for Source-To-I… 31
只查找官方发布的mysql镜像
docker search -f is-official=true mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 6792 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2167 [OK]
percona Percona Server is a fork of the MySQL relati… 363 [OK]
可能因为某些不可抗力 打开很慢或者打不开,可以使用国内的镜像网站
七牛云镜像:https://hub.qiniu.com/home
daocloud镜像市场 https://hub.daocloud.io
docker pull
本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像,其命令格式是:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。由于中国的特殊国情,我们在安装Dockek改成了阿里云的
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
拉取centos最新的镜像
docker pull centos
Using default tag: latest
latest: Pulling from library/centos
256b176beaff: Pull complete
Digest: sha256:6f6d986d425aeabdc3a02cb61c02abb2e78e57357e92417d6d58332856024faf
Status: Downloaded newer image for centos:latest
拉取ubuntu 版本是16.04的镜像
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
Digest: sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 ubuntu:18.04
,因此将会获取官方镜像 library/ubuntu
仓库中标签为 18.04
的镜像。
docker run
使用 docker run 命令来在容器内运行一个应用程序
docker run ubuntu echo "hello world"
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
c64513b74145: Pull complete
01b8b12bad90: Pull complete
c5d85cf7a05f: Pull complete
b6b268720157: Pull complete
e12192999ff1: Pull complete
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for ubuntu:latest
hello world
以命令行的方式运营Ubuntu16.04版本
$ docker run -it --rm ubuntu:16.04 /bin/sh
# cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
—rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 —rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
/bin/sh:放在镜像名后的是命令,这里我们希望有个交互式 Shell
docker image
列出本地主机上的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 8789038981bc 3 days ago 188MB
ubuntu 18.04 16508e5c265d 3 days ago 84.1MB
centos latest 5182e96772bf 2 weeks ago 200MB
ubuntu 16.04 7aa3602ab41e 4 weeks ago 115MB
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 | 镜像大小 |
$ docker image ls --format "{{.ID}}: {{.Repository}}"
d52f49cef6ec: baxiang/redis
efdb9fd40b2e: baxiang/helloworld
cf0f3ca922e0: ubuntu
d757f913db32: gcc
6d90dea6994b: debian
105ec214185d: debian
961769676411: alpine
—digest摘要信息
sha256 digest摘要信息
拉取镜像 k8s.gcr.io/ingress-nginx/controller:v0.47.0
docker pull k8s.gcr.io/ingress-nginx/controller:v0.47.0
v0.47.0: Pulling from ingress-nginx/controller
....
Digest: sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
Status: Downloaded newer image for k8s.gcr.io/ingress-nginx/controller:v0.47.0
k8s.gcr.io/ingress-nginx/controller:v0.47.0
拉取镜像registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0
v0.47.0: Pulling from google_containers/nginx-ingress-controller
Digest: sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v0.47.0
查看镜像摘要信息
docker images --digests |grep v0.47.0
k8s.gcr.io/ingress-nginx/controller v0.47.0 sha256:a1e4efc107be0bb78f32eaec37bef17d7a0c81bec8066cdf2572508d21351d0b bf621a764db5 5 weeks ago 278MB
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
# docker rmi 735f80812f90
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。
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32791792f112 ubuntu "echo 'hello world'" 23 minutes ago Exited (0) 23 minutes ago happy_kilby
e72902bf3e15 hello-world "/hello" About an hour ago Exited (0) About an hour ago stoic_kare
所以想要删除运行过的images必须首先删除它的container
# docker rm 32791792f112
32791792f112
再次执行rmi
# docker rmi 735f80812f90
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Deleted: sha256:735f80812f90aca43213934fd321a75ef20b2e30948dbbdd2c240e8abaab8a28
Deleted: sha256:86267d11f0c14fca869691b9b32bdd610b6ab8d9033d59ee64bdcc2cf0219bce
Deleted: sha256:d9a8b3f912eee0b322b86fa0f6888558a468c384611c71178987b20e3a0ebafc
Deleted: sha256:4e627d1476f22151f05e5214147d6cc6e03ad79a082f01aca6560aa75c7ade3a
Deleted: sha256:757b76a12baba45fcbe76abbdd99723be9d94c12a2ad40354dc49ff5fbe1f5c1
Deleted: sha256:f49017d4d5ce9c0f544c82ed5cbc0672fbcb593be77f954891b22b4d0d4c0a84
或者增加-f 参数强制删除
# docker rmi -f 32791792f112
虚悬镜像/
下面一些特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>
。这类无标签镜像也被称为虚悬镜像(dangling image)
$ docker image prune
$ docker images|grep none|awk '{print $3}'|xargs docker rmi
$ docker rmi -f `docker images|grep none| awk '{print $3}'`
$ docker rmi $(docker images | grep "none" | awk '{print $3}')
删除所有镜像
docker image prune -a
# 或者
docker image prune -a -f #-f强制,无需确认
docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default tru
Options说明:
-a, —author string 提交的镜像作者;
-c, —change list 使用Dockerfile指令来创建镜像
-m, —message string 提交时的说明文字;
-p, —pause 将容器暂停。默认是true
docker tag
给镜像打标签
docker tag 镜像ID 远程仓库地址/镜像名:标签
k8s.gcr.io 无法下载的问题
k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0
k8s.gcr.io 替换成 registry.aliyuncs.com/google_containers
docker pull registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.1.0
然后
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
推送到镜像远程仓库
docker push 远程仓库地址/镜像名:标签
docker save
docker save -o 要保存的文件名 要保存的镜像
eg:
docker save -o ubuntu-v2 idp/ubuntu:v2
保存es
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
$ docker save -o elasticsearch-7.10.1 docker.elastic.co/elasticsearch/elasticsearch:7.10.1
docker load
$ sudo docker load --help
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Options:
--help Print usage
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
解压
sudo docker load -i ubuntu-v2
docker image prune
参数
docker image prune --help
Usage: docker image prune [OPTIONS]
Remove unused images
Options:
-a, --all Remove all unused images, not just dangling ones
--filter filter Provide filter values (e.g. 'until=<timestamp>')
-f, --force Do not prompt for confirmation
-a 删除所有未使用的镜像
-f 不需要删除确认(不需要输入y确认)