Docker Compose
Table of contents
Why use Docker Compose?
Compose is a tool to help define and run containers/services.
It basically packs all those docker bulid ...
, docker run ...
commands into a single yaml
.
Dockerfile / docker-compose.yml
Dockerfile
Dockerfile defines the recipe to create an image.
docker-compose.yml
docker-compose.yml
defines services or containers that run images.
Example usage
version: '3.9'
services:
my-service:
container_name: my-container
build:
context: ./src
dockerfile: Dockerfile
ports:
- 1234:1234
volumes:
- ./src:/www
For ports
and volumes
the order of syntax is <host>:<container>
.
Useful commands
# Create and start containers
docker-compose up
# Build images and start containers
docker-compose up --build
# Start the containers in detached mode
docker-compose up --d
# Stop and remove containers and default networks
docker-compose down
# Lists containers (even the ones that are exited)
docker-compose ps
Itty Bitties
Suppose the project root directory is called proj
.
proj
├── docker-compose.yml
└── src
├── Dockerfile
└── ...
# docker-compose.yml
services:
my-service:
container_name: my-container
build:
context: ./src
dockerfile: Dockerfile
Build context
With docker build -f ../Dockerfile .
, it is possible for the Dockerfile to be outside of the build context.
However, it seems that with Compose, the Dockerfile
must be within the build context.
So in the example case Dockerfile
must be under src
, otherwise it will produce an error:
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to read dockerfile: open /var/lib/docker/tmp/your-build-context/Dockerfile: no such file or directory
Default network
Compose automatically creates a bridge network of name proj_default
, and adds all service containers to it.
Check that is is true by,
# Locate the created default network
docker network ls
# Inspect the containers in it
docker inspect proj_default
Then you will see my-container
listed under network proj_default
.