Docker 101

Docker Concepts

Containerisation

Image from Docker, Inc. via https://www.docker.com

Image from https://developer.ibm.com

Developer Experience

Image from https://cultivatehq.com

Not Just For Servers

Using Docker

Windows:

Mac:

Docker command cheatsheet:

  • docker run -it <image>
  • docker build -t <image> .
  • docker push <image>
  • docker pull <image>

Dockerfile

FROM centos:7
COPY target/app.jar /srv/app/app.jar
RUN yum install -y openjdk8
ENTRYPOINT ["java", "-jar"]
CMD "/srv/app/app.jar"

Docker Features

  • Access files inside container: docker run -v c:/Users/aarongorka/.ssh:/root/.ssh ubuntu:latest
  • Open a port on your workstation: docker run -p 8080:8080 nginx:latest
  • Pass in environment variables: docker run -e DB_USERNAME=foobar drupal
  • Run in interactive mode: docker run -it ubuntu bash

Browse Docker Hub:

Docker Hub screenshot

Questions about Docker so far?

docker-compose

docker run -it --rm -v "$(pwd):/srv/app:Z" -v "${HOME}/.ssh:/root/.ssh:Z" -v "${HOME}/.aws:/root/.aws:Z" -e MY_ENV_VAR -e MY_ENV_VAR_2 -w /srv/app ubuntu:3.5.8 deploy.sh

vs.

docker-compose run deploy

Example docker-compose.yml:

version: '2.0'
services:
  kubectl:
    image: aarongorka/kubernetes-utils:1.8.4
    volumes:
      - .:/srv/app:Z
      - ~/.kube:/root/.kube:Z
    working_dir: /srv/app

  builder:
    image: aarongorka/java-base-builder:latest
    volumes:
      - .:/srv/app:Z
      - ~/.m2:/root/.m2:Z
    working_dir: /srv/app

Make

docker login nexus.example.com -u "${NEXUS_USERNAME}" -p "${NEXUS_PASSWORD}"
docker-compose run --rm builder mvn install -B
docker build -t ${IMAGE_NAME}:${BUILD_VERSION} .
docker push ${IMAGE_NAME}:latest
docker-compose run --rm builder sh -c "envsubst < k8s-config/deployment.tmpl.yml > k8s-config/deployment.yml"
docker-compose run --rm kubectl apply -f k8s-config/deployment.yml

vs.

make nexusLogin build dockerBuild dockerPush deploy

Example Makefile:

build:
	docker-compose run --rm builder mvn install -s settings.xml

dockerBuild:
	docker build -t $(IMAGE_NAME):$(BUILD_VERSION) .

nexusLogin:
	docker login nexus.example.com -u "$(NEXUS_USERNAME)" -p "$(NEXUS_PASSWORD)"

deploy:
	docker-compose run --rm --entrypoint=sh builder -c "envsubst < k8s-config/deployment.tmpl.yml > k8s-config/deployment.yml"
	docker-compose run --rm kubectl apply -f k8s-config/deployment.yml
Docker + docker-compose + Make

### =

# 3 Musketeers

https://3musketeers.io

Running Docker in Production

  • Deployment?
  • Secrets?
  • Configuration?
  • Scheduling?
  • Networking?

The purpose of Kubernetes is to make it easier to organize and schedule your application across a fleet of machines. At a high level it is an operating system for your cluster.

To be continued…