Docker Exemples

Voici plusieurs exemples de mise en place de containers avec Docker, de la simple mise en place, en passant par l’utilisation des Dockerfiles et pour finir avec docker-compose.

Simple mise en place

Mise en place de plusieurs containers dont un LAMP, un MariaDB et un PHPMyAdmin.

Container Lamp

Chercher la bonne image dans un premier temps :

1
# docker search lamp --stars=20 lamp

La commande pour installer (récupérer, déployer) une image de container sur sa machine est la suivante :

1
# docker pull tutum/lamp

Le démarrage d’un container s’effectue grâce à docker run, ce container écoute sur deux ports : le 80 pour le HTTP, le 3306 pour les connexions MySQL. On peut alors accéder à notre serveur web.

1
# docker run -d -p 80:80 -p 3306:3306 tutum/lamp

Pour donner un autre nom au container :

1
# docker run -d -p 80:80 -p 3306:3306 --name="server_lamp" tutum/lamp

Dans le cas d’une image sauvegardée :

1
# docker run -d -p 80:80 -p 3306:3306 8d876406448a

La commande netsat -petula confirmera que docker est bien à l’écoute de http et mysql :

1
2
3
# netstat -petula
tcp6 0 0 [::]:http # # [::]:* # # LISTEN root 5009827 15806/docker-proxy
tcp6 0 0 [::]:mysql # # [::]:* # # LISTEN root 5009800 15793/docker-proxy

De façon générale pour les ports :

1
# docker run -p <hôte_port1>:<container_port1> -p <hôte_port2>:<container_port2>

Entrer dans le shell de server_lamp avec l’id de statut du conteneur :

1
# docker exec -it <idcontainer> bash

ou

1
# docker run --rm -it tutum/lamp /bin/bash

Container Mariadb

Prendre la dernière image :

1
#  docker pull mariadb:latest

Créer un container :

1
#  docker run --name mariadb.01 -e MYSQL_ROOT_PASSWORD=**mypass** -d mariadb

Pour accéder au conteneur via Bash :

1
#  docker exec -it mariadbtest bash

(NOTE : ici la commande docker attach mariadb plante…)

Il faudra ensuite créer au minimum une table et la remplir

Récupération de l‘@ip de ce container :

1
2
#  docker inspect --format "{{.NetworkSettings.IPAddress}}" mariadb.01
172.17.0.2

Communication depuis un autre container docker

Script php pour se connecter à la base :

1
2
3
4
5
6
7
8
9
10
11
12
Print("Resultat d'une requete SQL sur MariaDB placee dans un autre container Docker</br>");
try {
dbh = new PDO('mysql:host=172.17.0.2;dbname=mariadbdocker','aline','PaSsWoRd');
foreach($dbh->query('SELECT * from users') as $row) {
print_r($row);
Print("</br>");
}
dbh = null;
} catch (PDOException $e) {
print "Erreur !: " . $e->getMessage() . "<br/>";
die();
}

Container PhpMyAdmin

On récupère l’image :

1
#  docker pull phpmyadmin/phpmyadmin

Récupération de l‘@ip du container de la base de données :

1
2
#  docker inspect --format "{{.NetworkSettings.IPAddress}}" mariadb.01
172.17.0.2

On créé un container :

1
2
#  docker run --name phpmyadmin.01 -d -e PMA_HOST=172.17.0.2 -p 8080:80 phpmyadmin/phpmyadmin
# // Dépréciée // $ docker run --name phpmyadmin.01 -d --link <NAME or ID>:db -p 8080:80 phpmyadmin/phpmyadmin

Pour aller sur PHPMyAdmin on va à l’adresse : http://monsite.fr:8080

Redirection de PHPMyAdmin

Comment rediriger en monsite.fr/phpmyadmin ou phpmyadmin.monsite.com ?

Ci dessous, 4 containers dockers dont deux avec Nginx.

1/ Faire une redirection sur le DNS

Créer une nouvelle entrée DNS :

1
2
Domaine                     TTL         Type        Cible
phpmyadmin.monsite.fr. 0 CNAME monsite.fr.

2/ Faire une redirection dans le Nginx du container Nginx1

Créer un nouveau Vhost :

1
# vim /etc/nginx/sites-available/phpmyadmin.monsite.fr

Ca fonctionne, en allant sur phpmyadmin.monsite.fr on se retrouve sur monsite.fr:8080

DockerFile

Exemple de dockerfile à placer à la racine du projet.

1
2
3
4
5
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Dans la section ci-dessous d’autres exemples de Dockerfile.

Docker Compose

Faire un LAMP

Arborescence du projet.

1
2
3
4
5
6
7
8
9
10
# tree
.
├── docker-compose.yml
├── php-apache
│ └── Dockerfile
└── www
├── index.php
└── index.html

2 directories, 3 files

Contenu de docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: '3'
services:
php-apache:
build:
context: ./php-apache
ports:
- 80:80
volumes:
- ./www:/var/www/html
links:
- 'mariadb'

mariadb:
image: mariadb:10.1
volumes:
- mariadb:/var/lib/mysql
environment:
TZ: "Europe/Rome"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_ROOT_PASSWORD: "rootpwd"
MYSQL_USER: 'testuser'
MYSQL_PASSWORD: 'testpassword'
MYSQL_DATABASE: 'testdb'

volumes:
mariadb:

Contenue de /php-apache/Dockerfile

1
2
3
FROM php:7.2.1-apache
MAINTAINER Me theanonymous
RUN docker-php-ext-install pdo pdo_mysql mysqli

Contenue de /www/index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php 

Print("<hr> Resultat d'une requete SQL sur MariaDB placee dans un autre container Docker<hr>");

try {
$dbh = new PDO('mysql:host=mariadb;dbname=testdb','testuser','testpassword');

// Creation d'une table et remplissage
$dbh->query('
DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users (
nom text NOT NULL,
age int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO users (nom, age) VALUES
("Gromulaire", 108),
("RigroBummid", 82),
("john", 32),
("Marwela", 26);');

// Affichage du contenu de la table user
foreach($dbh->query('SELECT * from users') as $row) {
print_r($row);
Print("</br>");
}

} catch (PDOException $e) {
print "Erreur !: " . $e->getMessage() . "<br/>";
die();
}

phpinfo();

?>

Pour lancer le docker-compose :

1
2
# docker-compose up
# docker-compose up -d

Faire un LEMP

Arborescence du projet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#tree
.
├── docker-compose.yml
├── nginx
│ └── monsite.conf
├── php
│ └── Dockerfile
└── www
├── a.html
├── b.php
├── index.html
├── index.php
└── request.php

3 directories, 8 files

Contenus de docker-compose.yml

Note : les links ne sont pas nécessaire pour des containers dans le même réseau et il n’est plus utile de préciser les ports.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./www:/web
- ./nginx/monsite.conf:/etc/nginx/conf.d/default.conf
links:
- php

php:
#image: php:7-fpm
build: ./php
volumes:
- ./www:/web

mysql:
image: mariadb
environment:
TZ: "Europe/Rome"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_ROOT_PASSWORD: "admin"
MYSQL_USER: 'testuser'
MYSQL_PASSWORD: 'testpassword'
MYSQL_DATABASE: 'testdb'

phpmyadmin:
image: phpmyadmin/phpmyadmin
restart: always
links:
- mysql
ports:
- 8080:80
environment:
MYSQL_USERNAME: root
MYSQL_ROOT_PASSWORD: admin
PMA_HOST: mysql

Contenus de nginx/monsite.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 80;
#root /web;
#index index.php index.html;
#server_name default_server;

location / {
root /web;
index index.html index.htm;
}

location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /web$fastcgi_script_name;
}
}

Contenus de php/Dockerfile

Note : il est bien de préciser plus d’information, comme un utilisateur différent de root par exemple….

1
2
3
4
5
FROM php:7-fpm

RUN apt-get update \
&& apt-get install -y --no-install-recommends libpq-dev \
&& docker-php-ext-install mysqli pdo_pgsql pdo_mysql

Contenus de www/index.php

1
2
3
4
5
6
7
8
9
<?php 

echo "<a href='index.html'>index.html</a>";
echo "<br/>";
echo "<a href='request.php'>request.php</a";

phpinfo();

?>

Contenus de www/index.html

Note : si vous tenter d’aller sur http://MonServeur/ vous tomberez directement dans /www/index.html cependant si vous préciser la page de la façon suivante http://MonServeur/index.html vous tomberez sur la page par défaut de Nginx. Ne me demandez pas pkoi j’en sais rien.

1
2
3
4
5
6
7
8
9
<html>
<head></head>
<body>
<hr>
<h1>Hello les gens</h1>
Bonjour, le <b>HTML fonctionne</b> !!!
<hr>
</body>
</html>

Contenus de www/request.php

Note : il faut au moins au préalable avoir créé la base de données testdb avec PHPMyAdmin même si il elle ne comporte aucune table.

Pour récupérer l’adresse ip de votre container mysql il faut utiliser la commande docker inspect <Nom ou ID container>.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php

Print("<hr><b> Resultat </b>d'une requete SQL sur MariaDB placee dans un autre container Docker<hr>");

try {
$dbh = new PDO('mysql:host=172.17.0.3;dbname=testdb','root','admin');

// Creation d'une table et remplissage
$dbh->query('
DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users (
nom text NOT NULL,
age int(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO users (nom, age) VALUES
("Amon Amarth", 108),
("Svartstot", 82),
("Parasite Inc.", 32),
("Månegarm", 625);');

//$dbh = null;

// Affichage du contenu de la table user
foreach($dbh->query('SELECT * from users') as $row) {
print_r($row);
Print("</br>");
}

// $dbh = null;

} catch (PDOException $e) {
print "Erreur !: " . $e->getMessage() . "<br/>";
die();
}


phpinfo();

?>

Pour lancer le docker-compose :

1
2
# docker-compose up
# docker-compose up -d
Partager