Docker的镜像与容器常见面试答疑及命令行操作

Author Image
admin Friday, May 8, 2020 阅读数: 440

[YoYoMooc]Docker的镜像与容器常见面试答疑及命令行操作

推荐视频:

Docker的镜像与容器常见面试答疑及命令行操作

要让Docker能够正常工作,需要的是容器和镜像,它们是Docker的地基。镜像是一个模板,是运行一个应用程序所需的文件。 容器是由镜像创建的,用来执行隔离的应用,这样应用与应用之间就不会产生干扰。

接下来,我们将学习如何创建和使用镜像与容器,并演示如何使用Docker将ASP.NET Core 示例程序容器化。 分别运行在Linux和Windows容器中。

常见面试问答

提问 回答
镜像是什么? 镜像是包含应用程序所需的模板文件,镜像直接可以相互引用关联,使得通过镜像创建应用程序显得简单易用。
什么是容器? 容器是由镜像创建的应用程序实例,单一镜像可创建多个容器,它们之间彼此隔离。
为什么它们会变得流行? 镜像和容器是Docker的关键构建模块。镜像可以发布到Docker Hub,这样可以使它们被用于更多广泛的场景,无论是在组织内私有还是公开项目。
如何使用它们 使用Docker 文件中包含的命令。如创建镜像使用 docker build命令。指定镜像后使用docker create来创建容器。通过docker stopdocker start来停止或启动容器。
Docker是否有什么缺点和限制? 对于一些复杂的应用程序,从编写dockerfile文件到创建它为镜像,然后通过测试是一个耗时耗力的过程。
目前是否有任何替代方案? 没有。镜像和容器是Docker的核心功能。

涉及的命令行

命令 作用
docker image ls 查询所有的镜像
docker pull 下载镜像
docker rmi 删除镜像
docker build 创建一个自定义的镜像
docker create 创建容器
docker ps 查询所有的容器
docker start 启动容器
docker stop 停止容器
docker logs 查看容器的运行日志记录
docker run 创建并运行一个容器
docker cp 将文件复制到容器中
docker diff 查看容器文件的变化
docker exec 在容器中运行命令
docker commit 将修改的容器创建为镜像
docker tag 为镜像分配一个标记
docker login docker logout 从镜像仓库中登录或注销
docker push 将镜像发布到仓库中
docker inspect 查看容器的详细配置
 docker rmi -f $(docker image ls -aq)

操作镜像Hello-world

Hello-world 是编程界亘古不变的练习项目,同样Docker也提供了这样的一个项目,接下来我们通过操作一Hello-world镜像来掌握镜像的常用操作。

我们已经了解镜像是用于创建容器的模板,包含了容器我们所有的容器命令。

Hello-world镜像练习

下载镜像

首先我们下载镜像,输入以下命令:

docker pull hello-world

docker pull命令用于从仓库下载镜像,以便本地可用。通常不需要明确地执行此操作,因为其他管理镜像的Docker命令,在创建容器的时候会自动拉取所需的镜像(如果本地没有则会从仓库中下载到本地)。

返回结果:

Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete  
Digest: sha256:8e3114318a995a1ee497790535e7b88365222a21771ae7e53687ad76563e8e76
Status: Downloaded newer image for hello-world:latest

然后列出镜像

docker image ls

返回结果如下:

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB

这个输出中只显示了一个镜像,就是hello-world镜像。当Docker下载镜像来创建容器,它将镜像存储在本地,以加快未来任务的速度。

继续拉取一个hello-world镜像,这次我们给他添加一个Linux标记。

docker pull hello-world:linux

下载完成后,我们将所有的镜像列表显示出来

REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
hello-world linux bf756fb1ae65 4 months ago 13.3kB

我们可以看到除了标记不一样,这些镜像具有相同的IMAGE ID,因为它们包含相同的内容,这意味着hello-world的维护者使用两个不同的标签标记了同一个镜像。 Docker非常聪明,知道它已经存在了本地,所以它不会下载重复镜像的内容。

提示:您可以通过访问Docker Hub(https://hub.docker.com)来查看镜像有哪些标记,并搜索适合自己的镜像。

删除镜像

docker rmi 命令可以从机器上删除一个或多个镜像。镜像是通过以下方式删除的 指定它们的唯一 ID。输入以下命令:

docker rmi bf756fb1ae65

返回的结果为:

Error response from daemon: conflict: unable to delete bf756fb1ae65 (must be forced) - image is referenced in multiple repositories

告知我们当前无法删除镜像,如果要删除镜像的话,需要添加参数-f强制删除。

有时候删除单个镜像容易复制粘贴出错,所以我们可以使用批量删除镜像命令,

docker rmi -f $(docker images -q)

参数-q指定了从docker images命令中只返回镜像的ID,通过docker rmi删除所有的镜像。

小结

本章通过一个简单的镜像容器,练习了对镜像的 拉取和删除。

深入浅出 ASP.NET Core 与 Docker 入门课程