docker-compose.yml 和 Dockerfile 如何协同工作?

问题描述 投票:0回答:3

据我了解,
Dockerfile就像创建镜像的config/recipe,而docker-compose用于轻松创建多个可能有关系的容器,避免通过docker命令重复创建容器。

有两个文件。

Dockerfile

FROM node:lts-alpine

WORKDIR /server

COPY package*.json ./

RUN npm install

COPY . . 

EXPOSE 3030

CMD ["npm", "run", "dev"]

docker-compose.yml

version: '2.1'

services:
  test-db:
    image: mysql:5.7
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=true
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=12345
      - MYSQL_DATABASE=test-db
    volumes:
      - ./db-data:/var/lib/mysql
    ports:
      - 3306:3306
  test-web:
    environment:
      - NODE_ENV=local
      #- DEBUG=*
      - PORT=3030
    image: node:lts-alpine
    build: ./
    command: >
        npm run dev
    volumes:
      - ./:/server
    ports:
      - "3030:3030"
    depends_on:
      - test-db

问题1
当我运行 docker-compose up --build

a.镜像将基于 Dockerfile 构建
b.那又怎样?

问题2

  test-db:
    image: mysql:5.7
  test-web:
    environment:
      - NODE_ENV=local
      #- DEBUG=*
      - PORT=3030
    image: node:lts-alpine

我正在使用上面的代码下载 dockerhub 的镜像,但是为什么以及何时需要在 --build 中创建的镜像?

问题3

    volumes:
      - ./db-data:/var/lib/mysql

这行是否意味着数据应该存储在内存位置 /var/lib/mysql 中,而我将此数据复制到工作目录 ./db-data 中?

更新

问题4

    build: ./

这条线是做什么用的?

docker docker-compose
3个回答
7
投票

建议仔细阅读入门,你的大部分问题都会得到解决。

让我尝试向您重点介绍其中一些。

  1. Dockerfile
    Compose file
    之间的区别
    1. Docker 可以通过读取 Dockerfile 中的指令来自动构建镜像
    2. Compose 是一个用于定义和运行多容器 Docker 应用程序的工具
    3. 主要区别是
      Dockerfile
      用于构建图像,而
      Compose
      用于构建和运行应用程序。
    4. 您必须通过
      Dockerfile
      构建图像,然后通过
      Compose
    5. 运行它
  2. 运行
    docker-compose up --build
    后,图像将构建并缓存在系统中,然后 Compose 将启动由
    docker-compose.yml
  3. 定义的容器
  4. 如果您指定
    image
    那么它将在构建时下载(如果指定
    build: ./
  5. 卷是持久保存 Docker 容器生成和使用的数据的首选机制。,镜像是只读的,删除容器后所有对容器的编辑都会被销毁,所以如果你想要的话,你必须使用
    Volumes
    持久数据。

记住,医生永远是你的朋友。


1
投票

我遇到了一个 docker 镜像无法工作的问题,我需要推出自己的镜像。 我仍然想使用 compose 将其与我的其他图像一起部署。

我在这里找到了答案:https://docs.docker.com/compose/compose-file/build/#illustrative-example

即使这是一个迟到的答案,我希望它对@123123的问题1有所帮助。


0
投票

Dockerfile 告诉 Docker 如何创建映像,以及有关该映像的某些方面(例如,它公开了哪些端口)。

但是一旦构建了镜像,您仍然需要运行它,否则您只是拥有一个不执行任何操作的静态镜像文件。虽然您可以“只运行”一个简单的映像,但运行一个复杂的映像可能需要您将两打命令行选项传递给 Docker,告诉它如何实际运行它。例如。如果暴露的端口可从外部使用,则必须将这些端口映射到真实端口。事实上,某些映像目录应该是位于本地文件层次结构中其他位置的卷,以便在映像重新启动后继续存在。每次运行都应设置环境变量。

您可以在一个 compose 文件中定义所有这些,而不是编写超级复杂的命令行调用,该文件只是有关如何实际运行图像的指令的集合。

但最重要的是,compose 可以简化整个设置过程,即它可以首先构建图像,然后运行它。这就是

build: ./
行的用途;它只是告诉 compose 进程在构建镜像时在当前工作目录中查找 Dockerfile。

由于构建、配置和运行镜像的整个过程现在已经简化,您还可以使用 compose 作为部署工具,轻松地将 Docker 镜像内的服务直接部署到服务器并在那里运行。您甚至可以将整个堆栈部署到一堆服务器(Docker 称之为

swarm
)。

例如如果我想直接调用

docker run
来运行图像而不是使用您发布的 compose.yml,则
test-db
的命令将是

docker run -d \
    --name test-db \
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
    -e MYSQL_USER=admin \
    -e MYSQL_PASSWORD=12345 \
    -e MYSQL_DATABASE=test-db \
    -v $(pwd)/db-data:/var/lib/mysql \
    -p 3306:3306 \
    mysql:5.7

test-web
的命令是

docker run -d \
    --name test-web \
    -e NODE_ENV=local \
    -e PORT=3030 \
    -v $(pwd):/server \
    -p 3030:3030 \
    --link test-db:mysql \
    node:lts-alpine \
    sh -c "npm run dev"
© www.soinside.com 2019 - 2024. All rights reserved.