From 547d161248ca28186d8fa343d7b6207fb266e03a Mon Sep 17 00:00:00 2001 From: Allie Sadler <102604716+aevesdocker@users.noreply.github.com> Date: Thu, 18 Jan 2024 16:39:01 +0000 Subject: [PATCH] ENGDOCS-1944 (#19104) * ENGDOCS-1944 * edits * edits * change wording * change wording * review edits --- content/compose/_index.md | 34 ++--- content/compose/compose-application-model.md | 86 ++++++------ content/compose/compose-file/_index.md | 4 +- content/compose/compose-yaml-file.md | 29 ---- content/compose/faq.md | 2 +- content/compose/features-uses.md | 126 ------------------ .../compose/images/compose-application.webp | Bin 0 -> 47852 bytes content/compose/intro/features-uses.md | 68 ++++++++++ content/compose/{ => intro}/history.md | 18 +-- content/compose/reference/_index.md | 19 +++ data/init-cli/docker_init.yaml | 2 +- data/toc.yaml | 23 ++-- 12 files changed, 168 insertions(+), 243 deletions(-) delete mode 100644 content/compose/compose-yaml-file.md delete mode 100644 content/compose/features-uses.md create mode 100644 content/compose/images/compose-application.webp create mode 100644 content/compose/intro/features-uses.md rename content/compose/{ => intro}/history.md (74%) diff --git a/content/compose/_index.md b/content/compose/_index.md index e4f840d17a..5ccfe23032 100644 --- a/content/compose/_index.md +++ b/content/compose/_index.md @@ -6,6 +6,14 @@ keywords: docker compose, docker-compose, docker compose command, docker compose service title: Docker Compose overview grid: +- title: Why use Compose? + description: Understand Docker Compose's key benefits + icon: feature_search + link: /compose/intro/features-uses/ +- title: How Compose works + description: Understand how Compose works + icon: category + link: /compose/compose-application-model/ - title: Install Compose description: Follow the instructions on how to install Docker Compose. icon: download @@ -19,19 +27,19 @@ grid: description: Find out about the latest enhancements and bug fixes. icon: note_add link: /compose/release-notes -- title: Understand key features of Compose - description: Understand its key features and explore common use cases. - icon: category - link: /compose/features-uses/ - title: Explore the Compose file reference description: Find information on defining services, networks, and volumes for a Docker application. - icon: feature_search + icon: polyline link: /compose/compose-file - title: Browse common FAQs description: Explore general FAQs and find out how to give feedback. icon: help link: /compose/faq +- title: Migrate to Compose V2 + description: Learn how to migrate from Compose V1 to V2 + icon: folder_delete + link: /compose/migrate/ aliases: - /compose/cli-command/ - /compose/networking/swarm/ @@ -42,10 +50,11 @@ aliases: {{< include "compose-eol.md" >}} -Compose is a tool for defining and running multi-container Docker applications. -With Compose, you use a YAML file to configure your application's services. -Then, with a single command, you create and start all the services -from your configuration. +Docker Compose is a tool for defining and running multi-container applications. +It is the key to unlocking a streamlined and efficient development and deployment experience. + +Compose simplifies the control of your entire application stack, making it easy to manage services, networks, and volumes in a single, comprehensible YAML configuration file. Then, with a single command, you create and start all the services +from your configuration file. Compose works in all environments; production, staging, development, testing, as well as CI workflows. It also has commands for managing the whole lifecycle of your application: @@ -55,11 +64,4 @@ well as CI workflows. It also has commands for managing the whole lifecycle of y * Stream the log output of running services * Run a one-off command on a service -The key features of Compose that make it effective are: - -* [Have multiple isolated environments on a single host](features-uses.md#have-multiple-isolated-environments-on-a-single-host) -* [Preserve volume data when containers are created](features-uses.md#preserves-volume-data-when-containers-are-created) -* [Only recreate containers that have changed](features-uses.md#only-recreate-containers-that-have-changed) -* [Support variables and moving a composition between environments](features-uses.md#supports-variables-and-moving-a-composition-between-environments) - {{< grid >}} \ No newline at end of file diff --git a/content/compose/compose-application-model.md b/content/compose/compose-application-model.md index 962ac61a4b..82bd86a219 100644 --- a/content/compose/compose-application-model.md +++ b/content/compose/compose-application-model.md @@ -1,18 +1,23 @@ --- -title: Understand the Compose application model -description: Understand the Compose application model with an illustrative example +title: How Compose works +description: Understand how Compose works and the Compose application model with an illustrative example keywords: compose, docker compose, compose specification, compose model aliases: - /compose/compose-file/02-model/ +- /compose/compose-yaml-file/ --- -The Compose Specification lets you define a platform-agnostic container based application. Such an application is designed as a set of containers which have to both run together with adequate shared resources and communication channels. +Docker Compose relies on a YAML configuration file, usually named `compose.yaml`. + +The `compose.yaml` file follows the rules provided by the [Compose Specification](compose-file/_index.md) in how to define multi-container applications. This is the Docker Compose implementation of the formal [Compose Specification](https://github.com/compose-spec/compose-spec). + +{{< accordion title="The Compose application model" >}} Computing components of an application are defined as [services](compose-file/05-services.md). A service is an abstract concept implemented on platforms by running the same container image, and configuration, one or more times. -Services communicate with each other through [networks](compose-file/06-networks.md). In the Compose Specification, a network is a platform capability abstraction to establish an IP route between containers within services connected together. Low-level, platform-specific networking options are grouped into the Network definition and may be partially implemented on some platforms. +Services communicate with each other through [networks](compose-file/06-networks.md). In the Compose Specification, a network is a platform capability abstraction to establish an IP route between containers within services connected together. -Services store and share persistent data into [volumes](compose-file/07-volumes.md). The Specification describes such a persistent data as a high-level filesystem mount with global options. Actual platform-specific implementation details are grouped into the volumes definition and may be partially implemented on some platforms. +Services store and share persistent data into [volumes](compose-file/07-volumes.md). The Specification describes such a persistent data as a high-level filesystem mount with global options. Some services require configuration data that is dependent on the runtime or platform. For this, the Specification defines a dedicated [configs](compose-file/08-configs.md) concept. From a service container point of view, configs are comparable to volumes, in that they are files mounted into the container. But the actual definition involves distinct platform resources and services, which are abstracted by this type. @@ -23,16 +28,34 @@ A [secret](compose-file/09-secrets.md) is a specific flavor of configuration dat > With volumes, configs and secrets you can have a simple declaration at the top-level and then add more platform-specific information at the service level. A project is an individual deployment of an application specification on a platform. A project's name, set with the top-level [`name`](compose-file/04-version-and-name.md) attribute, is used to group -resources together and isolate them from other applications or other installation of the same Compose specified application with distinct parameters. If you are creating resources on a platform, you must prefix resource names by project and +resources together and isolate them from other applications or other installation of the same Compose-specified application with distinct parameters. If you are creating resources on a platform, you must prefix resource names by project and set the label `com.docker.compose.project`. -Compose offers a way for users to set a custom project name and override this name, so that the same `compose.yaml` file can be deployed twice on the same infrastructure, without changes, by just passing a distinct name. +Compose offers a way for you to set a custom project name and override this name, so that the same `compose.yaml` file can be deployed twice on the same infrastructure, without changes, by just passing a distinct name. -Project names must contain only lowercase letters, decimal digits, dashes, and underscores, and must begin with a lowercase letter or decimal digit. +{{< /accordion >}} + +You then interact with your Compose application through the [Compose CLI](reference/_index.md). Commands such as `docker compose up` are used to start the application, while `docker compose down` stops and removes the containers. + +## The Compose file + +The default path for a Compose file is `compose.yaml` (preferred) or `compose.yml` that is placed in the working directory. +Compose also supports `docker-compose.yaml` and `docker-compose.yml` for backwards compatibility of earlier versions. +If both files exist, Compose prefers the canonical `compose.yaml`. + +You can use [fragments](compose-file/10-fragments.md) and [extensions](compose-file/11-extension.md) to keep your Compose file efficient and easy to maintain. + +Multiple Compose files can be [merged](13-merge.md) together to define the application model. The combination of YAML files is implemented by appending or overriding YAML elements based on the Compose file order you set. +Simple attributes and maps get overridden by the highest order Compose file, lists get merged by appending. Relative +paths are resolved based on the first Compose file's parent folder, whenever complimentary files being +merged are hosted in other folders. As some Compose file elements can both be expressed as single strings or complex objects, merges apply to +the expanded form. For more information, see [Working with multiple Compose files](multiple-compose-files/_index.md) + +If you want to reuse other Compose files, or factor out parts of your application model into separate Compose files, you can also use [`include`](compose-file/14-include.md). This is useful if your Compose application is dependent on another application which is managed by a different team, or needs to be shared with others. ## Illustrative example -The following example illustrates the Compose Specification concepts outlined above. The example is non-normative. +The following example illustrates the Compose concepts outlined above. The example is non-normative. Consider an application split into a frontend web application and a backend service. @@ -42,40 +65,7 @@ The backend stores data in a persistent volume. Both services communicate with each other on an isolated back-tier network, while the frontend is also connected to a front-tier network and exposes port 443 for external usage. -```mermaid - %%{ init: { 'flowchart': { 'curve': 'linear' } } }%% - flowchart LR - subgraph A[INFRASTRUCTURE] - direction TB - subgraph TOP[" "] - subgraph B1[Frontend Service] - fs["`**webapp**`"] - end - style B1 fill:#ccd6e8, stroke-width:0px - subgraph B2[Backend Service] - bs["`**database**`"] - end - style B2 fill:#ccd6e8, stroke-width:0px - - end - style TOP fill:transparent, stroke-width:2px, stroke:#62affb, stroke-dasharray: 5 5 - key[ro= read only\nr+w = read write] - style key fill:transparent, stroke-width:0px,text-align: left, size: 94px - - direction TB - id2(Server\nCertificate) - id1(HTTP\nConfiguration) - id1 & id2 -.-|ro| B1 - style id1 stroke:#000,stroke-width:1px,stroke-dasharray: 10 - style id2 stroke:#000,stroke-width:1px,stroke-dasharray: 10 - B2 ==r+w==> id3[(Persistent\nVolume)] - end - style A fill:#eeeeee, stroke-width:0px - direction LR - id4[External\nUser] ---id5(((443)))--->|Frontend\nNetwork| B1 - style id4 stroke:#000,stroke-width:2px - B1 --Backend\nNetwork--> B2 -``` +![Compose application example](images/compose-application.webp) The example application is composed of the following parts: @@ -126,8 +116,8 @@ networks: back-tier: {} ``` -This example illustrates the distinction between volumes, configs and secrets. While all of them are all exposed -to service containers as mounted files or directories, only a volume can be configured for read+write access. -Secrets and configs are read-only. The volume configuration allows you to select a volume driver and pass driver options -to tweak volume management according to the actual infrastructure. Configs and secrets rely on platform services, -and are declared `external` as they are not managed as part of the application lifecycle. Compose uses a platform-specific lookup mechanism to retrieve runtime values. \ No newline at end of file +## What's next + +- [Try Compose](gettingstarted.md) +- [Explore some sample applications](samples-for-compose.md) +- [Familiarize yourself with the Compose Specification](compose-file/_index.md) \ No newline at end of file diff --git a/content/compose/compose-file/_index.md b/content/compose/compose-file/_index.md index a223befeda..bca420d361 100644 --- a/content/compose/compose-file/_index.md +++ b/content/compose/compose-file/_index.md @@ -39,10 +39,10 @@ aliases: >**New to Compose?** > -> Find more information about the [key features and use cases of Docker Compose](../features-uses.md) or [try the get started guide](../gettingstarted.md). +> Find more information about the [key features and use cases of Docker Compose](../intro/features-uses.md) or [try the get started guide](../gettingstarted.md). { .tip } -The Compose Specification is the latest and recommended version of the Compose file format. It helps you define a [Compose file](../compose-yaml-file.md) which is used to configure your Docker application’s services, networks, volumes, and more. +The Compose Specification is the latest and recommended version of the Compose file format. It helps you define a [Compose file](../compose-application-model.md) which is used to configure your Docker application’s services, networks, volumes, and more. Legacy versions 2.x and 3.x of the Compose file format were merged into the Compose Specification. It is implemented in versions 1.27.0 and above (also known as Compose V2) of the Docker Compose CLI. diff --git a/content/compose/compose-yaml-file.md b/content/compose/compose-yaml-file.md deleted file mode 100644 index 32caa5aad2..0000000000 --- a/content/compose/compose-yaml-file.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Understand the Compose file -description: Understand the Compose application model with an illustrative example -keywords: compose, docker compose, compose specification, compose model -aliases: -- /compose/compose-file/03-compose-file/ ---- - -The Compose file is a [YAML](http://yaml.org/) file defining: -- [Version](compose-file/04-version-and-name.md) (Optional) -- [Services](compose-file/05-services.md) (Required) -- [Networks](compose-file/06-networks.md) -- [Volumes](compose-file/07-volumes.md) -- [Configs](compose-file/08-configs.md) -- [Secrets](compose-file/09-secrets.md) - -The default path for a Compose file is `compose.yaml` (preferred) or `compose.yml` that is placed in the working directory. -Compose also supports `docker-compose.yaml` and `docker-compose.yml` for backwards compatibility of earlier versions. -If both files exist, Compose prefers the canonical `compose.yaml`. - -You can use [fragments](compose-file/10-fragments.md) and [extensions](compose-file/11-extension.md) to keep your Compose file efficient and easy to maintain. - -Multiple Compose files can be [merged](13-merge.md) together to define the application model. The combination of YAML files are implemented by appending or overriding YAML elements based on the Compose file order you set. -Simple attributes and maps get overridden by the highest order Compose file, lists get merged by appending. Relative -paths are resolved based on the first Compose file's parent folder, whenever complimentary files being -merged are hosted in other folders. As some Compose file elements can both be expressed as single strings or complex objects, merges apply to -the expanded form. - -If you want to reuse other Compose files, or factor out parts of you application model into separate Compose files, you can also use [`include`](compose-file/14-include.md). This is useful if your Compose application is dependent on another application which is managed by a different team, or needs to be shared with others. \ No newline at end of file diff --git a/content/compose/faq.md b/content/compose/faq.md index 85afb907af..a2e9009187 100644 --- a/content/compose/faq.md +++ b/content/compose/faq.md @@ -29,7 +29,7 @@ Version one of the Docker Compose command-line binary was first released in 2014 Version two of the Docker Compose command-line binary was announced in 2020, is written in Go, and is invoked with `docker compose`. Compose V2 ignores the version top-level element in the compose.yml file. -For further information, see [History and development of Compose](history.md). +For further information, see [History and development of Compose](intro/history.md). ### What's the difference between `up`, `run`, and `start`? diff --git a/content/compose/features-uses.md b/content/compose/features-uses.md deleted file mode 100644 index 48e3313ba6..0000000000 --- a/content/compose/features-uses.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -description: Key features and use cases of Docker Compose -keywords: documentation, docs, docker, compose, orchestration, containers, uses, features -title: Key features and use cases of Docker Compose ---- - -Using Compose is essentially a three-step process: - -1. Define your app's environment with a `Dockerfile` so it can be reproduced -anywhere. - -2. Define the services that make up your app in a `compose.yaml` file -so they can be run together in an isolated environment. - -3. Run `docker compose up` and the Docker compose command starts and runs your entire app. - -A `compose.yaml` looks like this: - -```yaml -services: - web: - build: . - ports: - - "8000:5000" - volumes: - - .:/code - - logvolume01:/var/log - depends_on: - - redis - redis: - image: redis -volumes: - logvolume01: {} -``` - -For more information about the Compose file, see the -[Compose file reference](compose-file/index.md). - -## Key features of Docker Compose - -### Have multiple isolated environments on a single host - -Compose uses a project name to isolate environments from each other. You can make use of this project name in several different contexts: - -* On a dev host, to create multiple copies of a single environment, such as when you want to run a stable copy for each feature branch of a project -* On a CI server, to keep builds from interfering with each other, you can set - the project name to a unique build number -* On a shared host or dev host, to prevent different projects, which may use the - same service names, from interfering with each other - -The default project name is the base name of the project directory. You can set -a custom project name by using the -[`-p` command line option](reference/index.md) or the -[`COMPOSE_PROJECT_NAME` environment variable](environment-variables/envvars.md#compose_project_name). - -The default project directory is the base directory of the Compose file. A custom value -for it can be defined with the `--project-directory` command line option. - -### Preserves volume data when containers are created - -Compose preserves all volumes used by your services. When `docker compose up` -runs, if it finds any containers from previous runs, it copies the volumes from -the old container to the new container. This process ensures that any data -you've created in volumes isn't lost. - -If you use `docker compose` on a Windows machine, see -[Environment variables](environment-variables/envvars.md) and adjust the necessary environment -variables for your specific needs. - -### Only recreate containers that have changed - -Compose caches the configuration used to create a container. When you -restart a service that has not changed, Compose re-uses the existing -containers. Re-using containers means that you can make changes to your -environment very quickly. - - -### Supports variables and moving a composition between environments - -Compose supports variables in the Compose file. You can use these variables -to customize your composition for different environments, or different users. - -You can extend a Compose file using the `extends` field or by creating multiple -Compose files. For more details, see [Working with multiple Compose files](multiple-compose-files/index.md). - -## Common use cases of Docker Compose - -Compose can be used in many different ways. Some common use cases are outlined -below. - -### Development environments - -When you're developing software, the ability to run an application in an -isolated environment and interact with it is crucial. The Compose command -line tool can be used to create the environment and interact with it. - -The [Compose file](compose-file/index.md) provides a way to document and configure -all of the application's service dependencies (databases, queues, caches, -web service APIs, etc). Using the Compose command line tool you can create -and start one or more containers for each dependency with a single command -(`docker compose up`). - -Together, these features provide a convenient way for developers to get -started on a project. Compose can reduce a multi-page "developer getting -started guide" to a single machine readable Compose file and a few commands. - -### Automated testing environments - -An important part of any Continuous Deployment or Continuous Integration process -is the automated test suite. Automated end-to-end testing requires an -environment in which to run tests. Compose provides a convenient way to create -and destroy isolated testing environments for your test suite. By defining the full environment in a [Compose file](compose-file/index.md), you can create and destroy these environments in just a few commands: - -```console -$ docker compose up -d -$ ./run_tests -$ docker compose down -``` - -### Single host deployments - -Compose has traditionally been focused on development and testing workflows, -but with each release we're making progress on more production-oriented features. - -For details on using production-oriented features, see -[Compose in production](production.md). \ No newline at end of file diff --git a/content/compose/images/compose-application.webp b/content/compose/images/compose-application.webp new file mode 100644 index 0000000000000000000000000000000000000000..32ff97918f4d2c8d9bf96da2fa6499a8af2b53e5 GIT binary patch literal 47852 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 @@ -13,9 +15,9 @@ This page provides: ## Introduction -![Image showing the main differences between Compose V1 and Compose V2](images/v1-versus-v2.png) +![Image showing the main differences between Compose V1 and Compose V2](../images/v1-versus-v2.png) -The image above shows that the currently supported version of the Docker Compose CLI is Compose V2 which is defined by the [Compose Specification](https://github.com/compose-spec/compose-spec). +The image above shows that the currently supported version of the Docker Compose CLI is Compose V2 which is defined by the [Compose Specification](../compose-file/_index.md). It also provides a quick snapshot of the differences in file formats, command-line syntax, and top-level elements. This is covered in more detail in the following sections. @@ -32,17 +34,17 @@ Compose V2 ignores the `version` top-level element in the `compose.yml` file. The Docker Compose CLIs are defined by specific file formats. Three major versions of the Compose file format for Compose V1 were released: -- [Compose file format 1](./compose-file/compose-versioning.md##version-1-to-2x) with Compose 1.0.0 in 2014 -- [Compose file format 2.x](./compose-file/compose-file-v2.md) with Compose 1.6.0 in 2016 -- [Compose file format 3.x](./compose-file/compose-file-v3.md) with Compose 1.10.0 in 2017 +- [Compose file format 1](../compose-file/compose-versioning.md##version-1-to-2x) with Compose 1.0.0 in 2014 +- [Compose file format 2.x](../compose-file/compose-file-v2.md) with Compose 1.6.0 in 2016 +- [Compose file format 3.x](../compose-file/compose-file-v3.md) with Compose 1.10.0 in 2017 Compose file format 1 is substantially different to all the following formats as it lacks a top-level `services` key. Its usage is historical and files written in this format don't run with Compose V2. Compose file format 2.x and 3.x are very similar to each other, but the latter introduced many new options targeted at Swarm deployments. -To address confusion around Compose CLI versioning, Compose file format versioning, and feature parity depending on whether Swarm mode was in use, file format 2.x and 3.x were merged into the [Compose Specification](compose-file/_index.md). +To address confusion around Compose CLI versioning, Compose file format versioning, and feature parity depending on whether Swarm mode was in use, file format 2.x and 3.x were merged into the [Compose Specification](../compose-file/_index.md). -Compose V2 uses the Compose Specification for project definition. Unlike the prior file formats, the Compose Specification is rolling and makes the `version` top-level element optional. Compose V2 also makes use of optional specifications - [Deploy](compose-file/deploy.md), [Develop](compose-file/develop.md) and [Build](compose-file/build.md). +Compose V2 uses the Compose Specification for project definition. Unlike the prior file formats, the Compose Specification is rolling and makes the `version` top-level element optional. Compose V2 also makes use of optional specifications - [Deploy](../compose-file/deploy.md), [Develop](../compose-file/develop.md) and [Build](../compose-file/build.md). -To make [migration](migrate.md) easier, Compose V2 has backwards compatibility for certain elements that have been deprecated or changed between Compose file format 2.x/3.x and the Compose Specification. +To make [migration](../migrate.md) easier, Compose V2 has backwards compatibility for certain elements that have been deprecated or changed between Compose file format 2.x/3.x and the Compose Specification. diff --git a/content/compose/reference/_index.md b/content/compose/reference/_index.md index ffe1ee2fb7..44a319cca4 100644 --- a/content/compose/reference/_index.md +++ b/content/compose/reference/_index.md @@ -176,6 +176,25 @@ underscores, and must begin with a lowercase letter or decimal digit. If the `basename` of the project directory or current directory violates this constraint, you must use one of the other mechanisms. +### Have multiple isolated environments on a single host + +Compose uses a project name to isolate environments from each other. You can make use of this project name in several different contexts: + +* On a dev host, to create multiple copies of a single environment, such as when you want to run a stable copy for each feature branch of a project +* On a CI server, to keep builds from interfering with each other, you can set + the project name to a unique build number +* On a shared host or dev host, to prevent different projects, which may use the + same service names, from interfering with each other + +The default project name is the base name of the project directory. You can set +a custom project name by using the +[`-p` command line option](reference/index.md) or the +[`COMPOSE_PROJECT_NAME` environment variable](../environment-variables/envvars.md#compose_project_name). + +The default project directory is the base directory of the Compose file. A custom value +for it can be defined with the `--project-directory` command line option. + + ## Use `--profile` to specify one or more active profiles Calling `docker compose --profile frontend up` will start the services with the diff --git a/data/init-cli/docker_init.yaml b/data/init-cli/docker_init.yaml index 6d45e1f5e1..ccc466d226 100644 --- a/data/init-cli/docker_init.yaml +++ b/data/init-cli/docker_init.yaml @@ -32,7 +32,7 @@ long: |- * [.dockerignore](../../../engine/reference/builder.md#dockerignore-file) * [Dockerfile](../../../engine/reference/builder.md) - * [compose.yaml](../../../compose/compose-yaml-file.md) + * [compose.yaml](../../../compose/compose-application-model.md) usage: docker init [OPTIONS] pname: docker diff --git a/data/toc.yaml b/data/toc.yaml index 9fe252244a..1706ef78d1 100644 --- a/data/toc.yaml +++ b/data/toc.yaml @@ -1937,14 +1937,12 @@ Manuals: section: - path: /compose/ title: Overview - - path: /compose/features-uses/ - title: Key features and use cases - - path: /compose/compose-application-model/ - title: Understand the Compose application model - - path: /compose/compose-yaml-file/ - title: Understand the Compose file - - path: /compose/history/ - title: History and development of Compose + - sectiontitle: Introduction to Compose + section: + - path: /compose/intro/features-uses/ + title: Why use Compose? + - path: /compose/intro/history/ + title: History and development of Compose - sectiontitle: Install Docker Compose section: - path: /compose/install/ @@ -1955,11 +1953,10 @@ Manuals: title: Install Compose standalone - path: /compose/install/uninstall/ title: Uninstall Compose - - path: /compose/migrate/ - title: Migrate to Compose V2 + - path: /compose/compose-application-model/ + title: How Compose works - path: /compose/gettingstarted/ - title: Try Docker Compose - + title: Try Compose - sectiontitle: Environment variables section: - path: /compose/environment-variables/ @@ -2000,6 +1997,8 @@ Manuals: title: Control startup order - path: /compose/samples-for-compose/ title: Sample apps with Compose + - path: /compose/migrate/ + title: Migrate to Compose V2 - path: /compose/release-notes/ title: Release notes