SlideShare a Scribd company logo
Using Docker for
Development
@rhein_wein
Director of Engineering
CloudBees
Laura Frank Tacho
landscape.cncf.io
1 DOCKER COMPOSE BASICS
2 OPTIMIZING IMAGES
3 DEBUGGING IN CONTAINERS
1 DOCKER COMPOSE BASICS
Developer Tools
• Docker Compose
• Docker Desktop
• Docker for Mac
• Docker for Windows
• Easiest way to run Docker and Kubernetes on your local
machine
https://www.docker.com/products/docker-desktop
Sample App: Cats vs Dogs
vote result
github.com/rheinwein/example-voting-app
worker
.NET
vote
python
redis
redis
db
postgres
result
node-js
Sample App: Cats vs Dogs
github.com/rheinwein/example-voting-app
Use from DockerHub
Develop, build, and test
Sample App: Cats vs Dogs
github.com/rheinwein/example-voting-app
worker
.NET
vote
python
redis
redis
db
postgres
result
node-js
DCEU 18: Developing with Docker Containers
What Happened?
example-voting-app $ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
db docker-entrypoint.sh postgres Up 5432/tcp
example-voting-app_result_1 nodemon --inspect=[::]:585 ... Up 0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp
example-voting-app_vote_1 python app.py Up 0.0.0.0:5000->80/tcp
example-voting-app_worker_1 /bin/sh -c dotnet src/Work ... Up
redis docker-entrypoint.sh redis ... Up 0.0.0.0:32774->6379/tcp
example-voting-app $ docker ps # filtering output
CONTAINER ID IMAGE COMMAND STATUS PORTS
7852e34c057f example-voting-app_worker "/bin/sh -c 'dotnet …" Up 6 minutes
3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp
b0d3c9cd007c example-voting-app_vote "python app.py” Up 6 minutes 0.0.0.0:5000->80/tcp
9702bb12b70b redis:alpine "docker-entrypoint.s…" Up 6 minutes 0.0.0.0:32774->6379/tcp
072da9ac67e3 example-voting-app_result "nodemon --inspect=[…" Up 6 minutes 0.0.0.0:5858->5858/tcp
What Happened?
example-voting-app $ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------
db docker-entrypoint.sh postgres Up 5432/tcp
example-voting-app_result_1 nodemon --inspect=[::]:585 ... Up 0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp
example-voting-app_vote_1 python app.py Up 0.0.0.0:5000->80/tcp
example-voting-app_worker_1 /bin/sh -c dotnet src/Work ... Up
redis docker-entrypoint.sh redis ... Up 0.0.0.0:32774->6379/tcp
example-voting-app $ docker ps # filtering output
CONTAINER ID IMAGE COMMAND STATUS PORTS
7852e34c057f example-voting-app_worker "/bin/sh -c 'dotnet …" Up 6 minutes
3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp
b0d3c9cd007c example-voting-app_vote "python app.py” Up 6 minutes 0.0.0.0:5000->80/tcp
9702bb12b70b redis:alpine "docker-entrypoint.s…" Up 6 minutes 0.0.0.0:32774->6379/tcp
072da9ac67e3 example-voting-app_result "nodemon --inspect=[…" Up 6 minutes 0.0.0.0:5858->5858/tcp
3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp
db docker-entrypoint.sh postgres Up 5432/tcp
Text Editor
Container
Browser
Source Code
Access local code
See changes in the
browser immediately
Accessing Local Code
version: "3"
services:
result:
build: ./result
command: nodemon server.js
volumes:
- ./result:/app
ports:
- "5001:80"
- "5858:5858"
networks:
- front-tier
- back-tier
Runtime vs Buildtime
This will overwrite the code
copied into the image at
buildtime. Now you’re able to
edit local code and have those
changes reflected in the
container
docker-compose.yml
DCEU 18: Developing with Docker Containers
version: "3"
services:
redis:
image: redis:alpine
container_name: redis
ports:
- "6379"
networks:
- back-tier
def get_redis():
if not hasattr(g, 'redis'):
g.redis = Redis(host="redis", db=0, socket_timeout=5)
return g.redis
vote/app.pydocker-compose.yml
Managing External Dependencies
You don’t need to run your
database in a container.
‣ If you store application data in the
container, that data is lost when the
container is stopped and removed
‣ Using volumes allows data to persist
beyond the lifecycle of the container
‣ Drivers are available for cloud services
‣ You can also use your local disk
Data Volumes
services:
...
db:
image: postgres:9.4
container_name: db
volumes:
- "db-data:/var/lib/postgresql/data"
networks:
- back-tier
volumes:
db-data:
docker-compose.yml
2 OPTIMIZING IMAGES
Dockerfiles and container
images are the heart of your
application.
Everything else in the container
ecosystem assumes that you have
your source code available as a
container time.
FROM node:10.9-alpine
RUN mkdir -p /app
WORKDIR /app
RUN npm install -g nodemon
RUN npm config set registry https://
registry.npmjs.org
COPY package.json /app/package.json
RUN npm install 
&& npm ls 
&& npm cache clean --force 
&& mv /app/node_modules /node_modules
COPY . /app
ENV PORT 80
EXPOSE 80
CMD ["node", "server.js"]
A Dockerfile a list of instructions
outlining packages, files,
dependencies, and everything required
for your application to run.
result/Dockerfile
FROM node:10.9-alpine
RUN mkdir -p /app
WORKDIR /app
RUN npm install -g nodemon
RUN npm config set registry https://
registry.npmjs.org
COPY package.json /app/package.json
RUN npm install 
&& npm ls 
&& npm cache clean --force 
&& mv /app/node_modules /node_modules
COPY . /app
ENV PORT 80
EXPOSE 80
CMD ["node", "server.js"]
Depending on your language, select a
suitable base image and then install the
packages and run setup commands
necessary for your application.
In general, aim to have as small of an
image as possible, but you can always
optimize later.
result/Dockerfile
For faster dev cycles, optimize
your images.
If nothing changes in a layer command, Docker
will use an existing version.
At buildtime, these cache hits can drastically
reduce the time to build and push your image.
Cache misses will add extra time, and you can
optimize your image to avoid them during
development.
Use Caching Effectively
Order Layers for Better Cache Usage
Copy over package or dependency manifests and install those before copying the
rest of the code. Lockfiles change infrequently, so it’s not necessary to reinstall
everything all the time.
COPY package.json /app/package.json
RUN npm install 
&& npm ls 
&& npm cache clean --force 
&& mv /app/node_modules /node_modules
COPY . /app
Dockerfile Best Practices with Tibor and Sebastiaan
Watch the recording when it’s available!
Pick Base Images Wisely!
By now, almost every major language
or framework maintains a slim version
of their library image, tagged with slim
or specifically with alpine.
Warning: the size of an image on
Docker Hub is the compressed size.
hub.docker.com/_/node
Avoid Anti-Patterns
‣ Simultaneous Innovation
‣ Skipping the fundamentals like giving love to your Dockerfiles
‣ Forgetting other development best practices like pinning dependencies to
versions — this stuff still matters even if you’re using containers
‣ For example, don’t use the latest tag
3 DEBUGGING IN CONTAINERS
You can access log output either via Docker Compose or Docker directly.
$ docker-compose logs # this returns all logs for all services
db | LOG: stats_timestamp 2018-09-12 10:35:03.286676+00 is later than collector's time
2018-09-12 10:35:03.262932+00 for database 12141
result_1 | [nodemon] restarting due to changes...
result_1 | [nodemon] starting `node --inspect=[::]:5858 server.js`
result_1 | Debugger listening on ws://[::]:5858/f6dd534f-1976-421c-b4e2-8d3b1baf2622
result_1 | For help, see: https://nodejs.org/en/docs/inspector
result_1 | App running on port 80
result_1 | Connected to db
result_1 | Debugger attached.
redis | 1:M 12 Sep 08:33:52.991 # WARNING: The TCP backlog setting of 511 cannot be enforced
because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis | 1:M 12 Sep 08:33:52.991 # Server initialized
Viewing Log Output
Viewing Log Output
Logs are visible by default when starting your app with docker-compose up. If you prefer
a tidy terminal, use up with the -d flag. You can get logs per service later.
Tip: timestamps are available with a flag.
$ docker-compose up -d
...
$ docker-compose logs -t worker # docker logs -t example-voting-app_worker_1
worker_1 | 2018-09-12T08:22:49.367373200Z Waiting for db
worker_1 | 2018-09-12T08:22:50.371369500Z Waiting for db
worker_1 | 2018-09-12T08:22:53.526120800Z Connected to db
worker_1 | 2018-09-12T08:22:53.541336500Z Found redis at 172.20.0.2
worker_1 | 2018-09-12T08:22:53.541400100Z Connecting to redis
worker_1 | 2018-09-12T08:33:54.478754500Z Connected to db
worker_1 | 2018-09-12T08:33:54.495682400Z Found redis at 172.20.0.2
worker_1 | 2018-09-12T08:33:54.496062600Z Connecting to redis
worker_1 | 2018-09-12T08:34:15.528315300Z Processing vote for 'b' by '2d4e42c6c94f4e53'
worker_1 | 2018-09-12T08:37:11.883353600Z Processing vote for 'a' by ‘2d4e42c6c94f4e53'
Starting a Container in Interactive Mode
Want a shell to debug startup commands without the container exiting on failure?
version: "3"
services:
web:
image: ubuntu:18.04
tty: true
stdin_open: true
entrypoint: "/bin/bash"
docker run -it ubuntu:18:04 /bin/bash
# volume mount if you need to with `-v
source:target`
with docker-compose run web with Docker only
‣ docker top will give you a list of all running processes in a container
‣ docker inspect (name | id) will give you ALL of the details about a given resource
Helpful Docker Commands
‣ You can use the --format flag and pass in a Go template
‣ For example, to get the IP(s) of a running container:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 
$CONTAINER_ID
Running a Debugger
version: "3"
services:
result:
build: ./result
command: nodemon --inspect=0.0.0.0:5858 server.js
volumes:
- ./result:/app
ports:
- “5001:80"
- "5858:5858"
networks:
- front-tier
- back-tier
Maintain access to debugging tools by
publishing the ports.
You may also have to update the
command or entrypoint to access
debugging tools.
DCEU 18: Developing with Docker Containers
Visit the CodeShip team
at our booth!

More Related Content

PPTX
Meetup 23 - 03 - Application Delivery on K8S with GitOps
PPTX
Power of Azure Devops
PDF
GitOps with Gitkube
PDF
[Container Plumbing Days 2023] Why was nerdctl made?
PDF
Architecture Overview: Kubernetes with Red Hat Enterprise Linux 7.1
PDF
Helm - Application deployment management for Kubernetes
PPTX
Write microservice in golang
PDF
Introducing GitLab (September 2018)
Meetup 23 - 03 - Application Delivery on K8S with GitOps
Power of Azure Devops
GitOps with Gitkube
[Container Plumbing Days 2023] Why was nerdctl made?
Architecture Overview: Kubernetes with Red Hat Enterprise Linux 7.1
Helm - Application deployment management for Kubernetes
Write microservice in golang
Introducing GitLab (September 2018)

What's hot (20)

PPTX
Kubernetes Basics
PDF
Using GitLab CI
PDF
Exploring the power of OpenTelemetry on Kubernetes
PDF
Argocd up and running
PPTX
Docker introduction & benefits
PDF
Docker & kubernetes
PDF
GitOps with ArgoCD
PDF
The Power of GitOps with Flux & GitOps Toolkit
PPTX
Kubernetes 101
PDF
A GitOps Kubernetes Native CICD Solution with Argo Events, Workflows, and CD
PDF
DCSF19 Dockerfile Best Practices
PDF
Get started with gitops and flux
PPTX
Introduction to Docker - 2017
PDF
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
PDF
DevOps & SRE at Google Scale
PPTX
Kubernetes for Beginners: An Introductory Guide
PDF
Devops Cultura y Ciclo de Vida
PPTX
Interop 2018 - Understanding Kubernetes - Brian Gracely
PDF
Treinamento Docker Básico
Kubernetes Basics
Using GitLab CI
Exploring the power of OpenTelemetry on Kubernetes
Argocd up and running
Docker introduction & benefits
Docker & kubernetes
GitOps with ArgoCD
The Power of GitOps with Flux & GitOps Toolkit
Kubernetes 101
A GitOps Kubernetes Native CICD Solution with Argo Events, Workflows, and CD
DCSF19 Dockerfile Best Practices
Get started with gitops and flux
Introduction to Docker - 2017
Kubernetes GitOps featuring GitHub, Kustomize and ArgoCD
DevOps & SRE at Google Scale
Kubernetes for Beginners: An Introductory Guide
Devops Cultura y Ciclo de Vida
Interop 2018 - Understanding Kubernetes - Brian Gracely
Treinamento Docker Básico
Ad

Similar to DCEU 18: Developing with Docker Containers (20)

PDF
Using Docker For Development
PDF
Rapid Development With Docker Compose
PDF
Dockercon 23 - Getting started with Docker
PDF
Docker introduction
PPTX
Real World Experience of Running Docker in Development and Production
PDF
From development environments to production deployments with Docker, Compose,...
PDF
Data Science Workflows using Docker Containers
PDF
Dockers & kubernetes detailed - Beginners to Geek
PDF
Docker primer and tips
PDF
Taking containers from development to production
PPTX
Docker
PDF
Docker in everyday development
PDF
Docker Intro
PDF
Docker for Ruby Developers
PPTX
Novices guide to docker
PDF
Docker 101
PDF
Dockerize Your Project - GDGBogor
PPTX
Docker-Containerizing-Your-Applications(PPT-23).pptx
PDF
Introduction to Docker Compose
PDF
Perspectives on Docker
Using Docker For Development
Rapid Development With Docker Compose
Dockercon 23 - Getting started with Docker
Docker introduction
Real World Experience of Running Docker in Development and Production
From development environments to production deployments with Docker, Compose,...
Data Science Workflows using Docker Containers
Dockers & kubernetes detailed - Beginners to Geek
Docker primer and tips
Taking containers from development to production
Docker
Docker in everyday development
Docker Intro
Docker for Ruby Developers
Novices guide to docker
Docker 101
Dockerize Your Project - GDGBogor
Docker-Containerizing-Your-Applications(PPT-23).pptx
Introduction to Docker Compose
Perspectives on Docker
Ad

More from Docker, Inc. (20)

PDF
Containerize Your Game Server for the Best Multiplayer Experience
PDF
How to Improve Your Image Builds Using Advance Docker Build
PDF
Build & Deploy Multi-Container Applications to AWS
PDF
Securing Your Containerized Applications with NGINX
PDF
How To Build and Run Node Apps with Docker and Compose
PDF
Hands-on Helm
PDF
Distributed Deep Learning with Docker at Salesforce
PDF
The First 10M Pulls: Building The Official Curl Image for Docker Hub
PDF
Monitoring in a Microservices World
PDF
COVID-19 in Italy: How Docker is Helping the Biggest Italian IT Company Conti...
PDF
Predicting Space Weather with Docker
PDF
Become a Docker Power User With Microsoft Visual Studio Code
PDF
How to Use Mirroring and Caching to Optimize your Container Registry
PDF
Monolithic to Microservices + Docker = SDLC on Steroids!
PDF
Kubernetes at Datadog Scale
PDF
Labels, Labels, Labels
PDF
Using Docker Hub at Scale to Support Micro Focus' Delivery and Deployment Model
PDF
Build & Deploy Multi-Container Applications to AWS
PDF
From Fortran on the Desktop to Kubernetes in the Cloud: A Windows Migration S...
PDF
Developing with Docker for the Arm Architecture
Containerize Your Game Server for the Best Multiplayer Experience
How to Improve Your Image Builds Using Advance Docker Build
Build & Deploy Multi-Container Applications to AWS
Securing Your Containerized Applications with NGINX
How To Build and Run Node Apps with Docker and Compose
Hands-on Helm
Distributed Deep Learning with Docker at Salesforce
The First 10M Pulls: Building The Official Curl Image for Docker Hub
Monitoring in a Microservices World
COVID-19 in Italy: How Docker is Helping the Biggest Italian IT Company Conti...
Predicting Space Weather with Docker
Become a Docker Power User With Microsoft Visual Studio Code
How to Use Mirroring and Caching to Optimize your Container Registry
Monolithic to Microservices + Docker = SDLC on Steroids!
Kubernetes at Datadog Scale
Labels, Labels, Labels
Using Docker Hub at Scale to Support Micro Focus' Delivery and Deployment Model
Build & Deploy Multi-Container Applications to AWS
From Fortran on the Desktop to Kubernetes in the Cloud: A Windows Migration S...
Developing with Docker for the Arm Architecture

Recently uploaded (20)

PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Encapsulation theory and applications.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Electronic commerce courselecture one. Pdf
PDF
Machine learning based COVID-19 study performance prediction
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
MYSQL Presentation for SQL database connectivity
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
NewMind AI Weekly Chronicles - August'25 Week I
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
“AI and Expert System Decision Support & Business Intelligence Systems”
Reach Out and Touch Someone: Haptics and Empathic Computing
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Encapsulation theory and applications.pdf
Spectral efficient network and resource selection model in 5G networks
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Electronic commerce courselecture one. Pdf
Machine learning based COVID-19 study performance prediction
The Rise and Fall of 3GPP – Time for a Sabbatical?
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
MYSQL Presentation for SQL database connectivity
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Unlocking AI with Model Context Protocol (MCP)
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Modernizing your data center with Dell and AMD
Diabetes mellitus diagnosis method based random forest with bat algorithm

DCEU 18: Developing with Docker Containers

  • 4. 1 DOCKER COMPOSE BASICS 2 OPTIMIZING IMAGES 3 DEBUGGING IN CONTAINERS
  • 6. Developer Tools • Docker Compose • Docker Desktop • Docker for Mac • Docker for Windows • Easiest way to run Docker and Kubernetes on your local machine https://www.docker.com/products/docker-desktop
  • 7. Sample App: Cats vs Dogs vote result github.com/rheinwein/example-voting-app
  • 9. Use from DockerHub Develop, build, and test Sample App: Cats vs Dogs github.com/rheinwein/example-voting-app worker .NET vote python redis redis db postgres result node-js
  • 11. What Happened? example-voting-app $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------- db docker-entrypoint.sh postgres Up 5432/tcp example-voting-app_result_1 nodemon --inspect=[::]:585 ... Up 0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp example-voting-app_vote_1 python app.py Up 0.0.0.0:5000->80/tcp example-voting-app_worker_1 /bin/sh -c dotnet src/Work ... Up redis docker-entrypoint.sh redis ... Up 0.0.0.0:32774->6379/tcp example-voting-app $ docker ps # filtering output CONTAINER ID IMAGE COMMAND STATUS PORTS 7852e34c057f example-voting-app_worker "/bin/sh -c 'dotnet …" Up 6 minutes 3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp b0d3c9cd007c example-voting-app_vote "python app.py” Up 6 minutes 0.0.0.0:5000->80/tcp 9702bb12b70b redis:alpine "docker-entrypoint.s…" Up 6 minutes 0.0.0.0:32774->6379/tcp 072da9ac67e3 example-voting-app_result "nodemon --inspect=[…" Up 6 minutes 0.0.0.0:5858->5858/tcp
  • 12. What Happened? example-voting-app $ docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------------------- db docker-entrypoint.sh postgres Up 5432/tcp example-voting-app_result_1 nodemon --inspect=[::]:585 ... Up 0.0.0.0:5858->5858/tcp, 0.0.0.0:5001->80/tcp example-voting-app_vote_1 python app.py Up 0.0.0.0:5000->80/tcp example-voting-app_worker_1 /bin/sh -c dotnet src/Work ... Up redis docker-entrypoint.sh redis ... Up 0.0.0.0:32774->6379/tcp example-voting-app $ docker ps # filtering output CONTAINER ID IMAGE COMMAND STATUS PORTS 7852e34c057f example-voting-app_worker "/bin/sh -c 'dotnet …" Up 6 minutes 3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp b0d3c9cd007c example-voting-app_vote "python app.py” Up 6 minutes 0.0.0.0:5000->80/tcp 9702bb12b70b redis:alpine "docker-entrypoint.s…" Up 6 minutes 0.0.0.0:32774->6379/tcp 072da9ac67e3 example-voting-app_result "nodemon --inspect=[…" Up 6 minutes 0.0.0.0:5858->5858/tcp 3bca5cc2eb09 postgres:9.4 "docker-entrypoint.s…" Up 6 minutes 5432/tcp db docker-entrypoint.sh postgres Up 5432/tcp
  • 13. Text Editor Container Browser Source Code Access local code See changes in the browser immediately
  • 14. Accessing Local Code version: "3" services: result: build: ./result command: nodemon server.js volumes: - ./result:/app ports: - "5001:80" - "5858:5858" networks: - front-tier - back-tier Runtime vs Buildtime This will overwrite the code copied into the image at buildtime. Now you’re able to edit local code and have those changes reflected in the container docker-compose.yml
  • 16. version: "3" services: redis: image: redis:alpine container_name: redis ports: - "6379" networks: - back-tier def get_redis(): if not hasattr(g, 'redis'): g.redis = Redis(host="redis", db=0, socket_timeout=5) return g.redis vote/app.pydocker-compose.yml Managing External Dependencies
  • 17. You don’t need to run your database in a container.
  • 18. ‣ If you store application data in the container, that data is lost when the container is stopped and removed ‣ Using volumes allows data to persist beyond the lifecycle of the container ‣ Drivers are available for cloud services ‣ You can also use your local disk Data Volumes services: ... db: image: postgres:9.4 container_name: db volumes: - "db-data:/var/lib/postgresql/data" networks: - back-tier volumes: db-data: docker-compose.yml
  • 20. Dockerfiles and container images are the heart of your application. Everything else in the container ecosystem assumes that you have your source code available as a container time.
  • 21. FROM node:10.9-alpine RUN mkdir -p /app WORKDIR /app RUN npm install -g nodemon RUN npm config set registry https:// registry.npmjs.org COPY package.json /app/package.json RUN npm install && npm ls && npm cache clean --force && mv /app/node_modules /node_modules COPY . /app ENV PORT 80 EXPOSE 80 CMD ["node", "server.js"] A Dockerfile a list of instructions outlining packages, files, dependencies, and everything required for your application to run. result/Dockerfile
  • 22. FROM node:10.9-alpine RUN mkdir -p /app WORKDIR /app RUN npm install -g nodemon RUN npm config set registry https:// registry.npmjs.org COPY package.json /app/package.json RUN npm install && npm ls && npm cache clean --force && mv /app/node_modules /node_modules COPY . /app ENV PORT 80 EXPOSE 80 CMD ["node", "server.js"] Depending on your language, select a suitable base image and then install the packages and run setup commands necessary for your application. In general, aim to have as small of an image as possible, but you can always optimize later. result/Dockerfile
  • 23. For faster dev cycles, optimize your images.
  • 24. If nothing changes in a layer command, Docker will use an existing version. At buildtime, these cache hits can drastically reduce the time to build and push your image. Cache misses will add extra time, and you can optimize your image to avoid them during development. Use Caching Effectively
  • 25. Order Layers for Better Cache Usage Copy over package or dependency manifests and install those before copying the rest of the code. Lockfiles change infrequently, so it’s not necessary to reinstall everything all the time. COPY package.json /app/package.json RUN npm install && npm ls && npm cache clean --force && mv /app/node_modules /node_modules COPY . /app
  • 26. Dockerfile Best Practices with Tibor and Sebastiaan Watch the recording when it’s available!
  • 27. Pick Base Images Wisely! By now, almost every major language or framework maintains a slim version of their library image, tagged with slim or specifically with alpine. Warning: the size of an image on Docker Hub is the compressed size. hub.docker.com/_/node
  • 28. Avoid Anti-Patterns ‣ Simultaneous Innovation ‣ Skipping the fundamentals like giving love to your Dockerfiles ‣ Forgetting other development best practices like pinning dependencies to versions — this stuff still matters even if you’re using containers ‣ For example, don’t use the latest tag
  • 29. 3 DEBUGGING IN CONTAINERS
  • 30. You can access log output either via Docker Compose or Docker directly. $ docker-compose logs # this returns all logs for all services db | LOG: stats_timestamp 2018-09-12 10:35:03.286676+00 is later than collector's time 2018-09-12 10:35:03.262932+00 for database 12141 result_1 | [nodemon] restarting due to changes... result_1 | [nodemon] starting `node --inspect=[::]:5858 server.js` result_1 | Debugger listening on ws://[::]:5858/f6dd534f-1976-421c-b4e2-8d3b1baf2622 result_1 | For help, see: https://nodejs.org/en/docs/inspector result_1 | App running on port 80 result_1 | Connected to db result_1 | Debugger attached. redis | 1:M 12 Sep 08:33:52.991 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis | 1:M 12 Sep 08:33:52.991 # Server initialized Viewing Log Output
  • 31. Viewing Log Output Logs are visible by default when starting your app with docker-compose up. If you prefer a tidy terminal, use up with the -d flag. You can get logs per service later. Tip: timestamps are available with a flag. $ docker-compose up -d ... $ docker-compose logs -t worker # docker logs -t example-voting-app_worker_1 worker_1 | 2018-09-12T08:22:49.367373200Z Waiting for db worker_1 | 2018-09-12T08:22:50.371369500Z Waiting for db worker_1 | 2018-09-12T08:22:53.526120800Z Connected to db worker_1 | 2018-09-12T08:22:53.541336500Z Found redis at 172.20.0.2 worker_1 | 2018-09-12T08:22:53.541400100Z Connecting to redis worker_1 | 2018-09-12T08:33:54.478754500Z Connected to db worker_1 | 2018-09-12T08:33:54.495682400Z Found redis at 172.20.0.2 worker_1 | 2018-09-12T08:33:54.496062600Z Connecting to redis worker_1 | 2018-09-12T08:34:15.528315300Z Processing vote for 'b' by '2d4e42c6c94f4e53' worker_1 | 2018-09-12T08:37:11.883353600Z Processing vote for 'a' by ‘2d4e42c6c94f4e53'
  • 32. Starting a Container in Interactive Mode Want a shell to debug startup commands without the container exiting on failure? version: "3" services: web: image: ubuntu:18.04 tty: true stdin_open: true entrypoint: "/bin/bash" docker run -it ubuntu:18:04 /bin/bash # volume mount if you need to with `-v source:target` with docker-compose run web with Docker only
  • 33. ‣ docker top will give you a list of all running processes in a container ‣ docker inspect (name | id) will give you ALL of the details about a given resource Helpful Docker Commands ‣ You can use the --format flag and pass in a Go template ‣ For example, to get the IP(s) of a running container: docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_ID
  • 34. Running a Debugger version: "3" services: result: build: ./result command: nodemon --inspect=0.0.0.0:5858 server.js volumes: - ./result:/app ports: - “5001:80" - "5858:5858" networks: - front-tier - back-tier Maintain access to debugging tools by publishing the ports. You may also have to update the command or entrypoint to access debugging tools.
  • 36. Visit the CodeShip team at our booth!