Docker镜像可以理解为一个只读模板,其中包含运行容器所需的代码、运行时、库和依赖项。它可以被用来创建一个或多个Docker容器,确保在任何环境中运行时都有相同的依赖和配置。Docker镜像是由多个分层(layers)构成的,每一层都是在前一层之上的更改。这些层是不可变的,每一层都是只读的,并且只在需要更改时创建新的层。这样做的好处是可以大大减少存储空间和加速构建过程。
我们可以在DockerHub搜索别人已经封装好的镜像。获取镜像的命令:
docker pull [选项] [仓库地址]<仓库名>:<标签>
IP或域名:端口号
的形式用户名/软件名
,对于DockerHub,如果不给出用户名,默认是library
,指官方镜像这里我们下载一个Ubuntu14.04的镜像。
docker pull ubuntu:14.04
从图中我们可以看到Docker镜像的分层拉取过程。此外,如果你希望拉取一个非本地平台的镜像,可以使用--platform
参数,比如:docker pull --platform linux/arm64 ubuntu:14.04
,该命令特别指明拉取arm64
架构CPU下使用的镜像。
使用以下命令可以列出当前本机上存在的镜像。
docker images
这里我们可以看到刚才下载的Ubuntu镜像:
运行容器需要使用run
命令,即创建并执行容器。
docker run
有许多参数,针对不同的适用场景,具体可以参考文档,下面列举一些常见用法。
这里我们以运行Ubuntu镜像为例。
docker run -it --rm ubuntu:14.04 bash
-it
:启动交互式终端,it
实际上是两个参数,不过一般都是结合使用--rm
:容器退出后立即将其删除ubuntu:14.04
:运行的镜像名字bash
:放在镜像名后的是命令,这里我们指定启动bash程序执行该命令后,我们可以看到终端进入了镜像内部并启动了Bash。
这里我们以Redis为例。
docker run -d -p 6379:6379 redis:latest
-d
:指定容器在后台运行-p
:指定容器到主机的端口映射,格式为<宿主机端口>:<容器端口>
,6379:6379
即容器内部使用6379
端口,并映射到主机的6379
端口执行以下命令可以删除本机上存在的镜像。
docker rmi <镜像>
删除镜像时,我们可以通过镜像名字指定,也可以通过镜像ID指定。有实例化容器的镜像不能被删除,必须先删除容器(命令为docker rm
),才能删除镜像。
为镜像打Tag可以理解为给镜像复制一份(当然并没有真的在磁盘上复制文件)并指定一个新的坐标,基于这个新的Tag我们可以将镜像推送到指定的位置。
docker tag <镜像ID> [仓库地址]<仓库名>:<标签>
下面是一个例子,假如f6022158f52d
是Nginx在DockerHub发布的官方镜像,我们需要将其上传到我们的私服harbor.gacfox.com
上面,我们执行以下命令给镜像打了新的Tag然后使用docker push
命令推送即可。
docker tag f6022158f52d harbor.gacfox.com/public/nginx:1.20.1 && docker push harbor.gacfox.com/public/nginx:1.20.1
推送镜像很简单,我们使用docker push
命令加上镜像名字即可。
docker push [仓库地址]<仓库名>:<标签>
对于私服我们可能还需要登录认证,此时终端会提示输入用户名和密码,我们按要求输入即可。