Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Docker-Compose workshop

Khánh Trần
January 12, 2017
210

Docker-Compose workshop

Khánh Trần

January 12, 2017
Tweet

Transcript

  1. Who am i » Technology Evangelist @ GEEK Up »

    I'm a Hobbit, and my hobbies: » Docker & Microservice » Nightwish music Twitter: @khanhtran [email protected]
  2. Agenda » Why Docker? » Why Docker-Compose? » How to

    setup a PhalconPHP project with docker- compose » 10 take-away tips
  3. Legacy ways to provide dev environment » README.txt » Virtual

    box, VMware » Vagrant (https://www.vagrantup.com)
  4. $ docker pull mysql:5.7 $ docker run mysql:5.7 --name db

    -v $(pwd)/stacks/mysql/.db:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSSWORD=123Abc $ docker build -t web . $ docker run web --link db:db -p 8080:80 ...
  5. Multi-container apps are a hassle $ docker pull ... $

    docker pull ... $ docker pull ... $ docker pull ... $ docker build ... $ docker build ... $ docker build ... $ docker build ... $ docker run ... $ docker run ... $ docker run ... $ docker run ...
  6. docker-compose.yml version "2" services: nginx: image: nginx links: - web:web

    ports: - 80:80 web: build: src links: - db:db db: image: mysql:5.7 cache: image: redis:latest
  7. Docker-Compose commands # run all containers in background $ docker-compose

    -f docker-compose.yml up -d # stop all containers $ docker-compose down # scale web to 3 containers $ docker-compose scale web=3 # show logs $ docker-compose logs -f
  8. Tip #1: How to use volumes to store container's data

    services: web: volumes: - ./stacks/web/uploads:/uploads - ./stacks/web/cache:/cache db: volumes: - ./stacks/mysql/.db:/var/lib/mysql
  9. Tip #2: Simplify application's configuration by using links # before

    'db' => [ 'host' => get_env('DB_HOST') ] services: web: links: - db:db - cache:cache db: image: mysql:5.7 cache: image: redis # after 'db' => [ 'host' => 'db' ]
  10. Tip #3: Running development tasks with Use one-off containers #

    Run PHP Composer $ docker run --rm composer/composer -v $(pwd):/app composer install # Migrate database $ docker-compose run devtools migrations:migrate -n # Run Bower $ docker run -v $(pwd)/src/web:/data ngtrieuvi92/nodejs-devtools bower install --allow-root
  11. Tip #4: Simplify docker-compose commands by using Makefile # Makefile

    VERSION = 1.0 .PHONY: start dev_up composer-install bower dbmigrate start: composer-install bower dbmigrate dev_up: docker-compose up -d --remove-orphans ps: docker-compose ps dbmigrate: docker-compose run devtools migrations:migrate -n $ make dev_up $ make ps $ make dbmigrate
  12. Tip #5: Mitigate remmebering to many ports by using typicode/Hotel

    # add domain www.topdev.dev $ hotel add http://localhost:10000 --name www.topdev # add domain www.topdev.dev $ hotel add http://localhost:10001 --name adminer.topdev $ open adminer.topdev.dev $ open www.topdev.dev
  13. Tip #6: Experimental web scaling in development env. $ docker-compose

    scale www=3 upstream topdev_www { server topdev_www_1:8080 max_fails=1 fail_timeout=10s; server topdev_www_2:8080 max_fails=1 fail_timeout=10s; server topdev_www_3:8080 max_fails=1 fail_timeout=10s; } server { listen 80; server_name www.topdev.dev; location / { proxy_pass http://topdev_www; proxy_http_version 1.1; proxy_set_header HTTP_CLIENT_IP $remote_addr; proxy_set_header HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_ignore_headers Set-Cookie; proxy_ignore_headers Cache-Control Expires; proxy_cache_bypass $http_secret_header; } }
  14. Tip #7: Mount your docker.sock Nginx-Proxy generates reverse proxy configs

    for nginx and reloads nginx when containers are started and stopped. version: '2' services: nginx-proxy: image: jwilder/nginx-proxy container_name: nginx-proxy ports: - "80:80" volumes: - /var/run/docker.sock:/tmp/docker.sock:ro whoami: image: jwilder/whoami container_name: whoami environment: - VIRTUAL_HOST=whoami.local $ docker-compose up $ curl -H "Host: whoami.local" localhost I'm 5b129ab83266
  15. Tip #8: How to config different environment » Define per

    docker-compose file per environment as below: » docker-compose-dev.yml » docker-compose-test.yml » docker-compose-staging.yml » docker-compose-production.yml # Use symbol link files to define different environments $ ln -s docker-compose-dev.yml docker-compose.yml $ make dev_up
  16. Tip #9: Avoid breaking change by using tagging image services:

    db: image: mysql:5.7 search: image: elasticsearch:2.4
  17. Tip #10: Improve DevOps skill by learning from master »

    Let search on Docker Hub for a good docker image » Go to there Github repository and learn: » their Dockerfile » their Nginx.conf » their my.cnf » etc... » Examle: APSL/thumbor
  18. Bonus: How to run two duplicated docker- compose in same

    machine Use project alias as prefix of service's name
  19. Q&A