Compose
The docker-compose tool is a very simple, yet powerful tool and has been conceived and concretized to facilitate the running of a group of Docker containers. In other words, docker-compose is an orchestration framework that lets you define and control a multi-container service. It enables you to create a fast and isolated development environment as well as the ability to orchestrate multiple Docker containers in production. The docker-compose tool internally leverages the Docker engine for * pulling images * building the images * starting the containers in a correct sequence, and making the right connectivity/linking among the containers/services based on the definition given in the docker-compose.yml file.
Compose is used for defining and running Docker applications for multiple containers. With Compose you use a Compose file to configure the services of your application. Then, with a single command, you create and launch all the services from your configuration. For more information about all Compose features, see the list of features.
Using Compose is essentially a three-step process:
- Define the environment of your app with a docker file so you can play it anywhere.
- Define the services that make up your app in docker-compose.yml so they can run together in an isolated environment.
- Finally run docker-compose up and Compose will start and run your entire app.
The docker-compose tool orchestrates containers using the docker-compose.yml file, in which you can define the services that need to be crafted, the relationships between these services, and their runtime properties.
The default docker-compose file is docker-compose.yml, which can be changed using the -f option of the docker-compose tool.
The following is the format of the docker-compose.yml file:
version: "3.7"
services:
<service>:
<key>: <value>
<key>:
- <value>
- <value>
<service>:
...
volumes:
...
networks:
...
The following example shows a docker-compose.yml file:
keys supported in the docker-compose
| Key | Description |
|---|---|
| image | This is the tag or image ID |
| build | This is the path to a directory containing a Dockerfile |
| command | This key overrides the default command |
| links | This key links to containers in another service |
| external_links | This key links to containers started either by some other docker-compose.yml |
| ports | This key exposes ports and specifies both the ports HOST_port:CONTAINER_port |
| expose | This key exposes ports without publishing them to the host machine |
| volumes | This key mounts paths as volumes |
| volumes_from | This key mounts all of the volumes from another container |
| environment | This adds environment variables and uses either an array or a dictionary |
| Key | Description |
|---|---|
| env_file | This adds environment variables to a file |
| extends | This extends another service defined in the same or different configuration file |
| net | This is the networking mode, which has the same values as the Docker client --net option |
| pid | This enables the PID space sharing between the host and the containers |
| dns | This sets custom DNS servers |
| cap_add | This adds a capability to the container |
| cap_drop | This drops a capability of the container |
| dns_search | This sets custom DNS search servers |
| working_dir | This changes the working directory inside the container |
| entrypoint | This overrides the default entrypoint |
| Key | Description |
|---|---|
| user | This sets the default user |
| hostname | This sets a container's host name |
| domainname | This sets the domain name |
| mem_limit | This limits the memory |
| privileged | This gives extended privileges |
| restart | This sets the restart policy of the container |
| stdin_open | This enables the standard input facility |
| tty | This enables text based control such as a terminal |
| cpu_shares | This sets the CPU shares (relative weight) |
docker-compose command
All the docker-compose commands use the docker-compose.yml file as the base to orchestrate one or more services.
the syntax of the docker-compose command:
--verbose: This shows more output--version: This prints the version and exits-f, --file <file>: This specifies an alternate file for docker-compose- default is the docker-compose.yml file
-p, --project-name <name>: This specifies an alternate project name- default is the directory name
| Command | Description |
|---|---|
| build | builds or rebuilds services |
| kill | kills containers |
| logs | displays the output from the continers |
| port | prints the public port for s port binding |
| ps | list the containers |
| pull | pulls the service images |
| rm | removes the stopped containers |
| run | runs a one-off command |
| scale | sets a number of containers for a service |
| start | starts services |
| stop | stops services |
| up | this creates and starts containers |
| down | stop and remove containers, networks, images and volumes |
Exercise
consider the follwoing compose file:
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress
links:
- db:mysql
ports:
- 8080:80
environment:
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
deploy the compose file: