转载过程中,图片丢失,代码显示错乱。
为了更好的学习内容,请访问原创版本:
https://www.missshi.cn/api/view/blog/5a6327c00a745f6335000004
Ps:初次访问由于js文件较大,请耐心等候(5s左右)
在之前的文章中,我们已经讲解了什么是Docker,以及如何运行Docker容器。
接下来,我们将要继续讲解Docker镜像的相关概念与操作。
Docker镜像是启动容器的基石。
本文中将会讲解如何管理、修改镜像以及镜像存储仓库Registry的相关知识。
什么是Docker镜像
Docker镜像是由文件系统叠加而成。
最底端是一个文件引导系统,即bootfs。Docker用户不会与引导文件系统有直接的交互。
Docker镜像的第二层是root文件系统rootfs,通常是一种或多种操作系统,例如ubuntu等。
在Docker中,文件系统永远都是只读的,在每次修改时,都是进行拷贝叠加从而形成最终的文件系统。
Docker称这样的文件为镜像。一个镜像可以迭代在另一个镜像的顶部。位于下方的镜像称之为父镜像,最底层的镜像称之为基础镜像。最后,当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
Docker的这种机制我们称之为写时复制。
查看镜像列表
接下来,我们将详细了解一下关于镜像相关的一些操作。
首先是查询镜像列表:
sudo docker images
该命令可以用于查找当前系统中所有存在的镜像列表。
Ps:本地镜像默认保存在Docker宿主机的/var/lib/docker目录下。
所有的镜像都是保存在仓库中,而仓库位于Registry中。默认的Registry是Docker公司运营的Docker Hub。
每个镜像仓库都可以存放很多的镜像。
例如ubuntu镜像仓库存放着各种不同版本的Ubuntu镜像。
使用如下命令可以拉取镜像:
sudo docker pull ubuntu
上述命令会拉取所有版本的ubuntu镜像到本地。
为了区分同一个仓库中不同的镜像,Docker提供了一种tag的功能。
我们可以给每个版本的镜像添加一个唯一的tag来标识该镜像。此时,镜像的名称如下:仓库名称:tag。
我们在运行镜像或拉取镜像时,可以直接指定对应的标签。例如:
sudo docker run -it ubuntu:16.04 /bin/bash
默认情况下,在run中如果没有指定镜像的tag,将会默认去寻找latest标签的镜像。
除了仓库名称和tag以外,我们还可以将镜像分为两个类别:一种是Docker用户自己创建的用户仓库,还有一种是Docker官方维护的顶层仓库。
用于仓库的完整名称是由用户名称/仓库名称组成的。
而对于顶层仓库而言,则没有用户名称,直接是仓库名称。
总结一下,对于一个仓库而言,完成的格式如下:[用户名称/]仓库名称:tag
。
拉取镜像
在使用docker run从一个镜像启动容器时,Docker首先会现在本地查找是否存在该镜像。如果在本地没有找到该镜像,则会先从Dockers Hub上下载该镜像后在运行。
Ps:如之前所说,如果没有指定tag,则默认使用latest标签。
查找镜像
我们如果想要从Docker Hub查找有哪些公共的可用镜像时,可以使用如下命令:
sudo docker search keywords
构建镜像
在上面的内容中,我们已经了解了如下查询,拉取,运行镜像,那么接下来我们将会继续学习如何修改、更新和管理自己的镜像。
构建镜像的方式有以下两种:
- 使用
docker commit
构建 - 使用
docker build
和Dockerfile文件来构建
相比较而言,我们更加推荐使用方法2来构建。因为方法2更加的灵活和强大。
Ps:我们通常并不是从零开始构建一个镜像,而是从一个base镜像开始修改构建的。
在接下来的内容中,我们首先将会简单的讲解一下如何通过docker commit来修改镜像。但更多的精力将会用于详细讲解如何利用dockerfile来构建镜像。
创建docker hub账号
在构建镜像中,很重要的一环就是共享和发布镜像。
通常,我们都会将镜像推送到Docker Hub来共享镜像。
我们需要进入Docker Hub首先注册一个账号:https://hub.docker.com/
注册完成后,我们可以通过命令行在本地绑定对应的Docker Hub账号。
sudo docker login
# Username: ***
# Password:
# Email: ***
# Login Succeed
使用docker commit命令来创建镜像
创建Docker镜像的第一种方法就是通过commit命令。
流程简介如下:
- 根据某个镜像创建一个容器
- 对该容器进行一些修改
- 提交该容器并生成一个新的镜像。
示例:
sudo docker run -it ubuntu /bin/bash
root@b3f9427a5039:/# apt-get -yqq update
root@b3f9427a5039:/#