34
Vagrant or Docker for Java dev environment? Engineering Communities 22 October 2015 Orest Ivasiv Software engineer, Softserve Docker hobbyist

Vagrant or docker for java dev environment

Embed Size (px)

Citation preview

Page 1: Vagrant or docker for java dev environment

Vagrant or Docker for Java devenvironment?Engineering Communities

22 October 2015

Orest IvasivSoftware engineer, SoftserveDocker hobbyist

Page 2: Vagrant or docker for java dev environment

Disclaimer

Assume You know smth about Docker This is not a Docker's promo

Page 3: Vagrant or docker for java dev environment

Outline

1. Container's usage concept 2. Thoughts 3. Case study 4. Experience sharing

Page 4: Vagrant or docker for java dev environment

"It works in my development environment"

Page 5: Vagrant or docker for java dev environment

Containers in our Life

Page 6: Vagrant or docker for java dev environment

Containers in our Life - Evolution

Page 7: Vagrant or docker for java dev environment

Containers in our Life - Evolution Cont.

Page 8: Vagrant or docker for java dev environment

Thoughts About Container benefits

Different programming Languages: Java, Ruby, Python, JS/Node.js, Erlang, etc...

Different ecosystems: JVM, JS, Ruby

Application packaging

Different Deployment Models

Run-time environment collision

Page 9: Vagrant or docker for java dev environment

Container Benefits

Unified form factor: - Different internals - Same application run approaches

Page 10: Vagrant or docker for java dev environment

Docker?

"Docker is a tool for building and deploying applications by packaging them intolightweight containers."

Page 11: Vagrant or docker for java dev environment

Pipeline - Traditional

Page 12: Vagrant or docker for java dev environment

Pipeline - Docker

Page 13: Vagrant or docker for java dev environment

Terms

Container How you run your application

Images How you store your application

Docker file

FROM debian:stableRUN apt-get update && apt-get install -y --force-yes apache2EXPOSE 80 443VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

Page 14: Vagrant or docker for java dev environment

Most Popular Docker commands

docker run

docker stop

docker start

docker restart

docker logs

docker exec

docker rm

docker rmi

docker ps

docker images

Page 15: Vagrant or docker for java dev environment

Docker tips

Use Docker compose

It's impossible to use many container w/o automation tool like Compose

Use Docker for dev and ops

Reuse public images

Avoid manual/custom installation of popular software: db, queue, caches, etc

Docker is convenience app distribution model

Page 16: Vagrant or docker for java dev environment

Docker Logs

Log Viewer

Aggregated Log Viewer

Page 17: Vagrant or docker for java dev environment

Docker tips - Image hierarchy

Page 18: Vagrant or docker for java dev environment

Maven + Docker

alexec/docker-maven-plugin (https://github.com/alexec/docker-maven-plugin)

rhuss/docker-maven-plugin (https://github.com/rhuss/docker-maven-plugin)

spotify/docker-maven-plugin (https://github.com/spotify/docker-maven-plugin)

Page 19: Vagrant or docker for java dev environment

Gradle + Docker

gesellix/gradle-docker-plugin (https://github.com/gesellix/gradle-docker-plugin)

bmuschko/gradle-docker-plugin (https://github.com/bmuschko/gradle-docker-plugin)

Page 20: Vagrant or docker for java dev environment

Case Study

Tech stack: Spring MVC, Spring Boot, JS/Angular.js, RoR

3d party : Consul, HAPpoxy, Postgres, Elasticsearch, Redis, Nginx, RabbitMQ

Page 21: Vagrant or docker for java dev environment

Spring Boot -> Docker

Install Java

Install app JAR file

Configure Image to run Java on start

Add external configuration

Page 22: Vagrant or docker for java dev environment

Build Image

FROM java:8VOLUME /tmpADD gs-spring-boot-docker-0.1.0.jar app.jarRUN bash -c 'touch /app.jar'ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

Page 23: Vagrant or docker for java dev environment

Run App

docker run -d --name myservices -p 4780:4780 --restart always -v /var/log/my-services:/var/log/SRV \ -e CONF_LOCATION=s3://my-storage/test.properties \-e SERVICE_HOST_NAME=̀hostname --ip̀ docker.mycorp.net/myservices:develop

Page 24: Vagrant or docker for java dev environment

Update staging env

Compare running container with what's been built by CI

Pulls latest images from Docker registry

Stops old version

Launches new version

Register service in Consul

Page 25: Vagrant or docker for java dev environment

Development Env issues

Developing 2 applications

Requires 9+ apps for properly functional integrated env

Windows Machines :-(

"Golden"/Base VM is hard to maintain

Page 26: Vagrant or docker for java dev environment

Vagrant ?

"Vagrant is not for managing machines, Vagrant is for managing developmentenvironments. The fact Vagrant spins up machines is mostly historic."

Mitchell Hashimoto

Page 27: Vagrant or docker for java dev environment

Vagrant features

docker provisioning

docker provider

Page 28: Vagrant or docker for java dev environment

Vagrant popular commands

vagrant up

vagrant provision

Vagrant docker provisioner works not as expected.

Page 29: Vagrant or docker for java dev environment

Vagrantfile

VAGRANTFILE_API_VERSION = "2"Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.hostname = "docker-host"

# Spin up a "host box" for use with the Docker provider # and then provision it with Docker config.vm.box = "slowe/ubuntu-trusty-x64" config.vm.provision "docker"

# Disable synced folders (prevents an NFS error on "vagrant up") config.vm.synced_folder ".", "/vagrant", disabled: trueend

Page 30: Vagrant or docker for java dev environment

Container setting YAML

---- name: nginx-01 image: nginx ports: ['80:80', '443:443']- name: redis-01 image: redis ports: ['6379:6379']

Page 31: Vagrant or docker for java dev environment

Iterate container setting

# Iterate through the entries in the YAML filecontainers.each do |container|config.vm.define container["name"] do |cntnr|

# Disable synced folders for the Docker container # (prevents an NFS error on "vagrant up") cntnr.vm.synced_folder ".", "/vagrant", disabled: true

# Configure the Docker provider for Vagrant cntnr.vm.provider "docker" do |docker|

# Specify the Docker image to use, pull value from YAML file docker.image = container["image"]

# Specify port mappings, pull value from YAML file # If omitted, no ports are mapped! docker.ports = container["ports"]

# Specify a friendly name for the Docker container, pull from YAML file docker.name = container["name"] endend

Page 32: Vagrant or docker for java dev environment

History Notes

Vagrant

Initial release - March 8, 2010

Current Version - July 17, 2015 - v.1.7.4

Docker

Initial release - March 2013

Current Version - October 12, 2015 - v.1.8.3

Page 33: Vagrant or docker for java dev environment

References

SO: Should I use Vagrant or Docker.io for creating an isolated environment?(http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-io-for-creating-an-isolated-environment)

Running Multiple Docker Containers in Vagrant with YAML (https://github.com/lowescott/learning-

tools/tree/master/vagrant-docker-yaml)

Page 34: Vagrant or docker for java dev environment

Thank you

22 October 2015Tags: docker, vagrant (#ZgotmplZ)

Orest IvasivSoftware engineer, SoftserveDocker hobbyisthttp://halyph.com (http://halyph.com)

@halyph (http://twitter.com/halyph)