SlideShare a Scribd company logo
1 of 39
Download to read offline
Docker & Ansible
DevOps best friends
Denis Nelubin
7bits
Docker
● Blue whale
● Good UI over (not only) Linux containers
○ And infrastructure
● Vanguard of containerization
● Container != Virtual Machine
Containers & Images
● Pull image
● Run image as container
● Save changes as image
● Run image as container
● …
● Push image
Image Layers
● Copy-on-Write
● Diffs on filesystem
Dockerfile
● Image build automation
FROM java:7-jre
MAINTAINER Denis Nelubin <denis.nelubin@7bits.it >
RUN apt-get update 
&& DEBIAN_FRONTEND=noninteractive apt-get install -y 
curl 
postfix 
rsyslog 
&& rm -rf /var/lib/apt/lists/*
EXPOSE 25
RUN curl -L https://github.com/kelseyhightower/confd/releases/download/v0.11.0/confd-0.11.0-linux-amd64 -o
/usr/local/bin/confd 
&& chmod 755 /usr/local/bin/confd
COPY etc/ /etc/
WORKDIR /opt/coolapp
COPY ./docker/docker-entrypoint.sh /
CMD ["/bin/bash", "-e", "/docker-entrypoint.sh"]
Ports & Networks
● Network between containers
● Exposed ports
Volumes
● Access to host filesystem
● Put something changeable
to container
● Extract something persistent
from container
Docker Compose
● Bring multiple containers together
version: '2'
services:
app:
image: openjdk:8-jre-alpine
volumes:
- ./coolapp/build/libs/coolapp-0.0.1-SNAPSHOT.jar:/app.jar
command: java -jar /app.jar --spring.profiles.active=docker --server.port=8080
ports:
- "8088:8080"
environment:
DATABASE_URL: jdbc:postgresql://db:5432/postgres
DATABASE_USERNAME: postgres
DATABASE_PASSWORD:
links:
- db
depends_on:
- db
Example
Database
db:
image: postgres:9.5 # https://hub.docker.com/_/postgres/
environment:
TZ: "US/Central"
volumes:
- ./postgres:/docker-entrypoint-initdb.d:ro
ports:
- "54320:5432"
Application
app:
image: openjdk:8-jre-alpine # https://hub.docker.com/_/openjdk/
volumes:
- ./app/build/libs/app-0.0.1-SNAPSHOT.jar:/app.jar
command: java -jar /app.jar --server.port=9001
ports:
- "9001:9001"
environment:
DATABASE_URL: jdbc:postgresql://db:5432/postgres
DATABASE_USERNAME: postgres
DATABASE_PASSWORD:
TZ: "US/Central"
links:
- db
depends_on:
- db
Proxy
proxy:
image: nginx:stable-alpine # https://hub.docker.com/_/nginx/
environment:
TZ: "US/Central"
volumes:
- ./frontend/static:/usr/share/nginx/html:ro
- ./proxy/etc/nginx.conf:/etc/nginx/nginx.conf:ro
links:
- app
Alpine Linux
https://alpinelinux.org/
● Lightweight Linux distribution
Docker Images:
● Alpine-based
● Debian-based
● Ubuntu-based
Development vs Production
● Standard images
● Code as volumes
● Data in containers (temporary)
● Configuration with environment
● Docker network — OK
● All (debug) ports are exposed
● Non-privileged ports are exposed
● Custom images (Dockerfiles)
● Code "baked" to image
● Data in volumes (persistent)
● Configuration with environment
● Docker network? Swarm?
Kubernetes? Expose ports?
● Public ports are exposed
● Privileged ports are exposed
Environment
System.getenv("DATABASE_URL");
spring:
datasource:
main_db:
type: com.zaxxer.hikari.HikariDataSource
jdbc-url: ${DATABASE_URL}
username: ${DATABASE_USERNAME}
password: ${DATABASE_PASSWORD}
Confd
Confd
Template
relayhost = {{ getenv "RELAY" }}
Generate configs
/usr/local/bin/confd -onetime -backend env
ORLY?
Docker in Production: A History of Failure
https://thehftguy.com/2016/11/01/docker-in-production-an-history-of-failure/
● Breaking changes and regressions
● Kernel support (or lack thereof)
○ The AUFS driver is unstable
○ The AUFS filesystem was finally dropped in kernel version 4
○ OverlayFS development was abandoned within 1 year of its initial release
○ Then comes Overlay2
● Docker Registry can’t clean images
● Docker MUST NOT run any databases in production, EVER
Ansible
● Strange A
● Good remote execution tool
○ Requires only SSH and Python 2
● Has tons of modules
○ Try to avoid to write a custom module (v<2)
● Pretty configurable
○ YAML
● Remote Execution != Configuration Management
Inventory
● Hosts
● Groups
● Host Variables
[coolapp_servers]
192.168.238.42 dns_name=cool.example.com
Playbook
● What to do with the specified hosts
● Apply roles!
- name: Init My Cool App
hosts: coolapp_servers
remote_user: root
roles:
- common
- postgres
- coolapp-postgres
- java
- nginx
- coolapp-nginx
Roles
● Tasks
● Role Variables
● Files
● Templates
● Handlers
● Can be taken from Ansible Galaxy
○ https://galaxy.ansible.com/
Tasks
● One action
● Parameters
● Verification before apply
○ Idempotence
● Standard/Built-in/Out-of-the-box
Handlers
● Conditional actions
● Applied after all tasks executed
● Use them to restart a service when the config was changed
Ansible
Variables
● Host Variables
● Group Variables
● Playbook Variables
● Role Variables
● Role Defaults
● ...
Database
# https://www.postgresql.org/download/linux/debian/
- name: install apt key
apt_key: url=https://www.postgresql.org/media/keys/ACCC4CF8.asc state=present
- name: add apt repository
apt_repository: repo='deb http://apt.postgresql.org/pub/repos/apt/
jessie-pgdg main' state=present filename='pgdg'
- name: install postgres
apt: name='postgresql-{{ postgres_version }}'
- name: install postgres contrib
apt: name='postgresql-contrib-{{ postgres_version }}'
- name: start postgres
service: name=postgresql state=started
Database for app
- name: create postgres user
postgresql_user: name='{{ coolapp_db_user }}' password='{{ coolapp_db_password }}'
become: true
become_user: postgres
- name: create postgres database
postgresql_db: name='{{ coolapp_db_name }}' owner='{{ coolapp_db_user }}'
become: true
become_user: postgres
- name: add postgres ltree extension
postgresql_ext: name=ltree db='{{ coolapp_db_name }}'
become: true
become_user: postgres
Java
- name: add backports repository
apt_repository:
repo: 'deb {{ java_debian_mirror }} jessie-backports main'
state: present
filename: 'jessie-backports'
- name: install java
apt:
name:
- '{{ java_package }}'
- 'ca-certificates-java'
default_release: 'jessie-backports'
Application
- name: add user
user: name='{{ coolapp_user }}' system=yes
- name: create base dir
file: path='{{ coolapp_basedir }}' owner='{{ coolapp_user }}' state=directory
- name: copy jar file
copy: src='{{ item }}' dest='{{ coolapp_basedir }}/app.jar' owner='{{ collapp_user }}'
with_fileglob:
- ../../../coolapp/build/libs/coolapp-*.jar
notify: restart service
- name: create service config
template: src=service dest='/etc/systemd/system/{{ coolapp_service_name }}.service'
notify: reload systemd
- name: enable service
service: name='{{ coolapp_service_name }}' enabled=yes
- name: start service
service: name='{{ coolapp_service_name }}' state=started
Systemd Unit
[Unit]
Description={{ coolapp_service_description }}
[Service]
Type=simple
WorkingDirectory={{ coolapp_basedir }}
ExecStart={{ collapp_java }} -jar app.jar --server.port={{ coolapp_port }}
User={{ coolapp_user }}
Environment=DATABASE_URL=jdbc:postgresql://{{ coolapp_db_host }}:5432/{{ coolapp_db_name }}
Environment=DATABASE_USERNAME={{ coolapp_db_user }}
Environment=DATABASE_PASSWORD={{ coolapp_db_password }}
[Install]
WantedBy=multi-user.target
Nginx
- name: add backports repository
apt_repository: repo='deb {{ nginx_debian_mirror }} jessie-backports main' state=present filename='jessie-backports'
when: ansible_os_family == 'Debian'
- name: install nginx
apt: name=nginx default_release=jessie-backports state=latest
when: ansible_os_family == 'Debian'
- name: install nginx
yum: name=nginx state=latest
when: ansible_os_family == 'RedHat'
- name: enable nginx
service: name=nginx enabled=yes
- name: start nginx
service: name=nginx state=started
Nginx for app
- name: generate DH params
command: openssl dhparam -out /etc/nginx/dhparams.pem 2048
args:
creates: /etc/nginx/dhparams.pem
- name: copy nginx configuration
template: src=config dest=/etc/nginx/sites-available/{{ coolapp_site_config }}
notify: restart nginx
- name: enable nginx configuration
file: src=/etc/nginx/sites-available/{{ coolapp_site_config }} dest=/etc/nginx/sites-enabled/{{ coolapp_site_config }} state=link
notify: restart nginx
- name: validate nginx configuration
command: /usr/sbin/nginx -t
changed_when: false
Let's Encrypt
# https://github.com/thefinn93/ansible-letsencrypt
- role: letsencrypt
letsencrypt_webroot_path: /var/www/html
letsencrypt_email: webmaster@coolapp.example.com
letsencrypt_cert_domains:
- '{{ dns_name }}'
letsencrypt_renewal_command_args: '--renew-hook "systemctl restart nginx"'
Docker → Ansible
● Docker Service → Ansible Roles
○ Role for base image
■ Take care on versions
○ Role for this project modifications
● Configuration by Environment
○ Systemd Units
● Template config files
● Take care on network
○ Open ports in firewall
○ Define addresses of depending services
Ansible Notes
● Variables hell
● Don't use nested variables coolapp.basedir
○ Hard to override
● Roles are fragile
○ Be ready to fix them on next deploy
○ Ansible Galaxy is mostly useless
● Can you trust 3rd party roles?
○ Read them carefully
○ Do it yourself
● Never change anything on servers manually
○ Modify roles and apply them
● Ansible Roles and Playbooks — the best deployment documentation
Docker vs Ansible
● Run everything
on developer's machine
● Official images from Hub
● Environment variables
(via Docker Compose)
● Config file templates
(via Confd)
● docker-compose.yml, Dockerfile
● Run everything
on production
● Official packages from repos
● Environment variables
(via Systemd Units)
● Config file templates
(via built-in Ansible templates)
● Roles and everything
Anyway you may need Ansible to install Docker/Swarm/Kubernetes ;)
Girls vs DevOps
https://www.slideshare.net/lilobase/devops-a-brief-introduction-to-vagrant-ansible

More Related Content

What's hot

Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with DockerGeeta Vinnakota
 
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Running High Performance and Fault Tolerant Elasticsearch Clusters on DockerRunning High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Running High Performance and Fault Tolerant Elasticsearch Clusters on DockerSematext Group, Inc.
 
Amazon EC2 Container Service in Action
Amazon EC2 Container Service in ActionAmazon EC2 Container Service in Action
Amazon EC2 Container Service in ActionRemotty
 
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
파이썬 개발환경 구성하기의 끝판왕 - Docker Composeraccoony
 
Docker orchestration v4
Docker orchestration v4Docker orchestration v4
Docker orchestration v4Hojin Kim
 
Introction to docker swarm
Introction to docker swarmIntroction to docker swarm
Introction to docker swarmHsi-Kai Wang
 
Docker Swarm for Beginner
Docker Swarm for BeginnerDocker Swarm for Beginner
Docker Swarm for BeginnerShahzad Masud
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeAjeet Singh Raina
 
[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network TroubleshootingOpen Source Consulting
 
Docker 1.11 @ Docker SF Meetup
Docker 1.11 @ Docker SF MeetupDocker 1.11 @ Docker SF Meetup
Docker 1.11 @ Docker SF MeetupDocker, Inc.
 
Docker Security in Production Overview
Docker Security in Production OverviewDocker Security in Production Overview
Docker Security in Production OverviewDelve Labs
 
Introduction to docker swarm
Introduction to docker swarmIntroduction to docker swarm
Introduction to docker swarmWalid Ashraf
 
The age of orchestration: from Docker basics to cluster management
The age of orchestration: from Docker basics to cluster managementThe age of orchestration: from Docker basics to cluster management
The age of orchestration: from Docker basics to cluster managementNicola Paolucci
 
Ansible not only for Dummies
Ansible not only for DummiesAnsible not only for Dummies
Ansible not only for DummiesŁukasz Proszek
 
Wordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionWordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionSysdig
 
Small, Simple, and Secure: Alpine Linux under the Microscope
Small, Simple, and Secure: Alpine Linux under the MicroscopeSmall, Simple, and Secure: Alpine Linux under the Microscope
Small, Simple, and Secure: Alpine Linux under the MicroscopeDocker, Inc.
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsBen Hall
 
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) Italy
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) ItalyClustering with Docker Swarm - Dockerops 2016 @ Cento (FE) Italy
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) ItalyGiovanni Toraldo
 

What's hot (20)

Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with Docker
 
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Running High Performance and Fault Tolerant Elasticsearch Clusters on DockerRunning High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
 
Amazon EC2 Container Service in Action
Amazon EC2 Container Service in ActionAmazon EC2 Container Service in Action
Amazon EC2 Container Service in Action
 
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
 
Docker orchestration v4
Docker orchestration v4Docker orchestration v4
Docker orchestration v4
 
Introction to docker swarm
Introction to docker swarmIntroction to docker swarm
Introction to docker swarm
 
Docker Swarm for Beginner
Docker Swarm for BeginnerDocker Swarm for Beginner
Docker Swarm for Beginner
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm Mode
 
[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting[오픈소스컨설팅] Linux Network Troubleshooting
[오픈소스컨설팅] Linux Network Troubleshooting
 
Docker 1.11 @ Docker SF Meetup
Docker 1.11 @ Docker SF MeetupDocker 1.11 @ Docker SF Meetup
Docker 1.11 @ Docker SF Meetup
 
Docker Security in Production Overview
Docker Security in Production OverviewDocker Security in Production Overview
Docker Security in Production Overview
 
Introduction to docker swarm
Introduction to docker swarmIntroduction to docker swarm
Introduction to docker swarm
 
The age of orchestration: from Docker basics to cluster management
The age of orchestration: from Docker basics to cluster managementThe age of orchestration: from Docker basics to cluster management
The age of orchestration: from Docker basics to cluster management
 
Docker / Ansible
Docker / AnsibleDocker / Ansible
Docker / Ansible
 
Ansible not only for Dummies
Ansible not only for DummiesAnsible not only for Dummies
Ansible not only for Dummies
 
Wordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccionWordpress y Docker, de desarrollo a produccion
Wordpress y Docker, de desarrollo a produccion
 
Small, Simple, and Secure: Alpine Linux under the Microscope
Small, Simple, and Secure: Alpine Linux under the MicroscopeSmall, Simple, and Secure: Alpine Linux under the Microscope
Small, Simple, and Secure: Alpine Linux under the Microscope
 
Real World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js ApplicationsReal World Lessons on the Pain Points of Node.js Applications
Real World Lessons on the Pain Points of Node.js Applications
 
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) Italy
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) ItalyClustering with Docker Swarm - Dockerops 2016 @ Cento (FE) Italy
Clustering with Docker Swarm - Dockerops 2016 @ Cento (FE) Italy
 
Docker n co
Docker n coDocker n co
Docker n co
 

Viewers also liked

Viewers also liked (15)

2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
2017-03-11 01 Игорь Родионов. Docker swarm vs Kubernetes
 
Automation with Ansible and Containers
Automation with Ansible and ContainersAutomation with Ansible and Containers
Automation with Ansible and Containers
 
Testing Ansible with Jenkins and Docker
Testing Ansible with Jenkins and DockerTesting Ansible with Jenkins and Docker
Testing Ansible with Jenkins and Docker
 
One Bounce, Two Bounce
One Bounce, Two BounceOne Bounce, Two Bounce
One Bounce, Two Bounce
 
Freelancer
FreelancerFreelancer
Freelancer
 
e-Promotion: A Revolution In Technical Education Evolution
e-Promotion: A Revolution In Technical Education Evolutione-Promotion: A Revolution In Technical Education Evolution
e-Promotion: A Revolution In Technical Education Evolution
 
Εισαγωγή στο Alice 3
Εισαγωγή στο Alice 3Εισαγωγή στο Alice 3
Εισαγωγή στο Alice 3
 
Ansible Automation to Rule Them All
Ansible Automation to Rule Them AllAnsible Automation to Rule Them All
Ansible Automation to Rule Them All
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
Network Automation: Ansible 102
Network Automation: Ansible 102Network Automation: Ansible 102
Network Automation: Ansible 102
 
Diario Resumen 20170310
Diario Resumen 20170310Diario Resumen 20170310
Diario Resumen 20170310
 
Tabela 2017 Q1
Tabela 2017 Q1Tabela 2017 Q1
Tabela 2017 Q1
 
Internship report
Internship reportInternship report
Internship report
 
Dizziness
Dizziness Dizziness
Dizziness
 
05 dentoalveolar injuries
05 dentoalveolar injuries05 dentoalveolar injuries
05 dentoalveolar injuries
 

Similar to 2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps

[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis OverviewLeo Lorieri
 
Infrastructure = code - 1 year later
Infrastructure = code - 1 year laterInfrastructure = code - 1 year later
Infrastructure = code - 1 year laterChristian Ortner
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient wayCapistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient waySylvain Rayé
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppSmartLogic
 
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...Puppet
 
Challenges of container configuration
Challenges of container configurationChallenges of container configuration
Challenges of container configurationlutter
 
Hands on Docker - Launch your own LEMP or LAMP stack
Hands on Docker -  Launch your own LEMP or LAMP stackHands on Docker -  Launch your own LEMP or LAMP stack
Hands on Docker - Launch your own LEMP or LAMP stackDana Luther
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slidesharetomcopeland
 
Drupal cambs ansible for drupal april 2015
Drupal cambs ansible for drupal april 2015Drupal cambs ansible for drupal april 2015
Drupal cambs ansible for drupal april 2015Ryan Brown
 
Hands-On Session Docker
Hands-On Session DockerHands-On Session Docker
Hands-On Session DockerLinetsChile
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleStein Inge Morisbak
 
Software Packaging for Cross OS Distribution
Software Packaging for Cross OS DistributionSoftware Packaging for Cross OS Distribution
Software Packaging for Cross OS DistributionJian-Hong Pan
 
Automating complex infrastructures with Puppet
Automating complex infrastructures with PuppetAutomating complex infrastructures with Puppet
Automating complex infrastructures with PuppetKris Buytaert
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Cosimo Streppone
 
Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)Ben Hall
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slidesDocker, Inc.
 
#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to Ansible#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to AnsibleCédric Delgehier
 
9 steps to install and configure postgre sql from source on linux
9 steps to install and configure postgre sql from source on linux9 steps to install and configure postgre sql from source on linux
9 steps to install and configure postgre sql from source on linuxchinkshady
 

Similar to 2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps (20)

[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
[EXTENDED] Ceph, Docker, Heroku Slugs, CoreOS and Deis Overview
 
Infrastructure = code - 1 year later
Infrastructure = code - 1 year laterInfrastructure = code - 1 year later
Infrastructure = code - 1 year later
 
Capistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient wayCapistrano deploy Magento project in an efficient way
Capistrano deploy Magento project in an efficient way
 
Practical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails AppPractical Chef and Capistrano for Your Rails App
Practical Chef and Capistrano for Your Rails App
 
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
 
Challenges of container configuration
Challenges of container configurationChallenges of container configuration
Challenges of container configuration
 
Docker, c'est bonheur !
Docker, c'est bonheur !Docker, c'est bonheur !
Docker, c'est bonheur !
 
Hands on Docker - Launch your own LEMP or LAMP stack
Hands on Docker -  Launch your own LEMP or LAMP stackHands on Docker -  Launch your own LEMP or LAMP stack
Hands on Docker - Launch your own LEMP or LAMP stack
 
Railsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshareRailsconf2011 deployment tips_for_slideshare
Railsconf2011 deployment tips_for_slideshare
 
Drupal cambs ansible for drupal april 2015
Drupal cambs ansible for drupal april 2015Drupal cambs ansible for drupal april 2015
Drupal cambs ansible for drupal april 2015
 
Hands-On Session Docker
Hands-On Session DockerHands-On Session Docker
Hands-On Session Docker
 
Zero Downtime Deployment with Ansible
Zero Downtime Deployment with AnsibleZero Downtime Deployment with Ansible
Zero Downtime Deployment with Ansible
 
Software Packaging for Cross OS Distribution
Software Packaging for Cross OS DistributionSoftware Packaging for Cross OS Distribution
Software Packaging for Cross OS Distribution
 
Automating complex infrastructures with Puppet
Automating complex infrastructures with PuppetAutomating complex infrastructures with Puppet
Automating complex infrastructures with Puppet
 
Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013Puppet at Opera Sofware - PuppetCamp Oslo 2013
Puppet at Opera Sofware - PuppetCamp Oslo 2013
 
Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)Running Docker in Development & Production (#ndcoslo 2015)
Running Docker in Development & Production (#ndcoslo 2015)
 
infra-as-code
infra-as-codeinfra-as-code
infra-as-code
 
Docker Security workshop slides
Docker Security workshop slidesDocker Security workshop slides
Docker Security workshop slides
 
#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to Ansible#OktoCampus - Workshop : An introduction to Ansible
#OktoCampus - Workshop : An introduction to Ansible
 
9 steps to install and configure postgre sql from source on linux
9 steps to install and configure postgre sql from source on linux9 steps to install and configure postgre sql from source on linux
9 steps to install and configure postgre sql from source on linux
 

More from Омские ИТ-субботники

2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!Омские ИТ-субботники
 
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKitОмские ИТ-субботники
 
2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?Омские ИТ-субботники
 
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальноеОмские ИТ-субботники
 
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системыОмские ИТ-субботники
 
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидацииОмские ИТ-субботники
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...Омские ИТ-субботники
 
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...Омские ИТ-субботники
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторыОмские ИТ-субботники
 
2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленкеОмские ИТ-субботники
 
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборотОмские ИТ-субботники
 
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...Омские ИТ-субботники
 
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность Омские ИТ-субботники
 
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?Омские ИТ-субботники
 
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикерОмские ИТ-субботники
 
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of ThingsОмские ИТ-субботники
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIPОмские ИТ-субботники
 
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIPОмские ИТ-субботники
 

More from Омские ИТ-субботники (20)

2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!2017-08-12 01 Алексей Коровянский. Привет, ARKit!
2017-08-12 01 Алексей Коровянский. Привет, ARKit!
 
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
2017-08-12 02 Антон Ковалев. Texture a.k.a AsyncDisplayKit
 
2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?2017-05-06 02 Илья Сиганов. Зачем учить машины?
2017-05-06 02 Илья Сиганов. Зачем учить машины?
 
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
2017 04-08 03 Максим Верзаков. Docker — жизнь, вселенная и все остальное
 
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
2017-04-08 01 Евгений Оськин. Video streaming: от идеи до нагруженной системы
 
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
2017-02-04 03 Алексей Букуров, Игорь Циглер. DSL для правил валидации
 
2017-02-04 02 Яков Лило. Решение задач
2017-02-04 02 Яков Лило. Решение задач2017-02-04 02 Яков Лило. Решение задач
2017-02-04 02 Яков Лило. Решение задач
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
 
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
2016-12-03 01 Вадим Литвинов. От 2D к 3D обзор методов реконструкции поверхно...
 
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
2016-12-03 02 Алексей Городецкий. Как пишут компиляторы
 
2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке2016-12-03 03 Евгений Тюменцев. DSL на коленке
2016-12-03 03 Евгений Тюменцев. DSL на коленке
 
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
2016-11-12 02 Николай Линкер. Чему Java может поучиться у Haskell и наоборот
 
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
2016-11-12 03 Максим Дроздов. Навести порядок быстро, или как спасти оценки н...
 
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность 2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
2016-11-12 01 Егор Непомнящих. Агрегация и осведомленность
 
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
2016-10-01 03 Андрей Аржанников. Что такое Bluetooth Low Energy?
 
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
2016-10-01 02 Евгений Комаров. Как я сделал IoT-кикер
 
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
2016-10-01 01 Звиад Кардава. Welcome to Internet of Things
 
2016-09-17 03 Василий Полозов. WebRTC
2016-09-17 03 Василий Полозов. WebRTC2016-09-17 03 Василий Полозов. WebRTC
2016-09-17 03 Василий Полозов. WebRTC
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
 
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
2016-09-17 01 Василий Полозов. Обзор понятий и технологий VoIP
 

Recently uploaded

Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingTechSoup
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformChameera Dedduwage
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docxPoojaSen20
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)eniolaolutunde
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityGeoBlogs
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxNirmalaLoungPoorunde1
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxmanuelaromero2013
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxpboyjonauth
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactdawncurless
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesFatimaKhan178732
 
Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeThiyagu K
 
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxContemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxRoyAbrique
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxSayali Powar
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application ) Sakshi Ghasle
 
Micromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersMicromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersChitralekhaTherkar
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxheathfieldcps1
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxiammrhaywood
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfchloefrazer622
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13Steve Thomason
 

Recently uploaded (20)

Grant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy ConsultingGrant Readiness 101 TechSoup and Remy Consulting
Grant Readiness 101 TechSoup and Remy Consulting
 
A Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy ReformA Critique of the Proposed National Education Policy Reform
A Critique of the Proposed National Education Policy Reform
 
mini mental status format.docx
mini    mental       status     format.docxmini    mental       status     format.docx
mini mental status format.docx
 
Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)Software Engineering Methodologies (overview)
Software Engineering Methodologies (overview)
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
Employee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptxEmployee wellbeing at the workplace.pptx
Employee wellbeing at the workplace.pptx
 
How to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptxHow to Make a Pirate ship Primary Education.pptx
How to Make a Pirate ship Primary Education.pptx
 
Introduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptxIntroduction to AI in Higher Education_draft.pptx
Introduction to AI in Higher Education_draft.pptx
 
Accessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impactAccessible design: Minimum effort, maximum impact
Accessible design: Minimum effort, maximum impact
 
Separation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and ActinidesSeparation of Lanthanides/ Lanthanides and Actinides
Separation of Lanthanides/ Lanthanides and Actinides
 
Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and Mode
 
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptxContemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
Contemporary philippine arts from the regions_PPT_Module_12 [Autosaved] (1).pptx
 
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptxPOINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
POINT- BIOCHEMISTRY SEM 2 ENZYMES UNIT 5.pptx
 
Hybridoma Technology ( Production , Purification , and Application )
Hybridoma Technology  ( Production , Purification , and Application  ) Hybridoma Technology  ( Production , Purification , and Application  )
Hybridoma Technology ( Production , Purification , and Application )
 
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Tilak Nagar Delhi reach out to us at 🔝9953056974🔝
 
Micromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of PowdersMicromeritics - Fundamental and Derived Properties of Powders
Micromeritics - Fundamental and Derived Properties of Powders
 
The basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptxThe basics of sentences session 2pptx copy.pptx
The basics of sentences session 2pptx copy.pptx
 
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptxSOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
SOCIAL AND HISTORICAL CONTEXT - LFTVD.pptx
 
Arihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdfArihant handbook biology for class 11 .pdf
Arihant handbook biology for class 11 .pdf
 
The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13The Most Excellent Way | 1 Corinthians 13
The Most Excellent Way | 1 Corinthians 13
 

2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps

  • 1. Docker & Ansible DevOps best friends Denis Nelubin 7bits
  • 2. Docker ● Blue whale ● Good UI over (not only) Linux containers ○ And infrastructure ● Vanguard of containerization ● Container != Virtual Machine
  • 3. Containers & Images ● Pull image ● Run image as container ● Save changes as image ● Run image as container ● … ● Push image
  • 5. Dockerfile ● Image build automation FROM java:7-jre MAINTAINER Denis Nelubin <denis.nelubin@7bits.it > RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y curl postfix rsyslog && rm -rf /var/lib/apt/lists/* EXPOSE 25 RUN curl -L https://github.com/kelseyhightower/confd/releases/download/v0.11.0/confd-0.11.0-linux-amd64 -o /usr/local/bin/confd && chmod 755 /usr/local/bin/confd COPY etc/ /etc/ WORKDIR /opt/coolapp COPY ./docker/docker-entrypoint.sh / CMD ["/bin/bash", "-e", "/docker-entrypoint.sh"]
  • 6. Ports & Networks ● Network between containers ● Exposed ports
  • 7. Volumes ● Access to host filesystem ● Put something changeable to container ● Extract something persistent from container
  • 8. Docker Compose ● Bring multiple containers together version: '2' services: app: image: openjdk:8-jre-alpine volumes: - ./coolapp/build/libs/coolapp-0.0.1-SNAPSHOT.jar:/app.jar command: java -jar /app.jar --spring.profiles.active=docker --server.port=8080 ports: - "8088:8080" environment: DATABASE_URL: jdbc:postgresql://db:5432/postgres DATABASE_USERNAME: postgres DATABASE_PASSWORD: links: - db depends_on: - db
  • 10. Database db: image: postgres:9.5 # https://hub.docker.com/_/postgres/ environment: TZ: "US/Central" volumes: - ./postgres:/docker-entrypoint-initdb.d:ro ports: - "54320:5432"
  • 11. Application app: image: openjdk:8-jre-alpine # https://hub.docker.com/_/openjdk/ volumes: - ./app/build/libs/app-0.0.1-SNAPSHOT.jar:/app.jar command: java -jar /app.jar --server.port=9001 ports: - "9001:9001" environment: DATABASE_URL: jdbc:postgresql://db:5432/postgres DATABASE_USERNAME: postgres DATABASE_PASSWORD: TZ: "US/Central" links: - db depends_on: - db
  • 12. Proxy proxy: image: nginx:stable-alpine # https://hub.docker.com/_/nginx/ environment: TZ: "US/Central" volumes: - ./frontend/static:/usr/share/nginx/html:ro - ./proxy/etc/nginx.conf:/etc/nginx/nginx.conf:ro links: - app
  • 13. Alpine Linux https://alpinelinux.org/ ● Lightweight Linux distribution Docker Images: ● Alpine-based ● Debian-based ● Ubuntu-based
  • 14. Development vs Production ● Standard images ● Code as volumes ● Data in containers (temporary) ● Configuration with environment ● Docker network — OK ● All (debug) ports are exposed ● Non-privileged ports are exposed ● Custom images (Dockerfiles) ● Code "baked" to image ● Data in volumes (persistent) ● Configuration with environment ● Docker network? Swarm? Kubernetes? Expose ports? ● Public ports are exposed ● Privileged ports are exposed
  • 16. Confd Template relayhost = {{ getenv "RELAY" }} Generate configs /usr/local/bin/confd -onetime -backend env
  • 17. ORLY?
  • 18. Docker in Production: A History of Failure https://thehftguy.com/2016/11/01/docker-in-production-an-history-of-failure/ ● Breaking changes and regressions ● Kernel support (or lack thereof) ○ The AUFS driver is unstable ○ The AUFS filesystem was finally dropped in kernel version 4 ○ OverlayFS development was abandoned within 1 year of its initial release ○ Then comes Overlay2 ● Docker Registry can’t clean images ● Docker MUST NOT run any databases in production, EVER
  • 19. Ansible ● Strange A ● Good remote execution tool ○ Requires only SSH and Python 2 ● Has tons of modules ○ Try to avoid to write a custom module (v<2) ● Pretty configurable ○ YAML ● Remote Execution != Configuration Management
  • 20. Inventory ● Hosts ● Groups ● Host Variables [coolapp_servers] 192.168.238.42 dns_name=cool.example.com
  • 21. Playbook ● What to do with the specified hosts ● Apply roles! - name: Init My Cool App hosts: coolapp_servers remote_user: root roles: - common - postgres - coolapp-postgres - java - nginx - coolapp-nginx
  • 22. Roles ● Tasks ● Role Variables ● Files ● Templates ● Handlers ● Can be taken from Ansible Galaxy ○ https://galaxy.ansible.com/
  • 23. Tasks ● One action ● Parameters ● Verification before apply ○ Idempotence ● Standard/Built-in/Out-of-the-box
  • 24. Handlers ● Conditional actions ● Applied after all tasks executed ● Use them to restart a service when the config was changed
  • 26. Variables ● Host Variables ● Group Variables ● Playbook Variables ● Role Variables ● Role Defaults ● ...
  • 27. Database # https://www.postgresql.org/download/linux/debian/ - name: install apt key apt_key: url=https://www.postgresql.org/media/keys/ACCC4CF8.asc state=present - name: add apt repository apt_repository: repo='deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main' state=present filename='pgdg' - name: install postgres apt: name='postgresql-{{ postgres_version }}' - name: install postgres contrib apt: name='postgresql-contrib-{{ postgres_version }}' - name: start postgres service: name=postgresql state=started
  • 28. Database for app - name: create postgres user postgresql_user: name='{{ coolapp_db_user }}' password='{{ coolapp_db_password }}' become: true become_user: postgres - name: create postgres database postgresql_db: name='{{ coolapp_db_name }}' owner='{{ coolapp_db_user }}' become: true become_user: postgres - name: add postgres ltree extension postgresql_ext: name=ltree db='{{ coolapp_db_name }}' become: true become_user: postgres
  • 29. Java - name: add backports repository apt_repository: repo: 'deb {{ java_debian_mirror }} jessie-backports main' state: present filename: 'jessie-backports' - name: install java apt: name: - '{{ java_package }}' - 'ca-certificates-java' default_release: 'jessie-backports'
  • 30. Application - name: add user user: name='{{ coolapp_user }}' system=yes - name: create base dir file: path='{{ coolapp_basedir }}' owner='{{ coolapp_user }}' state=directory - name: copy jar file copy: src='{{ item }}' dest='{{ coolapp_basedir }}/app.jar' owner='{{ collapp_user }}' with_fileglob: - ../../../coolapp/build/libs/coolapp-*.jar notify: restart service - name: create service config template: src=service dest='/etc/systemd/system/{{ coolapp_service_name }}.service' notify: reload systemd - name: enable service service: name='{{ coolapp_service_name }}' enabled=yes - name: start service service: name='{{ coolapp_service_name }}' state=started
  • 31. Systemd Unit [Unit] Description={{ coolapp_service_description }} [Service] Type=simple WorkingDirectory={{ coolapp_basedir }} ExecStart={{ collapp_java }} -jar app.jar --server.port={{ coolapp_port }} User={{ coolapp_user }} Environment=DATABASE_URL=jdbc:postgresql://{{ coolapp_db_host }}:5432/{{ coolapp_db_name }} Environment=DATABASE_USERNAME={{ coolapp_db_user }} Environment=DATABASE_PASSWORD={{ coolapp_db_password }} [Install] WantedBy=multi-user.target
  • 32. Nginx - name: add backports repository apt_repository: repo='deb {{ nginx_debian_mirror }} jessie-backports main' state=present filename='jessie-backports' when: ansible_os_family == 'Debian' - name: install nginx apt: name=nginx default_release=jessie-backports state=latest when: ansible_os_family == 'Debian' - name: install nginx yum: name=nginx state=latest when: ansible_os_family == 'RedHat' - name: enable nginx service: name=nginx enabled=yes - name: start nginx service: name=nginx state=started
  • 33. Nginx for app - name: generate DH params command: openssl dhparam -out /etc/nginx/dhparams.pem 2048 args: creates: /etc/nginx/dhparams.pem - name: copy nginx configuration template: src=config dest=/etc/nginx/sites-available/{{ coolapp_site_config }} notify: restart nginx - name: enable nginx configuration file: src=/etc/nginx/sites-available/{{ coolapp_site_config }} dest=/etc/nginx/sites-enabled/{{ coolapp_site_config }} state=link notify: restart nginx - name: validate nginx configuration command: /usr/sbin/nginx -t changed_when: false
  • 34. Let's Encrypt # https://github.com/thefinn93/ansible-letsencrypt - role: letsencrypt letsencrypt_webroot_path: /var/www/html letsencrypt_email: webmaster@coolapp.example.com letsencrypt_cert_domains: - '{{ dns_name }}' letsencrypt_renewal_command_args: '--renew-hook "systemctl restart nginx"'
  • 35. Docker → Ansible ● Docker Service → Ansible Roles ○ Role for base image ■ Take care on versions ○ Role for this project modifications ● Configuration by Environment ○ Systemd Units ● Template config files ● Take care on network ○ Open ports in firewall ○ Define addresses of depending services
  • 36. Ansible Notes ● Variables hell ● Don't use nested variables coolapp.basedir ○ Hard to override ● Roles are fragile ○ Be ready to fix them on next deploy ○ Ansible Galaxy is mostly useless ● Can you trust 3rd party roles? ○ Read them carefully ○ Do it yourself ● Never change anything on servers manually ○ Modify roles and apply them ● Ansible Roles and Playbooks — the best deployment documentation
  • 37. Docker vs Ansible ● Run everything on developer's machine ● Official images from Hub ● Environment variables (via Docker Compose) ● Config file templates (via Confd) ● docker-compose.yml, Dockerfile ● Run everything on production ● Official packages from repos ● Environment variables (via Systemd Units) ● Config file templates (via built-in Ansible templates) ● Roles and everything Anyway you may need Ansible to install Docker/Swarm/Kubernetes ;)