Slide 1

Slide 1 text

The Twelve-Factor Container • Twitter @caseywest • Email [email protected] • Web http://caseywest.com • Days since I last used that joke zero 1 @caseywest

Slide 2

Slide 2 text

Thanks a lot, Pivotal 2 @caseywest

Slide 3

Slide 3 text

This isn't really a talk about containers 3 @caseywest

Slide 4

Slide 4 text

This is a talk about operational maturity 4 @caseywest

Slide 5

Slide 5 text

You must be this tall to ride this ride 5 @caseywest

Slide 6

Slide 6 text

Audience Participation • Containers? • Schedulers? • Cloud? 6 @caseywest

Slide 7

Slide 7 text

Docker Docker Docker Docker Docker Docker Docker Docker 7 @caseywest

Slide 8

Slide 8 text

The factors 8 @caseywest

Slide 9

Slide 9 text

1: One codebase tracked in revision control, many deploys 9 @caseywest

Slide 10

Slide 10 text

Anti-pattern Building separate images for staging and production 10 @caseywest

Slide 11

Slide 11 text

Anti-pattern Tags for dev and prod 11 @caseywest

Slide 12

Slide 12 text

Best Practice Use the environment and/or feature flags 12 @caseywest

Slide 13

Slide 13 text

2: Explicitly declare and isolate dependencies 13 @caseywest

Slide 14

Slide 14 text

2: Explicitly declare and isolate dependencies 14 @caseywest

Slide 15

Slide 15 text

Anti-pattern latest 15 @caseywest

Slide 16

Slide 16 text

Best Practice Declare version numbers of upstream dependencies 16 @caseywest

Slide 17

Slide 17 text

Best Practice Depend on base images for default filesystem and runtimes 17 @caseywest

Slide 18

Slide 18 text

3: Store config in the environment 18 @caseywest

Slide 19

Slide 19 text

Anti-pattern config.yml 19 @caseywest

Slide 20

Slide 20 text

Anti-pattern properties.xml 20 @caseywest

Slide 21

Slide 21 text

Anti-pattern Hard-coded feature flags 21 @caseywest

Slide 22

Slide 22 text

Best Practice This one is literally about environment variables 22 @caseywest

Slide 23

Slide 23 text

Best Practice This one is literally about environment variables ! ‑ 23 @caseywest

Slide 24

Slide 24 text

4: Treat backing services as attached resources 24 @caseywest

Slide 25

Slide 25 text

Anti-pattern No local disk 25 @caseywest

Slide 26

Slide 26 text

Anti-pattern No local disk 26 @caseywest

Slide 27

Slide 27 text

Anti-pattern No local disk 27 @caseywest

Slide 28

Slide 28 text

Best Practice Connect to network- attached services using connection info from the environment 28 @caseywest

Slide 29

Slide 29 text

5: Strictly separate build and run stages 29 @caseywest

Slide 30

Slide 30 text

Anti-pattern Install on deploy 30 @caseywest

Slide 31

Slide 31 text

Best Practice Build immutable images then run those images 31 @caseywest

Slide 32

Slide 32 text

Painfully Obvious Best Practices Eat when hungry Sleep when tired Book Casey West for speaking gigs 32 @caseywest

Slide 33

Slide 33 text

Best Practice Respect the lifecycle: buid, run, destroy 33 @caseywest

Slide 34

Slide 34 text

6: Execute the app as one or more stateless processes 34 @caseywest

Slide 35

Slide 35 text

Best Practice Schedule LRPs by distributing them across a cluster of physical hardware 35 @caseywest

Slide 36

Slide 36 text

Anti-pattern NFS 36 @caseywest

Slide 37

Slide 37 text

Anti-pattern NFS Need I say more? 37 @caseywest

Slide 38

Slide 38 text

7: Export services via port binding 38 @caseywest

Slide 39

Slide 39 text

Best Practice port = Env.fetch(:port) 39 @caseywest

Slide 40

Slide 40 text

Best Practice my $port = $ENV{PORT}; 40 @caseywest

Slide 41

Slide 41 text

Best Practice private String getPort() { Map env = System.getenv(); return env.get("PORT"); } 41 @caseywest

Slide 42

Slide 42 text

Best Practice let port = env::var("PORT").unwrap() 42 @caseywest

Slide 43

Slide 43 text

8: Scale out via the process model 43 @caseywest

Slide 44

Slide 44 text

Best Practice Horizontally scale by adding instances 44 @caseywest

Slide 45

Slide 45 text

9: Maximize robustness with fast startup and graceful shutdown 45 @caseywest

Slide 46

Slide 46 text

10: Keep development, staging, and production as similar as possible 46 @caseywest

Slide 47

Slide 47 text

Best Practice Run containers in development 47 @caseywest

Slide 48

Slide 48 text

11: Treat logs as event streams 48 @caseywest

Slide 49

Slide 49 text

Anti-pattern Random log files #yolo'd all over the file system 49 @caseywest

Slide 50

Slide 50 text

Anti-pattern Random log files #yolo'd all over the file system, bro 50 @caseywest

Slide 51

Slide 51 text

Best Practice STDOUT STDOUT STDOUT STDOUT 51 @caseywest

Slide 52

Slide 52 text

12: Run admin/ management tasks as one-off processes 52 @caseywest

Slide 53

Slide 53 text

Anti-pattern Custom containers for tasks 53 @caseywest

Slide 54

Slide 54 text

Best Practice Reuse application images with specific entrypoints for tasks 54 @caseywest

Slide 55

Slide 55 text

You are now cloud-native 55 @caseywest

Slide 56

Slide 56 text

Repeatability Reliability Resiliency 56 @caseywest

Slide 57

Slide 57 text

Thank you Questions? 57 @caseywest

Slide 58

Slide 58 text

@caseywest Let's be friends 58 @caseywest