Top Banner
01
103

Dockerized Java for Transylvanian JUG

Jan 22, 2018

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Dockerized Java for Transylvanian JUG

01

Page 2: Dockerized Java for Transylvanian JUG

02

Page 3: Dockerized Java for Transylvanian JUG

03

Page 4: Dockerized Java for Transylvanian JUG

Let's start!04

Page 5: Dockerized Java for Transylvanian JUG

Getting Java05

Page 6: Dockerized Java for Transylvanian JUG

Question

06

Page 7: Dockerized Java for Transylvanian JUG

No!07

Page 8: Dockerized Java for Transylvanian JUG

Because... license!

08

Page 9: Dockerized Java for Transylvanian JUG

Licensing

09

Page 10: Dockerized Java for Transylvanian JUG

Official Java image?

10

Page 11: Dockerized Java for Transylvanian JUG

11

Page 12: Dockerized Java for Transylvanian JUG

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.

12

Page 13: Dockerized Java for Transylvanian JUG

Deprecated

13

Page 14: Dockerized Java for Transylvanian JUG

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.

14

Page 15: Dockerized Java for Transylvanian JUG

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

Docker Hub than through upstream distribution repositories (apt or

yum).“15

Page 16: Dockerized Java for Transylvanian JUG

Oracle Java?16

Page 17: Dockerized Java for Transylvanian JUG

Build ityourself!

17

Page 18: Dockerized Java for Transylvanian JUG

Or...18

Page 19: Dockerized Java for Transylvanian JUG

Oracle's official

19

Page 20: Dockerized Java for Transylvanian JUG

Oracle's official

20

Page 21: Dockerized Java for Transylvanian JUG

Easy?

21

Page 22: Dockerized Java for Transylvanian JUG

Easy?docker login container-registry.oracle.com

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

01.

02.

22

Page 23: Dockerized Java for Transylvanian JUG

Alternatives?23

Page 24: Dockerized Java for Transylvanian JUG

Build ityourself!

24

Page 25: Dockerized Java for Transylvanian JUG

Or...25

Page 26: Dockerized Java for Transylvanian JUG

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.

••••

26

Page 27: Dockerized Java for Transylvanian JUG

Packagingyour Java

apps27

Page 28: Dockerized Java for Transylvanian JUG

Java's promise

28

Page 29: Dockerized Java for Transylvanian JUG

Docker's promise

29

Page 30: Dockerized Java for Transylvanian JUG

30

Page 31: Dockerized Java for Transylvanian JUG

Docker flow

31

Page 32: Dockerized Java for Transylvanian JUG

Docker flow

32

Page 33: Dockerized Java for Transylvanian JUG

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

Docker?“33

Page 34: Dockerized Java for Transylvanian JUG

No space lefton device

34

Page 35: Dockerized Java for Transylvanian JUG

35

Page 36: Dockerized Java for Transylvanian JUG

Docker images

36

Page 37: Dockerized Java for Transylvanian JUG

Container packaging

37

Page 38: Dockerized Java for Transylvanian JUG

Container packaging

38

Page 39: Dockerized Java for Transylvanian JUG

Container packaging

39

Page 40: Dockerized Java for Transylvanian JUG

Dockerfile

40

Page 41: Dockerized Java for Transylvanian JUG

Demo41

Page 42: Dockerized Java for Transylvanian JUG

Ship artifacts

42

Page 43: Dockerized Java for Transylvanian JUG

Running Java43

Page 44: Dockerized Java for Transylvanian JUG

Container states

44

Page 45: Dockerized Java for Transylvanian JUG

Gentle stopdocker stop sends SIGTERM

docker kill sends SIGKILL••

45

Page 46: Dockerized Java for Transylvanian JUG

Shutdown hook Runtime

.getRuntime()

.addShutdownHook(new Thread() {

public void run() { /*

my shutdown code here

*/ }

});

01.

02.

03.

04.

05.

06.

07.

46

Page 47: Dockerized Java for Transylvanian JUG

Demo47

Page 48: Dockerized Java for Transylvanian JUG

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.

“48

Page 49: Dockerized Java for Transylvanian JUG

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••

49

Page 50: Dockerized Java for Transylvanian JUG

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

••••

50

Page 51: Dockerized Java for Transylvanian JUG

51

Page 52: Dockerized Java for Transylvanian JUG

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

Control groups limit resources available to the process••

52

Page 53: Dockerized Java for Transylvanian JUG

Memory limitsdocker run -dit \

--memory 100M \

--memory-swap -1 \

java \

java -Xmx100M MyServer

01.

02.

03.

04.

05.

53

Page 54: Dockerized Java for Transylvanian JUG

JVM Memory

54

Page 55: Dockerized Java for Transylvanian JUG

How much memory is there?These tools lie:

free

top

java

•••

55

Page 56: Dockerized Java for Transylvanian JUG

56

Page 57: Dockerized Java for Transylvanian JUG

Demo57

Page 58: Dockerized Java for Transylvanian JUG

Progress?

58

Page 59: Dockerized Java for Transylvanian JUG

Progress?

59

Page 60: Dockerized Java for Transylvanian JUG

Progress?

60

Page 61: Dockerized Java for Transylvanian JUG

Java 9! Yes!61

Page 62: Dockerized Java for Transylvanian JUG

How many threads in JVM?Application + frameworks

JIT (1+)

GC (1+)

•••

62

Page 63: Dockerized Java for Transylvanian JUG

Threading modelsThread per request (servlets and friends)

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

63

Page 64: Dockerized Java for Transylvanian JUG

Default number of threads?Runtime

.getRuntime()

.availableProcessors();

01.

02.

03.

64

Page 65: Dockerized Java for Transylvanian JUG

Demo65

Page 66: Dockerized Java for Transylvanian JUG

Progress?

66

Page 67: Dockerized Java for Transylvanian JUG

Progress?

67

Page 68: Dockerized Java for Transylvanian JUG

Progress?

68

Page 69: Dockerized Java for Transylvanian JUG

Interesting libraryhttps://github.com/haosdent/jcgroup•

69

Page 70: Dockerized Java for Transylvanian JUG

Go toproduction!

70

Page 71: Dockerized Java for Transylvanian JUG

Yeah!

71

Page 72: Dockerized Java for Transylvanian JUG

Ouch!

72

Page 73: Dockerized Java for Transylvanian JUG

Application logs

docker run --name=petclinic \

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

...

01.

02.

03.

73

Page 74: Dockerized Java for Transylvanian JUG

Logaggregation

74

Page 75: Dockerized Java for Transylvanian JUG

Elastic Stack75

Page 76: Dockerized Java for Transylvanian JUG

ELK ((L)LEK)

76

Page 77: Dockerized Java for Transylvanian JUG

ELK ((L)LEK)

77

Page 78: Dockerized Java for Transylvanian JUG

ELK (B(L)EK)

78

Page 79: Dockerized Java for Transylvanian JUG

ELK (BEK)

79

Page 80: Dockerized Java for Transylvanian JUG

JSON logging <dependency>

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

<artifactId>logstash-logback-encoder</artifactId>

<version>4.9</version>

</dependency>

01.

02.

03.

04.

05.

80

Page 81: Dockerized Java for Transylvanian JUG

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

...

<encoder

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

</appender>

01.

02.

03.

04.

05.

81

Page 82: Dockerized Java for Transylvanian JUG

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.

82

Page 83: Dockerized Java for Transylvanian JUG

filebeat.ymloutput.elasticsearch:

hosts: ["elasticsearch:9200"]

01.

02.

83

Page 84: Dockerized Java for Transylvanian JUG

Container outputShow container's STDERR and STDOUT.

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

84

Page 85: Dockerized Java for Transylvanian JUG

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

Logging Driver: json-file

01.

02.

85

Page 86: Dockerized Java for Transylvanian JUG

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.

86

Page 87: Dockerized Java for Transylvanian JUG

Stack traces?87

Page 88: Dockerized Java for Transylvanian JUG

Useful beatsfilebeat

dockbeat

springbeat

metricbeat

heartbeat

packetbeat

••••••

88

Page 89: Dockerized Java for Transylvanian JUG

Summary89

Page 90: Dockerized Java for Transylvanian JUG

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

Use for the very latest Java 8 and Java 9 for better cgroups-

awareness

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

•••

90

Page 91: Dockerized Java for Transylvanian JUG

More stuff91

Page 92: Dockerized Java for Transylvanian JUG

Demo codehttp://bit.ly/DOCKERIZED_JAVA_TJUG•

92

Page 93: Dockerized Java for Transylvanian JUG

Book: Docker for Java Developers

93

Page 94: Dockerized Java for Transylvanian JUG

Book: Containerizing CD in Java

94

Page 95: Dockerized Java for Transylvanian JUG

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

••

95

Page 96: Dockerized Java for Transylvanian JUG

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

••

96

Page 98: Dockerized Java for Transylvanian JUG

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

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

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

•••

98

Page 99: Dockerized Java for Transylvanian JUG

Cheatsheets99

Page 100: Dockerized Java for Transylvanian JUG

Stickers100

Page 101: Dockerized Java for Transylvanian JUG

That's all!101

Page 102: Dockerized Java for Transylvanian JUG

Thank you!102

Page 103: Dockerized Java for Transylvanian JUG

103