Docker and Docker compose

Install docker and docker-compose

Docker basics

docker build -t essai .

--tag essai gives a name to the image

launching the service

sudo service docker start

ps, start, stop

sudo docker ps -a
sudo docker start my-running-app
sudo docker stop my-running-app

interactive:

sudo docker run -it -p 3000:3000 --rm --name my-running-app my-nodejs-app
  • Cleaning All All All:

    docker system prune --all --force
    
  • Cleaning containers:

    docker rm $(docker ps -aq)
    
  • Cleaning volumes:

    docker volume prune
    volume rm -f $(docker volume ls -q)
    
  • Inspecting volumes:

    docker volume inspect <volume_name>
    
  • retrieving an image:

    docker pull ubuntu:latest
    
  • Cleaning images:

    docker rmi -f $(docker images -q)
    docker image prune
    
  • Renaming an image:

    docker tag <IMAGE ID> nom/nom_image:tag
    
  • Following the logs of a container:

    docker logs -f <NOM_CONTENEUR_DOCKER>
    
  • Entering in a running container:

    docker exec -it <NOM_CONTENEUR_DOCKER> bash
    
  • Verifying the parameters of a container:

    docker inspect -f <NOM_CONTENEUR_DOCKER>
    

Dockerfile Hello world

Here is a sample Dockerfile

FROM node:alpine

ADD package.json /app/

WORKDIR /app

RUN npm install

ADD hello.js /app/

CMD npm start

EXPOSE 3000

and with a hello.js script

var express = require('express')
  var app = express()
  app.get('/', function(req, res) {
    res.end('Hello World!')
  })
  app.listen(3000)

and a package.json

{
  "name": "helloworld",
  "version": "1.0.0",
  "description": "hello",
  "main": "hello.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node hello.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.15.4"
  }
}

Docker hello world with node

  • First, build the image:

    docker build -t hellonode .
    
  • Then create the container:

    docker create -p 3000:3000 --name="wonderful_hellonode" hellonode
    
  • Launch it:

    docker start wonderful_hellonode
    
  • In a browser, go there:

    http://<your_ip>:3000
    

You should see the string “Hello World”

  • Then stop your container:

    docker stop wonderful_hellonode
    

Using volumes

Here is a new Dockerfile

FROM node:alpine
RUN apk update
RUN apk upgrade
RUN apk add bash
ADD package.json /app/

WORKDIR /app

RUN npm install

ADD hello.js /app/

VOLUME /toto

CMD npm start

EXPOSE 3000

  • now run again the creation of a container:

    sudo docker create -p 3000:3000 --name="wonderful_hellonode" -v /tmp:/toto hellonode
    
  • start it:

    docker start wonderful_hellonode

  • verify that the volume is mounted:

    sudo docker exec -it wonderful_hellonode  bash
    cd /toto
    ls
    

Using journalctl

go in /etc/docker edit a daemon.json with

{
"debug": true,
"log-driver": "journald"
}

build an image

a Dockerfile must be present

docker build -t hellonode .

create the container

docker create -p 3000:3000 --name="wonderful_hellonode" hellonode

launch it:

docker start wonderful_hellonode

stop it:

docker stop wonderful_hellonode

example:

sudo docker run -p 8088:8088 -v /pysaml2-sp/env:/home/gwen/config -e DATA_DIR=/home/gwen/config pysaml2-sp

Docker compose basics

docker-compose up
docker-compose down
docker-compose up -d --build # daemon mode + build
docker-compose -f <filename.yml> -f <filenamelocal.yml> up
    docker-compose -f docker-compose.dev.yml logs -f  # showing logs in daemon mode
    docker-compose -f docker-compose.dev.yml up <name> # lauching only one container
docker-compose -f docker-compose.dev.yml exec <name> /bin/sh # into the <name> container
    docker-compose run client python manage.py
    docker-compose -f docker-compose.dev.yml stop <name> # stoping container

The -d option stands for daemon mode (in production mode)

you can use all the commands of docker :

docker-compose inspect
docker-compose top
  • docker-compose down : suppresses the dockers vms, the volumes and the network
  • docker-compose stop : doesn’t suppress anything