Dockerfile FROM与Docker-compose IMAGE

时间:2019-07-11 21:57:22

标签: 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:
    build:
      context: .
      dockerfile: Dockerfile
    image: digitalocean.com/php

docker-compose.yml和Dockerfile均具有指定的映像。 当这些图像不同时会发生什么? docker-compose.yml是否将始终获胜,并获得一项服务?它会仅使用此“顶部”图像吗? 它们会以某种方式重叠吗? 还是我弄错了?

我确实看到了this,但仍然不确定我是否了解发生了什么事。

1 个答案:

答案 0 :(得分:1)

构建运行

将图像视为应用程序,将容器视为运行应用程序的进程。运行应用程序不会更改应用程序。同样运行容器不会更改映像。图像是使用Dockerfilesdocker build构建的,并且是永久的。 docker rundocker-compose,kubernetes或类似工具根据需要从图像创建容器,这些容器是临时的。

Dockerfile命令使用docker build来构建新图像。  在Dockerfile中,第一行通常使用FROM,即FROM nginx指定基本图片。 RUN中的后续Dockerfile行提供了docker build将在FROM映像的上下文中在Shell中执行的其他步骤,以创建新映像。请注意,Dockerfile没有指定新图像的名称。而是在-t some/name的{​​{1}}选项中命名新图像

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

由于docker构建和docker compose是独立的操作,因此不会发生冲突或检测到差异。 docker-compose.yml控制着将要下载和运行的内容,您也可以构建自己喜欢的任何东西。

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

  

如果同时使用这两个选项,则Docker Compose将按照指定的方式构建映像,然后使用image:name;标签对其进行标记。如果在其中放置“标准”图像名称,可能会造成混淆。

我的猜测是,如果这样做,您最终可能会在自己的机器上得到与Dockerhub映像不匹配的映像,例如说docker-compose.yml。不要那样做相反,对您生成的任何图像使用唯一的名称。