Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker 会从镜像仓库下载(默认是 Docker Hub 公共注册服务器中的仓库)。
1.可以使用 docker pull 命令来从仓库获取所需要的镜像。
docker pull [NAME] 可以预先将镜像拉到本地。镜像名必须完整地包含命名空间和仓库名。如果一个仓库中存在多个镜像,还必须制定 TAG,否则使用默认 TAG:latest。
下面的例子将从 Docker Hub 仓库下载一个Ubuntu 16.04 操作系统的镜像。
下载过程中,会输出获取镜像的每一层信息。
该命令实际上相当于$ sudo docker pull registry.hub.docker.com/ubuntu:16.04命令,即从注册服务器 registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 16.04的镜像。
2.docker run 命令运行时会在本地寻找镜像,找不到的时候就会去 Docker Hub上面搜索并下载后运行。
docker search [NAME] 下载之前可以通过search 命令查找搜索符合的镜像
关于上面字段的说明
NAME:镜像名称。DESCRIPTION:镜像的简要描述。STARS:用户对镜像的评分。OFFICIAL:是否为官方镜像。AUTOMATED:是否使用了自动构建。使用 docker images 显示本地已有的镜像。
有时候官方仓库注册服务器下载较慢,可以从其他仓库下载。 从其它仓库下载时需要指定完整的仓库注册服务器地址。
待完成后,例如下面的命令指定使用镜像 ubuntu:16.04 来启动一个容器,让其中运行 bash 应用如下`
sudo docker run -t -i ubuntu:16.04 /bin/bash使用 docker images 显示本地已有的镜像。
在列出信息中,可以看到几个字段信息
REPOSITORY:仓库名称。来自于哪个仓库,比如 ubuntu
[namespace/centos]:由命名空间和实际的仓库名称组成。当你再Docker Hub上注册一个账户时,账户名自动成为你的命名空间,该命名空间是用来区分Docke Hub上注册的不同用户或者组织的。[centos]:只有仓库名。属于顶级命名空间,只用于官方镜像。[dl.dockerpool.com:5000\centos:7]:指定URL路径的方式。适用于自己搭建的Hub或者第三方Hub上获取镜像。TAG:用于区分同一个仓库中的不同镜像。镜像的标记,比如 14.04
IMAGE ID:镜像的唯一标识:64位HashID。CREATED:镜像 的创建时间。SIZE:镜像所占用的虚拟大小,该大小包含了所有共享文件的大小。其中镜像的 ID 唯一标识了镜像,如果 ID 号相同则说明是同一镜像。TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如 10.04、12.04、12.10、13.04、14.04 等。
Note 1: docker images ce* 使用通配符,可以找到符合条件的一系列镜像。
Note 2: docker inspect [NAME]/[CONTAINER ID] 查看更详细的镜像信息 docker images 只会列出镜像的基本信息,详细信息可以通过 inspect 命令查看
创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个。
构建镜像的两种方式 1.从容器构建镜像(以下简称容器镜像)
创建一个容器,比如使用 tomcat:latest 镜像创建一个tomcat-test 容器修改 tomcat-test 容器的文件系统,比如修改 tomcat 的 server.xml 文件中的默认端口使用 commit 命令提交镜像2.使用 Dockerfile 构建镜像(以下简称 Dockerfile 镜像)
编写 Dockerfile 文件使用 build 命令构建镜像Note: 建议使用第二种方式构建镜像
docker rmi [NAME]/[CONTAINER ID] 对于不需要的镜像,可以使用 rmi 命令删除。与移除容器的命令 rm 相比,删除镜像的命令多了一个 i,i 即 image 的意思。删除镜像必须保证先停止了相关容器或者删除了相关容器
1.停止相关容器(Container),这样才能够删除其中的 images
docker stop [OPTIONS] CONTAINER [CONTAINER...]1.docker stop $(docker ps -a -q) ,停止所有的 容器(Container) 2.删除所有 container ,再添加此指令: docker rm $(docker ps -a -q) 3.docker ps -a 用来列出所有容器的 ID
2.查看当前的 images
docker images3.删除 images,需指定 image 的 id
docker rmi <image id>删除 untagged 镜像(即 id 为 的 image : docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
4.删除全部 images
docker rmi $(docker images -q)1.删除多个:多个镜像之间使用空格隔开。 2. -f 强制删除,大部分删不掉的情况可能是因为这个镜像被容器依赖了,可以选择先移除容器。 3.docker rm $(docker ps -a -q) 如果本地有很多已经停止运行的容器,一个个删除很麻烦,可以使用下面的命令将这些容器一次性删除,这样就能减少无用容器对镜像的依赖。
1.导出镜像
使用 docker save 命令可以导出镜像到本地文件。
2.载入文件 可以使用 docker load 从导出的本地文件中再导入到本地镜像库,例如
sudo docker load --input ubuntu_16.04.tar或
sudo docker load < ubuntu_16.04.tar1.Docker 镜像的内容
镜像的表示分为四部分
红色的部分是镜像中心域名黄色的部分是镜像命名空间,我们可以根据命名空间进行权限控制等操作绿色是镜像的名称蓝色即是镜像版本,每个镜像有一个版本(即标签)Docker 镜像的内容主要分为两部分:1.镜像层文件内容 ;2.镜像 json 文件
2.Docker 镜像的存储位置 既然是说镜像存储的位置,那么应该包含:镜像层文件 和 镜像 json 文件。如一个 ubuntu:14.04 镜像,包含 4 个镜像层,在 aufs 存储驱动的情况下,在磁盘上的情况可以如以下图所示:
2.1 通过命令 docker history ubuntu:16.04 查看 ubuntu:16.04 镜像层组成
2.2 查看镜像层文件内容存储
Docker 镜像层的内容一般在 Docker 镜像目录下
Docker version 17.12.0-ce 版本的镜像层内容可以查看如下
containers 目录下每个序列号都是一个镜像,进入镜像下即是镜像内容
2.3 同级目录下的 image 里的 repositories.json 文件记录镜像的相关信息
Docker官方的镜像不需要镜像中心的域名,有一些镜像可以省略命名空间。
镜像转化 Docker 容器的依据是每个镜像的 json 文件,Docker可以通过解析 Docker 镜像的 json 的文件,获知应该在这个镜像之上运行什么样的进程,应该为进程配置怎么样的环境变量,此时也就实现了静态向动态的转变。
Docker 文件系统
谁来执行这个转化工作?答案是 Docker守护进程 。也许大家早就理解这样一句 话:Docker 容器实质上就是一个或者多个进程,而容器的父进程就是 Docker守护进程 。这样的,转化工作的执行就不难理解了:Docker 守护进程 手握 Docker镜像的json文件,为容器配置相应的环境,并真正运行 Docker 镜像所指定的进程,完成 Docker 容器的真正创建。
Docker 容器运行起来之后,Docker 镜像 json 文件就失去作用了。此时 Docker 镜像的绝大部分作用就是:为 Docker 容器提供一个文件系统的视角,供容器内部的进程访问文件资源。
信息提供源自 Docker镜像原理和最佳实践 、深入分析Docker镜像原理