Docker-Compose
Basic example
# docker-compose.yml version: '2' services: web: build: # build from Dockerfile context: ./Path dockerfile: Dockerfile ports: - "5000:5000" volumes: - .:/code redis: image: redis
Version 1 to 2
Docker compose is now integrated into the official Docker installation. The functionality only improved over that change, and the simple syntax change is : V1 : docker-compose ARG
to V2 docker compose ARG
More on that here : Docker Compose Migrate to V2
Commands
docker compose version docker compose config
docker compose start docker compose stop docker compose restart docker compose run
docker compose create docker compose attach docker compose pause docker compose unpause
docker compose wait docker compose up docker compose down
docker compose ps docker compose top docker compose events docker compose logs
docker compose images docker compose build docker compose push docker compose cp docker compose exec
Building
web: # build from Dockerfile build: . args: # Add build arguments APP_HOME: app
# build from custom Dockerfile build: context: ./dir dockerfile: Dockerfile.dev
# build from image image: ubuntu image: ubuntu:14.04 image: tutum/influxdb image: example-registry:4000/postgresql image: a4bc65fd
Ports
ports: - "3000" - "8000:80" # host:container
# expose ports to linked services (not to host) expose: ["3000"]
Commands
# command to execute command: bundle exec thin -p 3000 command: [bundle, exec, thin, -p, 3000]
# override the entrypoint entrypoint: /app/start.sh entrypoint: [php, -d, vendor/bin/phpunit]
Environment variables
# environment vars environment: RACK_ENV: development environment: - RACK_ENV=development
# environment vars from file env_file: .env env_file: [.env, .development.env]
Dependencies
# makes the `db` service available as the hostname `database` # (implies depends_on) links: - db:database - redis
# make sure `db` is alive before starting depends_on: - db
# make sure `db` is healty before starting # and db-init completed without failure depends_on: db: condition: service_healthy db-init: condition: service_completed_successfully
Other options
# make this service extend another extends: file: common.yml # optional service: webapp
volumes: - /var/lib/mysql - ./_data:/var/lib/mysql
# automatically restart container restart: unless-stopped # always, on-failure, no (default)
Advanced features
Labels
services: web: labels: com.example.description: "Accounting web app"
DNS servers
services: web: dns: 8.8.8.8 dns: - 8.8.8.8 - 8.8.4.4
Devices
services: web: devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
External links
services: web: external_links: - redis_1 - project_db_1:mysql
Healthcheck
# declare service healthy when `test` command succeed healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 1m30s timeout: 10s retries: 3 start_period: 40s
Hosts
services: web: extra_hosts: - "somehost:192.168.1.100"
Network
# creates a custom network called `frontend` networks: frontend:
External network
# join a pre-existing network networks: default: external: name: frontend
Volume
# mount host paths or named volumes, specified as sub-options to a service db: image: postgres:latest volumes: - "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock" - "dbdata:/var/lib/postgresql/data" volumes: dbdata:
User
# specifying user user: root
# specifying both user and group with ids user: 0:0
Follow me on : Medium Linkedin Researchgate