多个DockerFile

多个DockerFile,docker,docker-compose,dockerfile,Docker,Docker Compose,Dockerfile,我正在尝试使用docker,并希望创建一个Ubuntu基础,其中包含三个容器,它们可以执行以下操作: 容器:安装Wildfly 容器:安装MySQL 集装箱:其他所需包装 这是否意味着,我必须在三个不同的目录中创建三个DockerFile,每个目录都包含以下顶行 FROM ubuntu:18.04 您可以按照另一个答案@Krumelur的答案中的建议,在build命令中创建多个Dockerfile并精确指定它们的名称,但是如果中心中这些依赖项的基本映像与您的neeed匹配,您也可以通过直接从d

我正在尝试使用docker,并希望创建一个Ubuntu基础,其中包含三个容器,它们可以执行以下操作:

容器:安装Wildfly 容器:安装MySQL 集装箱:其他所需包装 这是否意味着,我必须在三个不同的目录中创建三个DockerFile,每个目录都包含以下顶行

FROM ubuntu:18.04

您可以按照另一个答案@Krumelur的答案中的建议,在build命令中创建多个Dockerfile并精确指定它们的名称,但是如果中心中这些依赖项的基本映像与您的neeed匹配,您也可以通过直接从docker.io调用映像来使用docker compose

这样,您根本不需要任何Dockerfile

应该是这样的:

version: '3.3'

services:
  wildfly:
    #this image will be automatically downloaded from your registry (by default Docker hub)
    image: jboss/wildfly 
    ports:
      - '8080:8080'
      - '9990:9990'
    volumes:
      - 'wildfly_data:/wildfly_data'
    environment:
      - WILDFLY_PASSWORD=password
  mysql:
    #this image will be automatically downloaded from your registry (by default Docker hub)
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'user'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - my-db:/var/lib/mysql

  otherService :
    image: busybox


volumes:
  my-db:
  wildfly_data:

然后您只需调用命令:docker compose up

您可以创建许多docker文件,并按照另一个答案@Krumelur的答案中的建议在build命令中精确命名,但如果中心中这些依赖项的基础映像与您的need匹配,您也可以通过直接从docker.io调用映像来使用docker compose

这样,您根本不需要任何Dockerfile

应该是这样的:

version: '3.3'

services:
  wildfly:
    #this image will be automatically downloaded from your registry (by default Docker hub)
    image: jboss/wildfly 
    ports:
      - '8080:8080'
      - '9990:9990'
    volumes:
      - 'wildfly_data:/wildfly_data'
    environment:
      - WILDFLY_PASSWORD=password
  mysql:
    #this image will be automatically downloaded from your registry (by default Docker hub)
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: 'db'
      # So you don't have to use root, but you can if you like
      MYSQL_USER: 'user'
      # You can use whatever password you like
      MYSQL_PASSWORD: 'password'
      # Password for root access
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      # <Port exposed> : < MySQL Port running inside container>
      - '3306:3306'
    expose:
      # Opens port 3306 on the container
      - '3306'
      # Where our data will be persisted
    volumes:
      - my-db:/var/lib/mysql

  otherService :
    image: busybox


volumes:
  my-db:
  wildfly_data:

然后您只需要调用命令:docker compose up

如果需要,您可以在同一目录中有多个docker文件。要指定要使用的Dockerfile,请使用-f参数,例如

docker build -f wildfly.Dockerfile ./wildfly
docker build -f mysql.Dockerfile ./mysql
docker build -f other.Dockerfile ./other
在Compose中,这些参数对应于dockerfile和context属性

并非总是需要编写docker文件,例如,对于数据库服务,您可以简单地从docker hub中提取图像并直接使用它。 像下面这样

db:
    image: mysql
db:
    image: mysql
当然,您可以让他们共享相同的上下文,例如

docker build -f wildfly.Dockerfile .
docker build -f mysql.Dockerfile .
docker build -f other.Dockerfile .
请注意,上下文已完全发送到daemon.dockrignore,因此如果存在大量冗余数据,这可能会导致生成时间更长

如果DockerFile之间有大量的重用,您甚至可以将它们全部放在一个文件中,例如

FROM ubuntu:20.04 as base
...
FROM base AS wildfly
(install wildfly)

FROM base AS mysql
(install mysql)
...
然后你可以用例如

docker build --target wildfly  .
在Compose中,这些参数对应于目标和上下文属性


这称为多阶段构建,并不总是一个好主意,但有时有助于缓解Docker对include的缺乏支持。

如果需要,可以在同一目录中有多个Dockerfile。要指定要使用的Dockerfile,请使用-f参数,例如

docker build -f wildfly.Dockerfile ./wildfly
docker build -f mysql.Dockerfile ./mysql
docker build -f other.Dockerfile ./other
在Compose中,这些参数对应于dockerfile和context属性

并非总是需要编写docker文件,例如,对于数据库服务,您可以简单地从docker hub中提取图像并直接使用它。 像下面这样

db:
    image: mysql
db:
    image: mysql
当然,您可以让他们共享相同的上下文,例如

docker build -f wildfly.Dockerfile .
docker build -f mysql.Dockerfile .
docker build -f other.Dockerfile .
请注意,上下文已完全发送到daemon.dockrignore,因此如果存在大量冗余数据,这可能会导致生成时间更长

如果DockerFile之间有大量的重用,您甚至可以将它们全部放在一个文件中,例如

FROM ubuntu:20.04 as base
...
FROM base AS wildfly
(install wildfly)

FROM base AS mysql
(install mysql)
...
然后你可以用例如

docker build --target wildfly  .
在Compose中,这些参数对应于目标和上下文属性


这称为多阶段构建,并不总是一个好主意,但有时有助于缓解Docker对include的缺乏支持。

使用Docker compose协调容器

1-创建docker-compose.yml

2-内部定义:

version: '3'
services:
  wildly:
    build:
      context: .
      dockerfile: Dockerfile_Wildfly
  mysql:
    build:
      context: .
      dockerfile: Dockerfile_Mysql
  anotherpackages:
    build:
      context: .
      dockerfile: Dockerfile_AnotherPackages
并非总是需要编写docker文件,例如,对于数据库服务,您可以简单地从docker hub中提取图像并直接使用它。 像下面这样

db:
    image: mysql
db:
    image: mysql
3-创建文件并定义您喜欢的命令:

Dockerfile_Wildfly
 FROM wildfly

Dockerfile_Mysql
 FROM mariadb

Dockerfile_AnotherPackages
 FROM node
 FROM nginx

用docker compose编排容器

1-创建docker-compose.yml

2-内部定义:

version: '3'
services:
  wildly:
    build:
      context: .
      dockerfile: Dockerfile_Wildfly
  mysql:
    build:
      context: .
      dockerfile: Dockerfile_Mysql
  anotherpackages:
    build:
      context: .
      dockerfile: Dockerfile_AnotherPackages
并非总是需要编写docker文件,例如,对于数据库服务,您可以简单地从docker hub中提取图像并直接使用它。 像下面这样

db:
    image: mysql
db:
    image: mysql
3-创建文件并定义您喜欢的命令:

Dockerfile_Wildfly
 FROM wildfly

Dockerfile_Mysql
 FROM mariadb

Dockerfile_AnotherPackages
 FROM node
 FROM nginx

我认为OP是根据他自己的形象建立起来的Dockerfiles@Krumelur例如他问这是否意味着,我必须在三个不同的目录中创建三个DockerFile,每个目录都包含以下顶行?…我的回答是:不,这并不意味着你必须创建三个DockerFile…如果你不想修改它们,你可以直接从中心调用基本映像。公平点,我不是这样读的,事实上@Krumelur是对的,我想从头开始创建DockerFile,而不是从中心加载它们。非常感谢你的回答。我认为OP是根据Dockerfiles@Krumelur例如他问这是否意味着,我必须在三个不同的目录中创建三个DockerFile,每个目录都包含以下顶行?…我的回答是:不,这并不意味着您必须创建三个DockerFile…如果不需要,您可以直接从中心调用基本映像
我想修改它们。公平地说,我没有那样读,但它也有道理。实际上@Krumelur是对的,我想从头开始创建DockerFile,而不是从中心加载它们。非常感谢你的回答。我也遇到过同样的问题。所以我同意这个解决方案。非常感谢投票。我很高兴我也遇到了同样的问题。所以我同意这个解决方案。非常感谢投票。我很高兴事情解决了