Php 来自vs Docker compose图像的Dockerfile

Php 来自vs Docker compose图像的Dockerfile,php,docker,docker-compose,dockerfile,docker-image,Php,Docker,Docker Compose,Dockerfile,Docker Image,我目前正在学习Docker。在阅读了文档和几篇文章之后,我显然有更多的问题而不是答案。目前对我来说最有趣的一点是:两者之间的区别是什么 FROM some:docker-image 在Dockerfile和 image: digitalocean.com/php 在docker-compose.yml中 我明白他们应该抓取图像并从中创建一个容器。我不明白的是,如果我们同时指定两者,会发生什么情况,例如: version: '3' services: #PHP Service app

我目前正在学习Docker。在阅读了文档和几篇文章之后,我显然有更多的问题而不是答案。目前对我来说最有趣的一点是:两者之间的区别是什么

FROM some:docker-image
在Dockerfile和

image: digitalocean.com/php 
在docker-compose.yml中

我明白他们应该抓取图像并从中创建一个容器。我不明白的是,如果我们同时指定两者,会发生什么情况,例如:

version: '3'
services:
  #PHP Service
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php
docker-compose.yml和Dockerfile中都指定了图像。 当这些图像不同时会发生什么? docker-compose.yml会永远赢吗?这是一项服务吗?它会只使用这个“顶级”图像吗? 它们会以某种方式重叠吗? 或者也许我全搞错了


我确实看到了,但我仍然不确定我是否理解正在发生的事情。

区别在于构建运行

将图像视为应用程序,将容器视为运行应用程序的进程。运行应用程序不会更改应用程序。运行容器同样不会更改图像。图像是使用
docker build
Dockerfiles
生成的,并且是持久的。容器是由
docker run
docker compose
、kubernetes或类似的图像工具根据需要创建的,并且是临时的

dockerbuild
命令使用
Dockerfile
构建新映像。 在
Dockerfile
中,第一行通常使用
FROM
指定基本图像,即nginx中的
Dockerfile
中后续的
RUN
行提供了
docker build
将在shell中的
FROM
图像上下文中执行的附加步骤,以创建新图像。请注意,
Dockerfile
没有指定新映像的名称。相反,新图像在
-t some/name
选项中命名为
docker build

docker compose.yml
文件指定要下载的一组图像,并作为组合服务的一部分一起运行。例如,博客的
docker compose.yml
可以由web服务器映像、应用程序映像和数据库映像组成,不仅可以指定映像,还可以指定它们的通信方式

由于docker builds和docker compose是独立的操作,因此不存在冲突或差异检测。docker compose.yml
控制下载和运行的内容,您还可以构建任何您喜欢的内容

此外,正如@David Maze在评论中提到的:

如果您同时使用这两个选项,Docker Compose将按照指定构建图像,然后使用image:name;如果你把一个“标准”的图像名称放在那里,这可能会让人困惑


我的猜测是,如果你这样做,你可能会在自己的机器上得到一个与Dockerhub图像不匹配的图像,比如说
nginx
。不要那样做。相反,请为您生成的任何图像使用唯一的名称。

如果您这样做,Docker Compose将按照指定生成图像,然后使用
图像标记它:
名称;如果你把一个“标准”的图像名称放在那里,这可能会让人困惑。伙计们,这两个答案都很好,谢谢。我确实记得那部分文档,但是在我看到不同的配置之后,它有点混乱。因此,如果我同时使用这两种方法,那么来自compose的图像将为图像命名。如果仅在compose(例如nginx)中指定图像,并且不使用任何docker docker,则无论如何它都会抓取nginx图像,这将替换FROM?@Robert它不会替换FROM,因为没有docker文件时docker compose中没有图像生成步骤。docker compose将创建一些容器。图像不是容器。容器是从图像创建的。将图像视为应用程序,将容器视为运行应用程序的进程。这有帮助吗?一旦理解了这些概念,我强烈建议你通过实验和测试来确认你读到的任何东西。@Paul我想这只是我拙劣的词汇选择。我的意思是:当指定了in-compose文件映像(例如nginx)并且没有为该服务指定Dockerfile时,compose将尝试从远程存储库获取该就绪映像。当docker compose中指定docker文件和图像时,docker文件将用于构建图像,docker composer的图像标记将为其命名。不过就像你说的,我会彻底测试。我问这么多问题的原因是,我不想随便假设这总是会发生的事情,我宁愿理解这个过程。