2 minute read

docker-compose

 * configure relationships between containers
 * save our docker container run settings in easy to read file
 * create one-liner developer environment startups
 * comprised of 2 separate but related things
 * using yaml 
  - containers
  - networks
  - volumes
 *

docker-compose.yaml

  version: '3.1'  # if no version is specified then v1 is assumed. Recommend v2 minimum

  services:  # containers. same as docker run
    servicename: # a friendly name. this is also DNS name inside network
      image: # Optional if you use build:
      command: # Optional, replace the default CMD specified by the image
      environment: # Optional, same as -e in docker run
      volumes: # Optional, same as -v in docker run
    servicename2:

  volumes: # Optional, same as docker volume create

  networks: # Optional, same as docker network create
  ////////////// example
  version: '2'

  # same as 
  # docker run -p 80:4000 -v $(pwd):/site bretfisher/jekyll-serve

  services:
    jekyll:
      image: bretfisher/jekyll-serve
      volumes:
        - .:/site
      ports:
        - '80:4000'


  ////////////// example2
  version: '2'
  services:

    wordpress:
      image: wordpress
      ports:
        - 8080:80
      environment:
        WORDPRESS_DB_HOST: mysql
        WORDPRESS_DB_NAME: wordpress
        WORDPRESS_DB_USER: example
        WORDPRESS_DB_PASSWORD: examplePW
      volumes:
        - ./wordpress-data:/var/www/html

    mysql:
      # we sue mariadb here for arm support
      # mariadb is a fork of MySQL that's often faster and better multi-platform
      image: mariadb
      environment:
        MYSQL_ROOT_PASSWORD: examplerootPW
        MYSQL_DATABASE: wordpress
        MYSQL_USER: example
        MYSQL_PASSWORD: examplePW
      volumes:
        - mysql-data:/var/lib/mysql

  volumes:
    mysql-data:
  ////////////// example3
  version: '3'
# NOTE: This example only works on x86_64 (amd64)
# Percona doesn't yet publish arm64 (Apple Silicon M1) or arm/v7 (Raspberry Pi 32-bit) images

services:
  ghost:
    image: ghost // webserver
    ports:
      - "80:2368"
    environment:
      - URL=http://localhost
      - NODE_ENV=production
      - MYSQL_HOST=mysql-primary
      - MYSQL_PASSWORD=mypass
      - MYSQL_DATABASE=ghost
    volumes:
      - ./config.js:/var/lib/ghost/config.js
    depends_on:
      - mysql-primary
      - mysql-secondary
  proxysql:
    # image only works on x86_64 (amd64)
    image: percona/proxysql
    environment:
      - CLUSTER_NAME=mycluster
      - CLUSTER_JOIN=mysql-primary,mysql-secondary
      - MYSQL_ROOT_PASSWORD=mypass

      - MYSQL_PROXY_USER=proxyuser
      - MYSQL_PROXY_PASSWORD=s3cret
  mysql-primary:
    # image only works on x86_64 (amd64)
    image: percona/percona-xtradb-cluster:5.7
    environment:
      - CLUSTER_NAME=mycluster
      - MYSQL_ROOT_PASSWORD=mypass
      - MYSQL_DATABASE=ghost
      - MYSQL_PROXY_USER=proxyuser
      - MYSQL_PROXY_PASSWORD=s3cret
  mysql-secondary:
    # image only works on x86_64 (amd64)
    image: percona/percona-xtradb-cluster:5.7
    environment:
      - CLUSTER_NAME=mycluster
      - MYSQL_ROOT_PASSWORD=mypass

      - CLUSTER_JOIN=mysql-primary
      - MYSQL_PROXY_USER=proxyuser
      - MYSQL_PROXY_PASSWORD=s3cret
    depends_on:
      - mysql-primary

docker compose cli

* most common use
- docker-compose up # setup volumes/networks and start all containers
- docker-compose donw # stop all containers and remove container/volume/network
  * example 
  version: '3'

  services:
    proxy:
      image: nginx:1.13 # this will use the latest version of 1.13.x
      ports:
        - '80:80' # expose 80 on host and sent to 80 in container
      volumes:
        - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro #ro is readonly
    web:
      image: httpd  # this will use httpd:latest
  -----
  here is example