Guide Docker

← Retour aux Labs

Commandes de base

Objectif Commande
Voir les images locales docker images
Voir les containers docker ps -a
Voir les logs d'un container docker logs <id>
Démarrer un container docker start <id>
Démarrer un container avec console docker start --attach <name>
docker run -it <moncontainer> /bin/bash
docker run --tty --interactive debian:7
Stopper un container docker stop <id>
Voir la configuration docker inspect <id>
Chercher une image en distant docker search nginx
Télécharger une image docker pull nginx
Créer et démarrer un container docker run -d --name Serveur nginx:latest
Lancer un container et le rendre accessible docker run -d -p 9876:80 --name=MonWebserver nginx:latest
Démarrer un shell sur le container docker exec -ti <id> /bin/bash
docker exec -ti MonWebserver /bin/bash
docker exec MonWebserver ls -al
Supprimer une image locale docker rmi <REPOSITORY>:<tag>
Supprimer un container docker rm <id>
Voir l'IP d'un container docker inspect <id> | grep IPAddress
Création d'image docker create --tty --interactive --name="monImage" debian:7
Supprimer tous les containers arrêtés docker rm $(docker ps -a -q)
Construire depuis un Dockerfile docker build -t myapache .

Principales directives Dockerfile :
MAINTAINER : nom et email du mainteneur
FROM : image de base (Ubuntu, Debian)
VOLUME : point de montage
RUN : commande à exécuter pour installer
ENTRYPOINT : commande au démarrage (une seule sera exécutée)
CMD : commande au démarrage
ADD : copier un fichier dans le container
USER : utilisateur qui exécute les commandes
EXPOSE : port(s) à exposer
Apache PHP docker run -d -p 81:80 -v /home/user/site:/var/www/html apache-php-dev
MySQL docker pull mysql
docker run -d -p 3306:3306 -v /home/user/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=azerty mysql

Exemple Dockerfile Apache/PHP

FROM debian:latest
MAINTAINER Radern <a@b.c>

RUN apt-get update && apt-get install -y apache2 php5 libapache2-mod-php5 php5-mysql

# Variables d'environnement
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SITE /var/www/site

RUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIR $APACHE_SITE

# Tracer toutes les erreurs PHP
RUN sed -i -e 's/^error_reporting\s*=.*/error_reporting = E_ALL/' /etc/php5/apache2/php.ini
RUN sed -i -e 's/^display_errors\s*=.*/display_errors = On/' /etc/php5/apache2/php.ini

# Configuration personnalisée
ADD ./fichier.conf /etc/apache2/sites-available/
RUN a2ensite fichier.conf
RUN a2dissite 000-default.conf
RUN a2enmod rewrite
RUN a2enmod expires
RUN a2enmod headers
RUN a2enmod cgi

EXPOSE 80
ENTRYPOINT ["/usr/sbin/apache2"]
CMD ["-D", "FOREGROUND"]

Fichier de configuration VirtualHost

<VirtualHost *:80>
  DocumentRoot /var/www/site/
  ServerName monapache
  <Directory /var/www/site>
    Options  FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>
</VirtualHost>

Docker Compose - Stack complète Apache/MySQL/PHP/PhpMyAdmin

# Pour un environnement Apache/MySQL/PHP/PhpMyAdmin
# Site en local dans le répertoire www
# Base de données locale donc persistence des données

# Container MySQL
mysql:
  image: mysql:5.7
  environment:
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: dbpassword
    MYSQL_ROOT_PASSWORD: dbrootpassword
    MYSQL_DATABASE: dbdatabase
  volumes_from:
    - datastore
  container_name: rad_mysql

# Container PhpMyAdmin
phpmyadmin:
  image: phpmyadmin/phpmyadmin
  links:
    - mysql
  environment:
    PMA_HOST: mysql
    PMA_PORT: 3306
  ports:
    - '8080:80'
  container_name: rad_phpmyadmin

# Container de stockage
datastore:
  image: busybox
  volumes:
    - /var/lib/mysql
  container_name: rad_store

# Container PHP basé sur l'image du répertoire app
php:
  build: app
  ports:
    - '80:80'
  links:
    - mysql
  volumes:
    - ./www:/var/www/site
  container_name: rad_apache

Exemples de fichiers PHP pour tester

index.php - Test de connexion

<?php
mysqli_connect("mysql", "dbuser", "dbpassword") or die(mysqli_error());
echo "Connected to MySQL<br />";
phpinfo();
?>

create.php - Création de table

<?php
echo 'CREATION<br/>';
$servername = "mysql";
$username = "dbuser";
$password = "dbpassword";
$dbname = "dbdatabase";

$conn = mysqli_connect($servername, $username, $password);

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "CREATE DATABASE $dbname";
if (mysqli_query($conn, $sql)) {
    echo "Database created successfully";
} else {
    echo "Error creating database: " . mysqli_error($conn);
}

mysqli_select_db($conn, $dbname);

$sql = "CREATE TABLE MyGuests (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
firstname VARCHAR(30) NOT NULL,
lastname VARCHAR(30) NOT NULL,
email VARCHAR(50),
reg_date TIMESTAMP
)";

if (mysqli_query($conn, $sql)) {
    echo "Table MyGuests created successfully";
} else {
    echo "Error creating table: " . mysqli_error($conn);
}

mysqli_close($conn);
?>

insert.php - Insertion et affichage

<?php
echo 'INSERTION<br/>';
$servername = "mysql";
$username = "dbuser";
$password = "dbpassword";
$dbname = "dbdatabase";

$conn = mysqli_connect($servername, $username, $password, $dbname);

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully<br/>";
} else {
    echo "Error: " . $sql . "<br/>" . $conn->error;
}

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "id: " . $row["id"]. " - Name: " . $row["firstname"]. " " . $row["lastname"]. "<br>";
    }
} else {
    echo "0 results";
}

mysqli_close($conn);
?>

Ressources :

← Retour aux Labs