【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这些。