【Docker】Docker Compose入门:总结docker-compose.yml基础知识

作为备忘录

我想整理一下docker-compose.yml的编写方式和概述,所以写下来。

环境 – The environment

・宿主操作系统:Windows 10 Home
・虚拟操作系统:wsl2 Ubuntu20.04
・Docker 版本19.03
・Docker Compose 版本1.25.0

目录结构和文件内容

本文以以下列举的目录结构作为例子。(参考了这篇文章。)


.
|
── infra
   ├── mysql
   │   ├── Dockerfile
   │   └── my.cnf
   ├── nginx
   │   └── default.conf
   └── php
       ├── Dockerfile
       └── php.ini
── docker-compose.yml
── backend
    └── Laravelをインストールするディレクトリ

– 应用服务器
– 网络服务器
– 数据库服务器

构建由三层组成的LEMP架构。
原文章中采用了Laravel作为PHP框架,但由于本次的目的是整理docker-compose.yml的知识,所以不涉及。

docker-compose.yml文件的内容如下所示。


version: "3"
services:
  app:
    build: ./infra/php
    volumes:
      - ./backend:/work
    depends_on:
      - web
  web:
    image: nginx:1.18-alpine
    ports:
      - "10080:80"
    volumes:
      - ./backend:/work
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - db
    working_dir: /work

  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql

volumes:
  db-store:

docker-compose.yml以yml(yaml)文件格式编写。关于yml,首先要掌握以下内容。

– 使用缩进来表示层次结构。为了保证可读性,通常使用两个缩进来表示一个层次。
– 行首的 “-” 表示数组。在同一层次中的 “-” 是同一个数组的元素。
– “key: value” 这样的描述表示哈希。冒号后必须有一个半角空格。

经常使用的键

建立

在生成镜像时,您可以使用Dockerfile来定义。将Dockerfile的文件路径写入”value”字段中即可(无论是相对路径还是绝对路径都可以)。此外,Docker Compose会根据所指定的文件路径搜索名为Dockerfile的文件,所以可以省略Dockerfile的写法。

app:
  build: ./infra/php

这次情况下,将基于位于”./infra/php”的Dockerfile创建app容器的映像。

请用汉语进行本地化转述,只需要给出一种选项:

图片:

指定基本镜像以创建容器。例如,如果要直接使用官方镜像,应该使用此定义而不是构建操作。

 web:
   image: nginx:1.18-alpine

在这里,我们将使用nginx的官方镜像来生成web容器。

从上述中可以看出,对于一个容器来说,无法同时使用build和image。然而,在同一个docker-compose.yml文件中的不同容器可以根据需要使用这两种方法。

港口

指定容器公开的端口。
格式为“主机端口号:容器端口号”。
※在yaml文件中,如果格式类似于aa::bb会被解释为时间,所以最好用双引号将字符串引起来。


web:
  image: nginx:1.18-alpine
  ports:
    - "10080:80"

在这个例子中,我们将主机的10080端口和容器的80端口进行了对应关系。(80端口是nginx的默认端口号)

曝光

如果您不想将容器端口公开给主机,而只想打开与其他容器进行协作的情况下,可以使用expose而不是ports。

取决于:

定义容器的依赖关系。

web:
    image: nginx:1.18-alpine
    ports:
      - "10080:80"
    volumes:
      - ./backend:/work
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - db

在上面的例子中,定义了web容器依赖于db容器。具体来说,规定了db容器必须先启动,然后才能启动web容器。

然而,这仅仅是控制容器启动顺序,并不意味着Web服务器会等待容器中的数据库服务器准备就绪。

如果要使用这种规格,应用程序一侧需要采取对策。

冊數

将卷载入容器。考虑到这个术语对很多人来说并不常见,我简单地解释一下,大致就是这样的感觉。

・卷軸:容器被銷毀後仍然保存數據的數據存儲空間。簡單來說就是保存容器內數據的目錄。
・挂載:將外部文件加載到Linux操作系統中。

大致上来说,”由于容器不适合长期存储数据,因此应将其保存到外部操作系统中”这是一个大致的情况。(我认为这主要是因为通过容器进入vim编辑php不太方便…)

volumes可以通过”宿主机目录:容器内目录”的格式进行定义。

app:
  build: ./infra/php
  volumes:
    - ./backend:/work

ここではappコンテナ内にあるworkディレクトリ(およびその下のファイルやディレクトリ)をホスト側の./backendディレクトリにマウントしています。

まとめ・補足

在中文中,可以这样表达:虽然还有许多其他可定义的键,但我们首先总结了基本的键。首先,我想要充分理解build和volumes这些。

广告
将在 10 秒后关闭
bannerAds