dockerized java - jeeconf 2017

100
01

Upload: andrey-adamovich

Post on 21-Jan-2018

566 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Dockerized Java - JEEConf 2017

01

Page 2: Dockerized Java - JEEConf 2017

02

Page 3: Dockerized Java - JEEConf 2017

Let's start!03

Page 4: Dockerized Java - JEEConf 2017

Getting Java04

Page 5: Dockerized Java - JEEConf 2017

Question

05

Page 6: Dockerized Java - JEEConf 2017

No!06

Page 7: Dockerized Java - JEEConf 2017

Because... license!

07

Page 8: Dockerized Java - JEEConf 2017

Licensing

08

Page 9: Dockerized Java - JEEConf 2017

Official Java image?

09

Page 10: Dockerized Java - JEEConf 2017

10

Page 11: Dockerized Java - JEEConf 2017

Getting Java> docker run ‐‐rm ‐it java java ‐version

openjdk version "1.8.0_111"

OpenJDK Runtime Environment (build 1.8.0_111...)

OpenJDK 64‐Bit Server VM (build 25.111‐b14, mixed mode)

01.

02.

03.

04.

11

Page 12: Dockerized Java - JEEConf 2017

Deprecated

12

Page 13: Dockerized Java - JEEConf 2017

Latest OpenJDK> docker run ‐‐rm ‐it openjdk java ‐version

openjdk version "1.8.0_131"

OpenJDK Runtime Environment (build 1.8.0_131‐8u131...)

OpenJDK 64‐Bit Server VM (build 25.131‐b11, mixed mode)

01.

02.

03.

04.

13

Page 14: Dockerized Java - JEEConf 2017

OpenJDKThe reality is that it is easier to get latest version of OpenJDK through

Docker Hub than through upstream distribution repositories (apt or

yum).“14

Page 15: Dockerized Java - JEEConf 2017

Oracle Java?15

Page 16: Dockerized Java - JEEConf 2017

Build ityourself!

16

Page 17: Dockerized Java - JEEConf 2017

Or...17

Page 18: Dockerized Java - JEEConf 2017

Oracle's official

18

Page 19: Dockerized Java - JEEConf 2017

Oracle's official

19

Page 20: Dockerized Java - JEEConf 2017

Easy?

20

Page 21: Dockerized Java - JEEConf 2017

Easy?docker login container‐registry.oracle.com

docker pull container‐registry.oracle.com/java/serverjre

01.

02.

21

Page 22: Dockerized Java - JEEConf 2017

Alternatives?22

Page 23: Dockerized Java - JEEConf 2017

Build ityourself!

23

Page 24: Dockerized Java - JEEConf 2017

Or...24

Page 25: Dockerized Java - JEEConf 2017

Azul's ZuluIt's a certified OpenJDK build.

Offers free extension that makes it on­par with HotSpot.

Dockerfiles: https://github.com/zulu­openjdk/zulu­openjdk.

Do not trust me, I haven't tested it! But it looks promising.

••••

25

Page 26: Dockerized Java - JEEConf 2017

Packagingyour Javaapps

26

Page 27: Dockerized Java - JEEConf 2017

Java's promise

27

Page 28: Dockerized Java - JEEConf 2017

Docker's promise

28

Page 29: Dockerized Java - JEEConf 2017

29

Page 30: Dockerized Java - JEEConf 2017

Docker flow

30

Page 31: Dockerized Java - JEEConf 2017

Docker flow

31

Page 32: Dockerized Java - JEEConf 2017

QuestionWhat is the first problem any team runs into when starting using

Docker?“32

Page 33: Dockerized Java - JEEConf 2017

No space lefton device

33

Page 34: Dockerized Java - JEEConf 2017

34

Page 35: Dockerized Java - JEEConf 2017

Docker images

35

Page 36: Dockerized Java - JEEConf 2017

Container packaging

36

Page 37: Dockerized Java - JEEConf 2017

Container packaging

37

Page 38: Dockerized Java - JEEConf 2017

Container packaging

38

Page 39: Dockerized Java - JEEConf 2017

Dockerfile

39

Page 40: Dockerized Java - JEEConf 2017

Demo40

Page 41: Dockerized Java - JEEConf 2017

Ship artifacts

41

Page 42: Dockerized Java - JEEConf 2017

Running Java42

Page 43: Dockerized Java - JEEConf 2017

Container states

43

Page 44: Dockerized Java - JEEConf 2017

Gentle stopdocker stop  sends  SIGTERM

docker kill  sends  SIGKILL••

44

Page 45: Dockerized Java - JEEConf 2017

Shutdown hook Runtime

    .getRuntime()

    .addShutdownHook(new Thread() {

      public void run() { /*

        my shutdown code here

      */ }

    });

01.

02.

03.

04.

05.

06.

07.

45

Page 46: Dockerized Java - JEEConf 2017

Demo46

Page 47: Dockerized Java - JEEConf 2017

ErgonomicsErgonomics is the process by which the Java Virtual Machine (JVM)

and garbage collection tuning, such as behavior­based tuning, improve

application performance. The JVM provides platform­dependent

default selections for the garbage collector, heap size, and runtime

compiler. These selections match the needs of different types of

applications while requiring less command­line tuning. In addition,

behavior­based tuning dynamically tunes the sizes of the heap to meet

a specified behavior of the application.

“47

Page 48: Dockerized Java - JEEConf 2017

Server­classA class of machine referred to as a server­class machine has been

defined as a machine with the following:

2 or more physical processors

2 or more GB of physical memory••

48

Page 49: Dockerized Java - JEEConf 2017

Server­classOn server­class machines, the following are selected by default:

Throughput garbage collector

Initial heap size of 1/64 of physical memory up to 1 GB

Maximum heap size of 1/4 of physical memory up to 1 GB

Server runtime compiler

••••

49

Page 50: Dockerized Java - JEEConf 2017

50

Page 51: Dockerized Java - JEEConf 2017

Namespaces and cgroupsName spaces limit the view of the system visible to the process

Control groups limit resources available to the process••

51

Page 52: Dockerized Java - JEEConf 2017

Memory limitsdocker run ‐dit \

  ‐‐memory 100M \

  ‐‐memory‐swap ‐1 \

  java \

  java ‐Xmx100M MyServer

01.

02.

03.

04.

05.

52

Page 53: Dockerized Java - JEEConf 2017

JVM Memory

53

Page 54: Dockerized Java - JEEConf 2017

How much memory is there?These tools lie:

free

top

java

•••

54

Page 55: Dockerized Java - JEEConf 2017

55

Page 56: Dockerized Java - JEEConf 2017

Demo56

Page 57: Dockerized Java - JEEConf 2017

Progress?

57

Page 58: Dockerized Java - JEEConf 2017

Progress?

58

Page 59: Dockerized Java - JEEConf 2017

Progress?

59

Page 60: Dockerized Java - JEEConf 2017

How many threads in JVM?Application + frameworks

JIT (1+)

GC (1+)

•••

60

Page 61: Dockerized Java - JEEConf 2017

Threading modelsThread per request (servlets and friends)

Thread per core (vert.x, ratpack, play etc.)••

61

Page 62: Dockerized Java - JEEConf 2017

Default number of threads?Runtime

  .getRuntime()

  .availableProcessors();

01.

02.

03.

62

Page 63: Dockerized Java - JEEConf 2017

Demo63

Page 64: Dockerized Java - JEEConf 2017

Progress?

64

Page 65: Dockerized Java - JEEConf 2017

Progress?

65

Page 66: Dockerized Java - JEEConf 2017

Progress?

66

Page 67: Dockerized Java - JEEConf 2017

Just found this libraryhttps://github.com/haosdent/jcgroup•

67

Page 68: Dockerized Java - JEEConf 2017

Go toproduction!68

Page 69: Dockerized Java - JEEConf 2017

Yeah!

69

Page 70: Dockerized Java - JEEConf 2017

Ouch!

70

Page 71: Dockerized Java - JEEConf 2017

Application logs

docker run ‐‐name=petclinic \

           ‐v /var/log/petclinic:/app/logs \

           ...

01.

02.

03.

71

Page 72: Dockerized Java - JEEConf 2017

Logaggregation

72

Page 73: Dockerized Java - JEEConf 2017

Elastic Stack73

Page 74: Dockerized Java - JEEConf 2017

ELK ((L)LEK)

74

Page 75: Dockerized Java - JEEConf 2017

ELK ((L)LEK)

75

Page 76: Dockerized Java - JEEConf 2017

ELK (B(L)EK)

76

Page 77: Dockerized Java - JEEConf 2017

ELK (BEK)

77

Page 78: Dockerized Java - JEEConf 2017

JSON logging <dependency>

  <groupId>net.logstash.logback</groupId>

  <artifactId>logstash‐logback‐encoder</artifactId>

  <version>4.9</version>

 </dependency>

01.

02.

03.

04.

05.

78

Page 79: Dockerized Java - JEEConf 2017

JSON logging<appender name="json" class="...">

  ...

  <encoder 

    class="net.logstash.logback.encoder.LogstashEncoder" />

</appender>

01.

02.

03.

04.

05.

79

Page 80: Dockerized Java - JEEConf 2017

filebeat.ymlfilebeat.prospectors:

‐ input_type: log

    paths: ["...."]

    json.keys_under_root: true

    json.overwrite_keys: true

    json.add_error_key: true

    json.message_key: "message"

    tags: ["json"]

01.

02.

03.

04.

05.

06.

07.

08.

80

Page 81: Dockerized Java - JEEConf 2017

filebeat.ymloutput.elasticsearch:

  hosts: ["elasticsearch:9200"]

01.

02.

81

Page 82: Dockerized Java - JEEConf 2017

Container outputShow container's STDERR and STDOUT.

docker logs [‐f] [‐t] CONTAINER_ID01.

82

Page 83: Dockerized Java - JEEConf 2017

Docker logging driver$ docker info | grep 'Logging Driver'

Logging Driver: json‐file

01.

02.

83

Page 84: Dockerized Java - JEEConf 2017

STDOUT as JSON$ docker run ‐itd jenkins

67aa...

$ tail ‐f /var/lib/docker/containers/67aa.../67aa..._json.log

...

{"log":"INFO: Jenkins is fully up and running\r\n",

 "stream":"stdout","time":"2017‐02‐06T02:15:23.087459653Z"}

01.

02.

03.

04.

05.

06.

84

Page 85: Dockerized Java - JEEConf 2017

Stack traces?85

Page 86: Dockerized Java - JEEConf 2017

Demo86

Page 87: Dockerized Java - JEEConf 2017

Useful beatsfilebeat

dockbeat

springbeat

metricbeat

heartbeat

packetbeat

••••••

87

Page 88: Dockerized Java - JEEConf 2017

Summary88

Page 89: Dockerized Java - JEEConf 2017

Take­awaysBuild base Docker images yourself

Plan the image hierarchy to reduce image deliverable sizes

Carefully tune memory and threads to make sure your Java containers

behave well while working on the same host

Wait for Java 9 for better cgroups­awareness

Take care of log aggregation (container's life is short)

•••

••

89

Page 90: Dockerized Java - JEEConf 2017

More stuff90

Page 91: Dockerized Java - JEEConf 2017

Demo codehttps://github.com/aestasit/talks2017­jeeconf­dockerized­java­setup•

91

Page 92: Dockerized Java - JEEConf 2017

Book: Docker for Java Developers

92

Page 93: Dockerized Java - JEEConf 2017

Book: Containerizing CD in Java

93

Page 94: Dockerized Java - JEEConf 2017

Referenceshttp://matthewkwilliams.com/index.php/2016/03/17/docker­cgroups­

memory­constraints­and­java­cautionary­tale/

https://www.slideshare.net/kensipe/no­one­puts­java­in­the­container

https://www.slideshare.net/chbatey/docker­and­jvm­a­good­idea

••

94

Page 95: Dockerized Java - JEEConf 2017

Referenceshttps://developers.redhat.com/blog/2017/03/14/java­inside­docker/

http://blog.jelastic.com/2017/04/13/java­ram­usage­in­containers­top­

5­tips­not­to­lose­your­memory/

https://www.infoq.com/news/2017/02/java­memory­limit­container

••

95

Page 97: Dockerized Java - JEEConf 2017

Issueshttps://bugs.openjdk.java.net/browse/JDK­8170888

https://bugs.openjdk.java.net/browse/JDK­8140793

https://bugs.openjdk.java.net/browse/JDK­8146115

•••

97

Page 98: Dockerized Java - JEEConf 2017

That's all!98

Page 99: Dockerized Java - JEEConf 2017

Thank you!99

Page 100: Dockerized Java - JEEConf 2017

100