Dockerfile FROM 与 Docker-compose IMAGE
Dockerfile FROM vs Docker-compose IMAGE
我目前正在学习中Docker。阅读文档和几篇文章后,我的问题显然多于答案。目前对我来说最有趣的是:
之间有什么区别?
FROM some:docker-image
在Docker文件中和
image: digitalocean.com/php
在docker-compose.yml
我明白他们应该抓取图像并从中创建一个容器。我不明白的是如果我们同时指定两者会发生什么,例如:
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
docker-compose.yml 和 Docker 文件都指定了图像。
当这些图像不同时会发生什么?
docker-compose.yml 总是会赢吗?它会只使用这张 'top' 图像吗?
它们会以某种方式重叠吗?
又或许我都弄错了?
我确实看到了 ,但我仍然不确定我是否理解发生了什么。
区别是 build 与 运行
将图像视为应用程序,将容器视为 运行 应用程序的进程。 运行一个应用不改变应用。 运行容器同样不会改变图像。图像是使用 docker build
从 Dockerfiles
构建的,并且是持久的。容器是根据需要由 docker run
、docker-compose
、kubernetes 或类似的工具从图像中创建的,并且是临时的。
Dockerfile
被 docker build
命令用来建立一个新的图像。
在Dockerfile
中,第一行通常用FROM
指定基本图像,即FROM nginx
。 Dockerfile
中的后续 RUN
行提供了 docker build
将在 FROM
图像的上下文中在 shell 中执行的额外步骤,以创建新的图片。请注意,Dockerfile
没有指定新图像的名称。相反,新图像在 -t some/name
选项中命名为 docker build
docker-compose.yml
文件指定了一组要下载的图像,并且 运行 一起作为组合服务的一部分。例如,博客的 docker-compose.yml
可以包含网络服务器图像、应用程序图像和数据库图像,并且不仅会指定图像,还可能指定它们的通信方式。
由于 docker 构建和 docker 组合是独立的操作,因此不存在冲突或差异检测。 docker-compose.yml
控制要下载的内容和 运行,您也可以构建任何您喜欢的内容。
此外,正如@David Maze 在评论中提到的那样:
If you use both options then Docker Compose will build the image as specified and then tag it using the image: name; this can be confusing if you're putting a "standard" image name there.
我的猜测是,如果您这样做,您最终可能会得到一个与 Dockerhub 图像不匹配的图像,例如您自己机器上的 nginx
。不要那样做。相反,为您构建的任何图像使用唯一的名称。
what happens if we will specify both (image and Dockerfile) at the same time:
如果图像不存在,docker-compose 会尝试拉取它,除非您还指定了构建,在这种情况下,它会使用指定的选项构建它并使用指定的标签对其进行标记。
https://docs.docker.com/compose/compose-file/compose-file-v3/#image
我目前正在学习中Docker。阅读文档和几篇文章后,我的问题显然多于答案。目前对我来说最有趣的是:
之间有什么区别?FROM some:docker-image
在Docker文件中和
image: digitalocean.com/php
在docker-compose.yml
我明白他们应该抓取图像并从中创建一个容器。我不明白的是如果我们同时指定两者会发生什么,例如:
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
docker-compose.yml 和 Docker 文件都指定了图像。 当这些图像不同时会发生什么? docker-compose.yml 总是会赢吗?它会只使用这张 'top' 图像吗? 它们会以某种方式重叠吗? 又或许我都弄错了?
我确实看到了
区别是 build 与 运行
将图像视为应用程序,将容器视为 运行 应用程序的进程。 运行一个应用不改变应用。 运行容器同样不会改变图像。图像是使用 docker build
从 Dockerfiles
构建的,并且是持久的。容器是根据需要由 docker run
、docker-compose
、kubernetes 或类似的工具从图像中创建的,并且是临时的。
Dockerfile
被 docker build
命令用来建立一个新的图像。
在Dockerfile
中,第一行通常用FROM
指定基本图像,即FROM nginx
。 Dockerfile
中的后续 RUN
行提供了 docker build
将在 FROM
图像的上下文中在 shell 中执行的额外步骤,以创建新的图片。请注意,Dockerfile
没有指定新图像的名称。相反,新图像在 -t some/name
选项中命名为 docker build
docker-compose.yml
文件指定了一组要下载的图像,并且 运行 一起作为组合服务的一部分。例如,博客的 docker-compose.yml
可以包含网络服务器图像、应用程序图像和数据库图像,并且不仅会指定图像,还可能指定它们的通信方式。
由于 docker 构建和 docker 组合是独立的操作,因此不存在冲突或差异检测。 docker-compose.yml
控制要下载的内容和 运行,您也可以构建任何您喜欢的内容。
此外,正如@David Maze 在评论中提到的那样:
If you use both options then Docker Compose will build the image as specified and then tag it using the image: name; this can be confusing if you're putting a "standard" image name there.
我的猜测是,如果您这样做,您最终可能会得到一个与 Dockerhub 图像不匹配的图像,例如您自己机器上的 nginx
。不要那样做。相反,为您构建的任何图像使用唯一的名称。
what happens if we will specify both (image and Dockerfile) at the same time:
如果图像不存在,docker-compose 会尝试拉取它,除非您还指定了构建,在这种情况下,它会使用指定的选项构建它并使用指定的标签对其进行标记。 https://docs.docker.com/compose/compose-file/compose-file-v3/#image