Docker的镜像与容器常见面试答疑及命令行操作
admin
2021-06-03[YoYoMooc]Docker的镜像与容器常见面试答疑及命令行操作
推荐视频:
要让Docker能够正常工作,需要的是容器和镜像,它们是Docker的地基。镜像是一个模板,是运行一个应用程序所需的文件。 容器是由镜像创建的,用来执行隔离的应用,这样应用与应用之间就不会产生干扰。
接下来,我们将学习如何创建和使用镜像与容器,并演示如何使用Docker将ASP.NET Core 示例程序容器化。 分别运行在Linux和Windows容器中。
常见面试问答
提问 | 回答 |
---|---|
镜像是什么? | 镜像是包含应用程序所需的模板文件,镜像直接可以相互引用关联,使得通过镜像创建应用程序显得简单易用。 |
什么是容器? | 容器是由镜像创建的应用程序实例,单一镜像可创建多个容器,它们之间彼此隔离。 |
为什么它们会变得流行? | 镜像和容器是Docker的关键构建模块。镜像可以发布到Docker Hub,这样可以使它们被用于更多广泛的场景,无论是在组织内私有还是公开项目。 |
如何使用它们 | 使用Docker 文件中包含的命令。如创建镜像使用 docker build 命令。指定镜像后使用docker create 来创建容器。通过docker stop 和docker 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
镜像来掌握镜像的常用操作。
我们已经了解镜像是用于创建容器的模板,包含了容器我们所有的容器命令。
下载镜像
首先我们下载镜像,输入以下命令:
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
删除所有的镜像。
小结
本章通过一个简单的镜像容器,练习了对镜像的 拉取和删除。