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"
}
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 ui¶
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 networkdocker-compose stop
: doesn’t suppress anything