Screenshot

Commandes Docker

docker ps -a
docker version
docker info
docker images -a
docker images --filter "dangling=true" -q --no-trunc -a
docker ps -qa --no-trunc --filter "status=exited"
docker ps --filter status=exited -q
docker volume ls -qf "dangling=true"
docker ps -a -f status=exited
docker volume ls -f dangling=true
docker container prune
docker images | grep "<none>" | awk '{print $3}'
docker image prune
docker rmi 7375f0c6e2e8
docker container ls -as
docker image ls -a
docker images --digests
docker images --filter "dangling=true"
docker images --format "{{.ID}}: {{.Repository}}"
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
docker image prune -a
docker system df
docker system prune -a

docker system df --verbose

Ceci un tutorial que vous pouvez exécutez dans l'ordre.

Affiche la version :

docker version

Recherche en ligne dans le "repository" public :

docker search tutorial

Télécharge le "package" choisi :

docker pull learn/tutorial

Affiche les commandes disponibles :

docker list COMMANDS

La commande "docker run" prend au minimum deux arguments soit : 1) le nom d'une image 2) la commande que vous voulez exécutez à l'intérieur de l'image.

docker run learn/tutorial echo "hello world"

Exemple pour installer "ping" dans l'image nommÈe "learn/tutorial" :

docker run learn/tutorial apt-get install -y ping

Pour lister les images (containers) qui sont en cours d'exÈcution :

docker ps -l

output :

        ID                  IMAGE               COMMAND                CREATED             STATUS              PORTS
        6982a9948422        ubuntu:12.04        apt-get install ping   1 minute ago        Exit 0

Après avoir fait des modifications d'une image, il faut enregistrer/commettre (commit dans le language docker) : NB l'ID "698" dans l'exemple ci-dessous est l'ID de la commande "ps" et 3 ou 4 caractères sont suffisants.

docker commit 698 learn/ping

L'image "learn/ping" est maintenant prête, il reste à l'exécuter pour "tester" le tout :

docker run learn/ping ping google.com

Affiche de l'information utile sur une image :

docker inspect <ID>

On peut publier sur le repository nommé "Docker Hub Registry" les images que nous créons :

docker push learn/ping

Liste les images disponibles localement sur notre serveur :

docker images

---

A Dockerfile is a short recipe that describes the files, environment, and commands that make up an image. Once you've created the Dockerfile, it can be easily used with a command like: docker build -t dockerfilename

Pull the image with the command:

sudo docker pull ubuntu

Run the container with an interactive shell with the command:

sudo docker run -it ubuntu

Aliases

Many Linux admins create their own aliases for various commands. Because some Docker commands can get a bit long (or just hard to remember), it's always best to create aliases. These aliases are added to either your ~/.bashrc or ~/.bash_aliases file and can look like:

alias drm="docker rm"
alias dps="docker ps"
alias dl='docker ps -l -q'

Find a container IP Address:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID

Binding ports

docker run --name docker-nginx -p 8080:80 -d -v /docker-nginx/html:/usr/share/nginx/html nginx

Enable Docker Content Trust This feature allows you to verify the authenticity, integrity, and publication date of all Docker images available on the Docker Hub Registry. Thing is, Content Trust isn't enabled by default. Once enabled, Docker will be unable to pull down images that have not been signed. To enable this feature, issue the command:

sudo export DOCKER_CONTENT_TRUST=1

Set resource limits for your containers To limit a container to 1GB of memory, you can add the option to the run command:

-memory="1000M"
-cpus=n

Consider a third-party security tool: https://www.twistlock.com/ Use Docker Bench Security

DCIM

docker run --detach \
 --hostname dcim01.exemple.com \
 --publish 8443:443 \
 --name dcim01 \
 --restart always \
 --volume /srv/opendcim/etc/nginx:/etc/nginx
 --volume /srv/opendcim/www:/var/www \
 --volume /srv/opendcim/log:/var/log/nginx \ 
 nginx:latest

Docker Compose - exemple avec LEMP

Créer un nouveau dossier qui serviera pour l'environnement de Compose.

  mkdir <projet>-compose/
  cd <projet>-compose/

Tous les fichiers qui seront utilisé par le container doivent être mis dans ce dossier. Un fichier nommé 'docker-compose.yml' est requis par docker-compose.

Dans votre dossier '-compose', ajouter vos dossiers/fichiers et le fichier docker-compose.yml.

  touch docker-compose.yml
  mkdir -p {logs,nginx,public,db-data}
  mkdir -p ssl/certs
  mkdir ssl/private

  # logs: dossier des logs pour Nginx.
  # nginx: dossier de configuration pour Nginx.
  # public: dossier pour le contenu web, index.html, PHP, etc.
  # db-data: dossier pour MariaDB.
  # ssl: ben, pour les certifs.
 ~~~

Création des fichier de logs.
~~~bash
  touch logs/{error,access}.log

Création d'un "virtual host" dans nginx : vim nginx/apps.conf

  # EXEMPLE :
  upstream php {
    server phpfpm:9000;
  }

  server {
    server_name exemple.com;

    ssl_certificate /etc/ssl/certs/exemple.com.crt;
    ssl_certificate_key /etc/ssl/private/exemple.com.key;

    ########################################################################
    # from https://cipherli.st/                                            #
    # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
    ########################################################################
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    #
    ssl_stapling off;
    ssl_stapling_verify off;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    # Disable preloading HSTS for now.  You can use the commented out header line that includes
    # the "preload" directive if you understand the implications.
    #add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    ##################################
    # END https://cipherli.st/ BLOCK #
    ##################################

    error_log "/var/log/nginx/logs/apps-error.log";
    access_log  "/var/log/nginx/logs/apps-access.log";

    root /myapp;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
  }

Création des fichiers index.html et PHP dans dossier 'public'.

  echo '<h1>LEMP Docker-Compose</h1><p><b>Texte ici</b>' > public/index.html
  echo '<?php phpinfo(); ?>' > public/info.php

Mettre les configurations ci-dessous dans le fichier docker-compose.yml :

version: '3'
services:
  nginx:
    image: 'nginx'
    restart: always
    ports:
      - '8443:443'
    links:
      - phpfpm
    volumes:
      - ./logs/access.log:/var/log/nginx/logs/apps-access.log
      - ./logs/error.log:/var/log/nginx/logs/apps-error.log
      - ./nginx/app.conf:/bitnami/nginx/conf/vhosts/apps.conf
      - ./public:/apps
      - ./ssl:/etc/ssl

  phpfpm:
    image: 'bitnami/php-fpm'
    restart: always
    ports:
      - '9000:9000'
    volumes:
      - ./public:/apps

  mysql:
    image: 'mariadb'
    restart: always
    ports:
      - '3306:3306'
    volumes:
      - ./db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=<mot_de_passe>

Une des méthodes est avec 'docker-compose'. Note: Il faut être dans le dossier racine de votre projet avant le lancer la commande (là où se trouve docker-compose.yml).

  docker-compose up -d
  # Pour voir ce qui roule :
  docker-compose ps

OU avec 'bundle' pour rassembler tous les containers (MAIS c'est EXPÉRIMENTAL) :

  docker-compose bundle

OU La méthode style "service" est avec 'docker stack'. Note : Le mode "swarm" doit déjà avoir été lancé (à faire qu'une seule fois pour configurer le serveur).

  docker swarm init

Générer le stack en services :

  docker stack deploy -c docker-compose.yml <nom_container>
  # show :
  docker service ls

Show : ~~~bsh ls docker stack services docker container ls


Pour supprimer :
~~~bash
  docker stack rm <nom_container>

Voir les logs des containers :

  docker-compose logs

Résumé des ports :

  Externe   Interne
  8443   -> 443 pour le container Nginx
            3306 pour MariaDB
            9000 pour php-fpm

Accéder au container MariaDB via shell MySQL.

  docker-compose exec mysql bash
  mysql -u root -p

Ex. création d'une BD :

  create database demo_db;
  exit