Docker

Little demo

  • Hello world
  • Let's build something
  • Let's run it





$> docker run alpine echo "Hello Cambas"





$> docker run -d alpine tail -f /dev/null





$> docker run -v $(pwd):/app alpine ls /app





$> docker run -v $(pwd):/app alpine touch myfile.txt

Now let's build something



$> mkdir cowsays

$> cd cowsays 

$> touch Dockerfile

>> FROM alpine

>> CMD ["echo", "The cow Says MUUUU"]

$> docker build -t cowsays .

$> docker run cowsays


$> docker ps

$> docker ps -a

$> docker images

$> docker history cowsays

Now let's build something that works



$> cd

$> git clone https://github.com/timoteoponce/namer.git

$> cd namer

$> docker run -v $(pwd):/app --workdir /app 
    \ maven:3-jdk8-alpine mvn clean package




$> docker run -v $(pwd):/app --workdir /app 
    \ java:8-jre-alpine java -jar target/namer.jar




$> docker run -it -v $(pwd):/app --workdir /app 
    \ java:8-jre-alpine java -jar target/namer.jar

Port mapping





$> docker run -p 8000:80 nginx



$> docker run -p 9000:80 httpd:alpine

Used commands

  • run
  • run -d
  • images
  • ps
  • stop
  • rm
  • rmi

(not (= Docker VM))

Containers vs VMs

Container vs VMs

Container vs VMs

Architecture

Workshop

Little REST API

Clone the project



$> git clone https://github.com/timoteoponce/simple-rest.git

Build it



$> cd simple-rest.git

$> docker run -v $(pwd):/app --workdir /app \ 
    maven:3-jdk-8-alpine mvn clean package

Run it



$> docker run -v $(pwd):/app --workdir /app \ 
    -p 4000:4567 \
    java:8-jre-alpine java -jar target/docker-workshop-1.0-SNAPSHOT.jar



http://localhost:4000

Dockerize it



$> touch Dockerfile

$> code Dockerfile
FROM java:jre-8-alpine

ADD target/docker-workshop-1.0-SNAPSHOT.jar /app/.

CMD ["java", "-jar", "/app/docker-workshop-1.0-SNAPSHOT.jar"]

Dockerfile

Dockerize it



$> docker build -t ypfb/simple-rest .

$> docker run -d -p 4000:4567 ypfb/simple-rest

$> docker images

Dockerized environment

  • Isolated component
  • Completely self-contained
  • Runs whenever docker is present
  • Can run many at the same time without conflicts

Complex REST

Database





$> docker run -d -e POSTGRES_USER=docker \ 
    -e POSTGRES_PASSWORD=docker \ 
    -e POSTGRES_DB=docker \
     --name dockerdb  postgres:9-alpine


$> docker run -it --link dockerdb governmentpaas/psql 
    \ psql -U docker -h dockerdb

Complex REST





$> git checkout step3

$> code .

$> docker run -v $(pwd):/app --workdir /app \ 
    maven:3-jdk-8-alpine mvn clean package

Complex REST






$> docker run -v $(pwd):/app --workdir /app \ 
    --link dockerdb -p 4010:4567 \ 
    java:8-jre-alpine java -jar target/docker-workshop-1.0-SNAPSHOT.jar

Backup a dockerized db



$> docker run -d -e POSTGRES_USER=docker \ 
    -e POSTGRES_PASSWORD=docker \ 
    -e POSTGRES_DB=docker \
     --name dockerdb  postgres:9-alpine


$> docker exec dockerdb \ 
    pg_dump -U docker -d docker > dockerdb_20171016.sql

Backup an image



$> docker save -o <OUTPUT_TAR_FILE> <IMAGE_NAME>


$> docker save -o ./simple-rest.tar ypfb/simple-rest

Restore an image



Download from https://goo.gl/ikno6M


$> docker load -i ./simple-rest-step2.tar

$> docker images

Run the restored image



$> docker run -d -p 9100:4567 ypfb/simple-rest 

Docker-compose

Docker compose

  • Simplified container setup
  • Centralized
  • Standard

 docker-compose demo



$> sudo pip install docker-compose

$> mkdir docker-compose-demo

$> cd docker-compose-demo

$> touch docker-compose.yml

$> code .

 docker-compose.yml

demo:
    image: tutum/hello-world
    ports:
        - 8888: 80

Run it



$> docker-compose up

Docker compose

  • up/down: the processes
  • start/stop/restart: the services

Docker-compose our app

Docker-compose



$> git clone https://github.com/timoteoponce/simple-rest.git

$> cd simple-rest

$> git checkout step3

$> docker run \ 
    -v $(pwd):/app -v m2:/root/.m2 \ 
    --workdir /app \ 
    maven:3-jdk-8-alpine mvn clean package

$> docker build -t ypfb/simple-rest-step3 .

Docker-compose



$> mkdir docker-compose-rest

$> cd docker-compose-rest

$> touch docker-compose.yml

$> code .

Docker-compose

database:
    image: postgres:9-alpine
    environment:
        - POSTGRES_DB=docker
        - POSTGRES_USER=docker
        - POSTGRES_PASSWORD=docker

rest:
    image: ypfb/simple-rest-step3
    links:
        - database:postgres
    ports:
        - 9000:4567
    

Docker-compose



$> docker-compose up

Docker-compose

database:
    image: postgres:9-alpine
    environment:
        - POSTGRES_DB=docker
        - POSTGRES_USER=docker
        - POSTGRES_PASSWORD=docker

rest:
    image: ypfb/simple-rest-step3
    restart: always
    links:
        - database:postgres
    ports:
        - 9000:4567
    

Let's add some complexity

Multiple services



$> mkdir proxy

$> touch proxy/Dockerfile proxy/nginx.conf

$> code proxy

Multiple services



FROM nginx:alpine

COPY nginx.conf /etc/nginx/nginx.conf

Multiple services

worker_processes  1;

events {
    worker_connections  1024;
}

http {

    server {

        listen 80;

        location / {
            proxy_pass http://rest:4567/;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header Host $http_host;
        }

    }

}

Multiple services

database:
    image: postgres:9-alpine
    environment:
        - POSTGRES_DB=docker
        - POSTGRES_USER=docker
        - POSTGRES_PASSWORD=docker

rest:
    image: ypfb/simple-rest-step3
    restart: always
    links:
        - database:postgres
    
proxy: 
    build: ./proxy
    restart: always
    links:
        - rest
    port: 
        - 80:80

Multiple services







$> docker-compose rm


$> docker-compose up --build

JEE dockerized application

Create the project



$> git clone https://github.com/timoteoponce/jee-docker

$> cd jee-docker

$> docker run -v $(pwd):/app \
    -v ~/.m2:/root/.m2 \
    maven:3-jdk-8-alpine mvn clean package

Define environment


FROM timoteoponce/docker-wildfly-postgres

ADD target/jee-docker.war ${DEPLOYMENT_DIR}

Build and run it



$> docker build -t swissbytes/jee-docker .

$> docker run -d -p 8080:8080 \
    --name jee-wildfly swissbytes/jee-docker 

Full-profile JEE app

Switch to the project



$> git checkout full-profile

$> docker run -v $(pwd):/app \
    -v ~/.m2:/root/.m2 \
    maven:3-jdk-8-alpine mvn clean package

Build it



$> docker build -t swissbytes/jee-docker .

Create docker compose for it



database:
        .....


rest:
        .....

Create docker compose for it



$> docker-compose up

docker-workshop

By Timoteo Ponce

docker-workshop

Docker workshop

  • 437