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 '
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
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