Docker : Le troisième pas .

Attention ceci est mon brouillon avant de faire une belle documentation sur Docker (il y a à boire et à manger). 

Maintenant on a mieux compris le système (enfin j’ai mieux compris) et l’on sait qu’il faut faire les choses dans une certain ordre (Les précédents POST n°1 et n°2 ) .

  • On a compris qu’il fallait une partition spéciale (par exemple Btrfs) pour Docker.
  • On a compris qu’il devait y avoir une version « spéciale » pour Docker sous Oracle Linux. Mais on a préféré prendre la version standard. Par exemple on doit avoir le fichier /etc/sysconfig/docker .
  • On a compris qu’il fallait avant tout faire le fichier Dockerfile
    , puis le « docker build » et « docker run« .
  • On a aussi l’option -v qui permet de faire le lien entre l’hôte et le container.
  • On a pris le risque de mettre le dernier noyau  4.1.12-32.2.3.el7uek.x86_64 , afin d’avoir la dernière version de Docker. Ce n’est jamais bon d’être sur les derniers version car on est le premier a se prendre les nouveaux problèmes.

Maintenant on va pouvoir lancer des containers en utilisant la syntaxe :

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

Car jusqu’à présent on n’a pas vu de port en écoute, c’est parce que l’on n’a pas fait le lien entre le port hôte et le port du conteneur.

Plutôt que de continuer avec HAproxy on va faire avoir PostgreSQL qui me semble plus simple à mettre en oeuvre dans un premier temps.

Je redonne les informations de mon docker :

[root@localhost ~]# docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 4
Server Version: 1.11.0
Storage Driver: btrfs
 Build Version: Btrfs v3.19.1
 Library Version: 101
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge null host
Kernel Version: 4.1.12-32.2.3.el7uek.x86_64
Operating System: Oracle Linux Server 7.2
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 739.1 MiB
Name: localhost.localdomain
ID: X7PA:FHLQ:XKJJ:IH72:P5HO:ULDH:ZMID:VGSB:KOMV:AJGF:SEY6:PTGV
Docker Root Dir: /docker
Debug mode (client): false
Debug mode (server): false
Registry: https://index.docker.io/v1/

On se lance donc dans PostgreSQL, d’abord on regarde ce qui est disponible :

[root@localhost ~]# docker search postgres
NAME                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
postgres                     The PostgreSQL object-relational database ...   1909      [OK]       
abevoelker/postgres          Postgres 9.3 + WAL-E + PL/V8 and PL/Python...   10                   [OK]
macadmins/postgres           Postgres that accepts remote connections b...   8                    [OK]
jamesbrink/postgres          Highly configurable PostgreSQL container.       5                    [OK]
linuxkonsult/postgres        A Postgres trusted build installed with Chef.   5                    [OK]
cptactionhank/postgres                                                       4                    [OK]
kampka/postgres              A postgresql image build on top of an arch...   2                    [OK]
azukiapp/postgres            Docker image to run PostgreSQL by Azuki - ...   2                    [OK]
eeacms/postgres              Docker image for PostgreSQL (RelStorage re...   2                    [OK]
icescrum/postgres            PostgreSQL image for iceScrum.                  1                    [OK]
clkao/postgres-plv8          Docker image for running PLV8 1.4 on Postg...   1                    [OK]
jgiannuzzi/postgres-bdr      Docker image for PostgreSQL with BDR support    1                    [OK]
baselibrary/postgres         ThoughtWorks Postgres & PostGIS Docker Image    1                    [OK]
travix/postgres              A container to run the PostgreSQL database.     0                    [OK]
timbira/postgres             Postgres  containers                            0                    [OK]
blacklabelops/postgres       Postgres Image for Atlassian Applications       0                    [OK]
livingdocs/postgres          Postgres v9.3 with the plv8 extension inst...   0                    [OK]
opencog/postgres             This is a configured postgres database for...   0                    [OK]
beorc/postgres               Ubuntu-based PostgreSQL server                  0                    [OK]
vrtsystems/postgres          PostgreSQL image with added init hooks, bu...   0                    [OK]
vibioh/postgres              PostgresQL Server                               0                    [OK]
coreroller/postgres          official postgres:9.4 image but it adds 2 ...   0                    [OK]
khipu/postgres               postgres with custom uids                       0                    [OK]
aheimsbakk/postgres-nosync   `postgres` docker with `synchronous_commit...   0                    [OK]
akilli/postgres              debian:jessie based PostgreSQL image            0                    [OK]

Maintenant je regarde quel est la dernière version de PostgreSQL :

FROM postgres:latest 
MAINTAINER toto toto@cyber-neurones.org 
RUN yum install postgresql && yum install postgresql-server 
RUN /etc/init.d/postgresql initdb 
# Modification de la configuration 
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

Je me lance donc dans le test de mon premier fichier ! La première étape c’est le build :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM postgres:latest
latest: Pulling from library/postgres
efd26ecc9548: Already exists 
a3ed95caeb02: Pull complete 
aef28b128f84: Pull complete 
5c6681af0d52: Pull complete 
43fd2592d569: Pull complete 
90b140d542bd: Pull complete 
9f56303d7da8: Pull complete 
75f16d91384c: Pull complete 
a7e55988e47e: Pull complete 
6980fe8c2745: Pull complete 
94512148bc3a: Pull complete 
055e85b433f4: Pull complete 
Digest: sha256:3ab14aa8758e62570f589848a93039a55c9e3ab123090c58721374d4f633ff71
Status: Downloaded newer image for postgres:latest
 ---> 0f3af79d8673
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Running in 4ee6e08a7c8c
 ---> dadadc713dfa
Removing intermediate container 4ee6e08a7c8c
Step 3 : RUN yum install postgresql && yum install postgresql-server RUN /etc/init.d/postgresql initdb
 ---> Running in 5cfa35a21346
/bin/sh: 1: yum: not found
The command '/bin/sh -c yum install postgresql && yum install postgresql-server RUN /etc/init.d/postgresql initdb' returned a non-zero code: 127

Aie le yum ne passe pas … j’ai ajouté l’option -y mais pas mieux (l’option -y permet de répondre y aux questions, c’est impératif en ligne de commande).

RUN yum install postgresql -y && yum install postgresql-server -y RUN /etc/init.d/postgresql initdb

La commande yum n’est pas dispo, on est donc sur une base Débian. On va donc faire un apt-get ! ou alors on va partir d’une base de Fédora (proche de Oracle Linux) pour avoir la commande yum.

Voici donc mon nouveau fichier :

FROM fedora
MAINTAINER toto toto@cyber-neurones.org
RUN yum install postgresql -y 
RUN yum install postgresql-server -y
RUN /etc/init.d/postgresql initdb
# Modification de la configuration
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf
# Le port en ecoute
EXPOSE 5432
# Ajout des volumes pour faire un backup
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"]
# Pour lancer postgres
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

On refait un test :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> f170274e277c
Step 3 : RUN yum install postgresql -y
 ---> Running in a8bd83110986
Yum command has been deprecated, redirecting to '/usr/bin/dnf install postgresql -y'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

Last metadata expiration check performed 0:00:47 ago on Thu Apr 14 17:50:24 2016.
Dependencies resolved.
================================================================================
 Package                Arch          Version              Repository      Size
================================================================================
Installing:
 postgresql             x86_64        9.4.7-1.fc23         updates        1.1 M
 postgresql-libs        x86_64        9.4.7-1.fc23         updates        240 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.4 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                            75 kB/s | 1.3 MB     00:18     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-libs-9.4.7-1.fc23.x86_64                         1/2 
  Installing  : postgresql-9.4.7-1.fc23.x86_64                              2/2 
  Verifying   : postgresql-9.4.7-1.fc23.x86_64                              1/2 
  Verifying   : postgresql-libs-9.4.7-1.fc23.x86_64                         2/2 

Installed:
  postgresql.x86_64 9.4.7-1.fc23       postgresql-libs.x86_64 9.4.7-1.fc23      

Complete!
 ---> 398c5e8555cb
Removing intermediate container a8bd83110986
Step 4 : RUN yum install postgresql-server -y
 ---> Running in 1dc2f23f63bd
Yum command has been deprecated, redirecting to '/usr/bin/dnf install postgresql-server -y'.
See 'man dnf' and 'man yum2dnf' for more information.
To transfer transaction metadata from yum to DNF, run:
'dnf install python-dnf-plugins-extras-migrate && dnf-2 migrate'

Last metadata expiration check performed 0:01:15 ago on Thu Apr 14 17:50:24 2016.
Dependencies resolved.
================================================================================
 Package                 Arch         Version               Repository     Size
================================================================================
Installing:
 postgresql-server       x86_64       9.4.7-1.fc23          updates       4.0 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 4.0 M
Installed size: 17 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           585 kB/s | 4.0 MB     00:07     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-server-9.4.7-1.fc23.x86_64                       1/1 
  Verifying   : postgresql-server-9.4.7-1.fc23.x86_64                       1/1 

Installed:
  postgresql-server.x86_64 9.4.7-1.fc23                                         

Complete!
 ---> 7592731d113b
Removing intermediate container 1dc2f23f63bd
Step 5 : RUN /etc/init.d/postgresql initdb
 ---> Running in 29aa04f7d09a
/bin/sh: /etc/init.d/postgresql: No such file or directory
The command '/bin/sh -c /etc/init.d/postgresql initdb' returned a non-zero code: 127

Encore un échec, mais je ne baisse pas les bras 😉 Voici ma version n°3 du fichier :

FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
RUN dnf install postgresql -y 
RUN dnf install postgresql-server -y 
RUN postgresql-setup initdb 
# Modification de la configuration 
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

Maintenant le test :

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> f170274e277c
Step 3 : RUN dnf install postgresql -y
 ---> Running in 3cbd03b57500
Last metadata expiration check performed 0:00:43 ago on Thu Apr 14 17:57:13 2016.
Dependencies resolved.
================================================================================
 Package                Arch          Version              Repository      Size
================================================================================
Installing:
 postgresql             x86_64        9.4.7-1.fc23         updates        1.1 M
 postgresql-libs        x86_64        9.4.7-1.fc23         updates        240 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.4 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                            75 kB/s | 1.3 MB     00:18     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-libs-9.4.7-1.fc23.x86_64                         1/2 
  Installing  : postgresql-9.4.7-1.fc23.x86_64                              2/2 
  Verifying   : postgresql-9.4.7-1.fc23.x86_64                              1/2 
  Verifying   : postgresql-libs-9.4.7-1.fc23.x86_64                         2/2 

Installed:
  postgresql.x86_64 9.4.7-1.fc23       postgresql-libs.x86_64 9.4.7-1.fc23      

Complete!
 ---> 3d2c98e008bc
Removing intermediate container 3cbd03b57500
Step 4 : RUN dnf install postgresql-server -y
 ---> Running in ea14d4661833
Last metadata expiration check performed 0:01:10 ago on Thu Apr 14 17:57:13 2016.
Dependencies resolved.
================================================================================
 Package                 Arch         Version               Repository     Size
================================================================================
Installing:
 postgresql-server       x86_64       9.4.7-1.fc23          updates       4.0 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 4.0 M
Installed size: 17 M
Downloading Packages:
--------------------------------------------------------------------------------
Total                                           488 kB/s | 4.0 MB     00:08     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : postgresql-server-9.4.7-1.fc23.x86_64                       1/1 
  Verifying   : postgresql-server-9.4.7-1.fc23.x86_64                       1/1 

Installed:
  postgresql-server.x86_64 9.4.7-1.fc23                                         

Complete!
 ---> 7dde38450b15
Removing intermediate container ea14d4661833
Step 5 : RUN postgresql-setup initdb
 ---> Running in 1fa62834212e
WARNING: using obsoleted argument syntax, try --help
WARNING: arguments transformed to: postgresql-setup --initdb --unit postgresql
/usr/share/postgresql-setup/library.sh: line 63: find: command not found
Failed to get D-Bus connection: Operation not permitted
Failed to get D-Bus connection: Operation not permitted
FATAL: no db datadir (PGDATA) configured for 'postgresql.service' unit
The command '/bin/sh -c postgresql-setup initdb' returned a non-zero code: 1

On va dire que l’on a encore avancé mais pas facile de trouver de la documentation claire pour l’instant. En plus du yum qui a changé en dnf, la commande l’initialisation de postgres n’est plus la même. La compatibilité ascendante c’est pour demain 😉

[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
RUN dnf install postgresql -y 
RUN dnf install postgresql-server -y 
RUN postgresql-setup --initdb --unit postgresql
# Modification de la configuration 
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> f170274e277c
Step 3 : RUN dnf install postgresql -y
 ---> Using cache
 ---> 3d2c98e008bc
Step 4 : RUN dnf install postgresql-server -y
 ---> Using cache
 ---> 7dde38450b15
Step 5 : RUN postgresql-setup --initdb --unit postgresql
 ---> Running in b4dd8e2cef49
/usr/share/postgresql-setup/library.sh: line 63: find: command not found
Failed to get D-Bus connection: Operation not permitted
Failed to get D-Bus connection: Operation not permitted
FATAL: no db datadir (PGDATA) configured for 'postgresql.service' unit
The command '/bin/sh -c postgresql-setup --initdb --unit postgresql' returned a non-zero code: 1

Je ne vais pas faire d’initdb …

[root@localhost ~]# docker build -t my-postgres .
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM fedora
 ---> ddd5c9c1d0f2
Step 2 : MAINTAINER toto toto@cyber-neurones.org
 ---> Using cache
 ---> f170274e277c
Step 3 : RUN dnf install postgresql -y
 ---> Using cache
 ---> 3d2c98e008bc
Step 4 : RUN dnf install postgresql-server postgresql-contrib -y
 ---> Using cache
 ---> 29c873629d39
Step 5 : RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf
 ---> Using cache
 ---> 4a99cf64311c
Step 6 : RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf
 ---> Using cache
 ---> 4b431bcfe6fb
Step 7 : USER postgres
 ---> Using cache
 ---> b88497ef1a95
Step 8 : ENV PGDATA /var/lib/pgsql/data
 ---> Using cache
 ---> 9272c705d631
Step 9 : EXPOSE 5432
 ---> Running in b2e4c043bc2e
 ---> a6ea2c236302
Removing intermediate container b2e4c043bc2e
Step 10 : VOLUME /etc/postgresql /var/log/postgresql /var/lib/pgsql
 ---> Running in cf06d787cecf
 ---> cffe96473050
Removing intermediate container cf06d787cecf
Step 11 : CMD /var/lib/pgsql/bin/postgres -D /var/lib/pgsql/data -c config_file=/var/lib/pgsql/data/postgresql.conf
 ---> Running in 7690289ad7cb
 ---> 1204d059861e
Removing intermediate container 7690289ad7cb
Successfully built 1204d059861e
[root@localhost ~]# cat Dockerfile
FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
RUN dnf install postgresql -y 
RUN dnf install postgresql-server postgresql-contrib -y 
# Modification de la configuration 
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
USER postgres
ENV PGDATA /var/lib/pgsql/data
#RUN initdb --data-checksums
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

Maintenant je lance :

[root@localhost ~]# docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=password -d postgres
a590ea4020c45974f68d2e9b7296d83e4176a2dca109510abd72a80b0d26fc11

[root@localhost ~]# ss -at
State       Recv-Q Send-Q                                   Local Address:Port                                                    Peer Address:Port                
LISTEN      0      128                                                  *:ssh                                                                *:*                    
LISTEN      0      100                                          127.0.0.1:smtp                                                               *:*                    
ESTAB       0      0                                         192.168.1.13:ssh                                                     192.168.1.10:62127                
LISTEN      0      128                                                 :::ssh                                                               :::*                    
LISTEN      0      128                                                 :::postgres                                                          :::*                    
LISTEN      0      100                                                ::1:smtp                                                              :::*                    
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a590ea4020c4        postgres            "/docker-entrypoint.s"   5 minutes ago       Up 5 minutes        0.0.0.0:5432->5432/tcp   postgres

Le port semble être en écoute, maintenant il me faut perfectionner la conf de PostgreSQL et installé des outils en local afin d’avoir accès à la base.

[root@localhost ~]# yum install postgresql
[root@localhost ~]# yum install telnet

Je vais donc modifier ce fichier :

FROM fedora
MAINTAINER toto toto@cyber-neurones.org 
RUN dnf install postgresql -y 
RUN dnf install postgresql-server postgresql-contrib -y 
# Modification de la configuration 
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf 
RUN echo "listen_addresses='*'" >> /var/lib/pgsql/data/postgresql.conf 
RUN echo "tcpip_socket = true" >> /var/lib/pgsql/data/postgresql.conf 
USER postgres
ENV PGDATA /var/lib/pgsql/data
#RUN initdb --data-checksums
# Le port en ecoute 
EXPOSE 5432 
# Ajout des volumes pour faire un backup 
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/pgsql"] 
# Pour lancer postgres 
CMD ["/var/lib/pgsql/bin/postgres", "-D", "/var/lib/pgsql/data", "-c", "config_file=/var/lib/pgsql/data/postgresql.conf"]

Le but étant de faire fonctionner le connexion à la base par la suite.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Time limit is exhausted. Please reload CAPTCHA.