超详细!!关于Docker的使用镜像操作

需要搭建帮助的可以去taobao搜索Easy Company技术服务,谢谢!!!

一、获取镜像(这里以Ubuntu为例,其余镜像雷同)

(1)获取镜像

docker pull ubuntu:18.04

        上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub (docker.io)获取镜像。而镜像名称是 ubuntu:18.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 18.04 的镜像。docker pull 命令的输出结果最后一行给出了镜像的完整名称,即: docker.io/library/ubuntu:18.04

如果下载速度超级慢甚至连接超时,请你配置镜像加速器

(2)运行入库的镜像:ubuntu:18.04

docker run -it --rm ubuntu:18.04 bash

进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了

cat /etc/os-release

这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是Ubuntu 18.04.6 LTS 系统。

最后我们通过 exit 退出了这个容器。

(3)列出镜像

列出已经下载的所有镜像:

docker image ls

查看镜像、容器、数据卷所占用的空间:

docker system df

        由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像:

docker image ls -f dangling=true

可以看出我的docker没有虚悬镜像(dangling image)。

        如果有虚悬镜像(dangling image),但是虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:

docker image prune

        为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数。

docker image ls -a

由于刚使用镜像配置文件,所以还没有中间层镜像。

        不加任何参数的情况下,docker image ls 会列出所有顶层镜像,但是有时候我们只希望列出部分镜像。docker image ls 有好几个参数可以帮助做到这个事情。

根据仓库名列出镜像:

docker image ls ubuntu

列出特定的某个镜像,也就是说指定仓库名和标签:

docker image ls ubuntu:18.04

除此以外,docker image ls 还支持强大的过滤器参数 --filter,或者简写 -f。之前我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。比如,我们希望看到在 ubuntu:18.04 之后建立的镜像,可以用下面的命令:

docker image ls -f since=ubuntu:18.04

以特定格式显示

        利用 docker image ls 把所有的虚悬镜像的 ID 列出来,然后才可以交给 docker image rm 命令作为参数来删除指定的这些镜像,这个时候就用到了 -q 参数。

docker image ls -q

下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:

docker image ls --format "{{.ID}}: {{.Repository}}"


或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:

docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

(4)利用 commit 理解镜像构成

    docker commit 命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用 docker commit 定制镜像,定制镜像应该使用 Dockerfile 来完成。

        镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。

现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。

docker run --name webserver -d -p 80:80 nginx

        这条命令会用 nginx 镜像启动一个容器,命名为 webserver,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。

        如果是在本机运行的 Docker,那么可以直接访问:http://localhost ,如果是在虚拟机、云服务器上安装的 Docker,则需要将 localhost 换为虚拟机地址或者实际云服务器地址。

        如果我们不喜欢这个欢迎页面,我们希望改成其他你喜欢的文字,我们可以使用 docker exec 命令进入容器,修改其内容:

docker exec -it webserver bash
'<h1>Easy Company</h1>' > /usr/share/nginx/html/index.html
exit

我们修改了容器的文件,也就是改动了容器的存储层。我们可以通过 docker diff 命令看到具体的改动:

docker diff webserver

现在我们定制好了变化,我们希望能将其保存下来形成镜像。

要知道,当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

我们可以用下面的命令将容器保存为镜像:

docker commit \
  --author "Wang Jianxiong" \
  --message "Modify webpage" \
  webserver \
  nginx:v2

其中 --author 是指定修改的作者,而 --message 则是记录本次修改的内容。

然后可以在 docker image ls 中看到这个新定制的镜像:

docker image ls nginx

还可以用 docker history 具体查看镜像内的历史记录,如果比较 nginx:latest 的历史记录,我们会发现新增了我们刚刚提交的这一层。

docker history nginx:v2

新的镜像定制好后,我们可以来运行这个镜像:

docker run --name web2 -d -p 81:80 nginx:v2

这里命名为新的服务为 web2,并且映射到 81 端口。访问 http://localhost:81 看到结果,其内容应该和之前修改后的 webserver 一样。

至此,完成了定制镜像,使用的是 docker commit 命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。

慎用 docker commit

使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。

(5)使用 Dockerfile 定制镜像

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

还以之前定制 nginx 镜像为例,这次我们将使用 Dockerfile 来定制。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

mkdir mynginx
cd mynginx
touch Dockerfile

其内容为:

FROM nginx
RUN echo '<h1>Easy Company</h1>' > /usr/share/nginx/html/index.html

构建镜像

Dockerfile 文件所在目录执行:

docker build -t nginx:v3 .

docker build 命令最后有一个 .. 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定 上下文路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值