Créer un conteneur Docker avec Dockerfile et le publier sur DockerHub

Après un billet sur la prise en main de Docker, en voilà un autre qui va vous détailler:

  • la création d’un conteneur
  • la modification de celui-ci
  • la publication de votre conteneur  sur le Hub de Docker

Avant d’aller plus loin commencez par vous inscrire sur DockerHub.

Un conteneur = Dockerfile

La structure

Tout est dans le titre, pour créer un conteneur il vous suffit d’un seul fichier : le Dockerfile.

On va partir d’un image qu’on a déjà utilisée, Alpine en mode officiel.

cyklo@testmachina:~$ mkdir alpine && cd alpine
cyklo@testmachina:~/alpine$ cat Dockerfile
#ckd-alpine
FROM alpine
MAINTAINER Cyklodev <support@cyklodev.com>

Pas de grande explication à avoir, le FROM prend une image existante, et le MAINTAINER permet de fournir un email de support.

La construction

Pour utiliser cette image, il faut déjà la construire.

cyklo@testmachina:~/alpine$ docker build -t cyklodev/alpine:0.0.1 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM alpine
latest: Pulling from library/alpine
627beaf3eaaf: Already exists
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
Status: Downloaded newer image for alpine:latest
 ---> 4a415e366388
Step 2/2 : MAINTAINER Cyklodev <support@cyklodev.com>
 ---> Running in 9e4a16360660
 ---> 01cb5de9b7ae
Removing intermediate container 9e4a16360660
Successfully built 01cb5de9b7ae

Bon il s’est passé plein de choses qu’on va détailler à commencer par la syntaxe:

docker build -t ACCOUNT/NAME:TAG . 

Le tag est composé du nom de votre compte sur DockerHub suivi du nom de votre conteneur séparé par un / et enfin la version de votre conteneur. Le point indique que notre Dockerfile se trouve dans le répertoire courant.
Un rapide coup d’œil aux images locales nous montre cela.

cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
cyklodev/alpine               0.0.1               01cb5de9b7ae        10 seconds ago      3.99 MB

Concernant le déroulement du build, la commande a simplement ajouter Alpine à notre conteneur. Ajoutons le pour vérifier tout cela.

cyklo@testmachina:~/alpine$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
Status: Image is up to date for alpine:latest
cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
cyklodev/alpine               0.0.1               01cb5de9b7ae        7 minutes ago       3.99 MB
alpine                        latest              4a415e366388        5 weeks ago         3.99 MB

Ça semble cohérent le poids est le même, et vraiment léger !

La modification

La première version est donc finalisée, il nous reste à la tester.

cyklo@testmachina:~/alpine$ docker run -ti cyklodev/alpine:0.0.1 sh
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ # uname -a
Linux 4514ab69ad73 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 Linux

Tout est en place pour faire notre version 0.0.2, mais un petit aparté s’impose: de manière à conserver vos différentes version de conteneur je vous conseille vivement d’utiliser un outil de versionning comme git. Cela permettra également à vos utilisateurs de voir comment votre conteneur a été crée. Cette partie ne sera pas traitée dans ce billet.
Ajoutons maintenant une commande de mise à jour dans ce conteneur.

cyklo@testmachina:~/alpine$ cat Dockerfile
#ckd-alpine
FROM alpine
MAINTAINER Cyklodev <support@cyklodev.com>
RUN apk update

Attention si vous lancez un RUN du conteneur, c’est la version 0.0.1 qui va être lancée. Il faut donc refaire un build avant toute chose.

cyklo@testmachina:~/alpine$ docker build -t cyklodev/alpine:0.0.2 .
Sending build context to Docker daemon 2.048 kB
Step 1/3 : FROM alpine
 ---> 4a415e366388
Step 2/3 : MAINTAINER Cyklodev <support@cyklodev.com>
 ---> Using cache
 ---> 01cb5de9b7ae
Step 3/3 : RUN apk update
 ---> Running in c64d1324bfe1
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
v3.5.2-39-g9f17745511 [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
v3.5.2-23-g0306a37de3 [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
OK: 7959 distinct packages available
 ---> 0b834cd92d79
Removing intermediate container c64d1324bfe1
Successfully built 0b834cd92d79

On voit que la commande est bien passée en step 3. Et cela se voit également dans la liste des images.

cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED              SIZE
cyklodev/alpine               0.0.2               0b834cd92d79        About a minute ago   5.01 MB
cyklodev/alpine               0.0.1               01cb5de9b7ae        22 minutes ago       3.99 MB
alpine                        latest              4a415e366388        5 weeks ago          3.99 MB

 

Continuons les modifications, en ajoutant un répertoire à notre conteneur:

cyklo@testmachina:~/alpine$ mkdir /cyklodev
cyklo@testmachina:~/alpine$ echo "#support@cyklodev.com" >> cyklodev/maintainer.txt
cyklo@testmachina:~/alpine$ docker build -t cyklodev/alpine:0.0.3 . 
cyklo@testmachina:~/alpine$ docker run -ti cyklodev/alpine:0.0.3 sh
Sending build context to Docker daemon 3.584 kB
Step 1/4 : FROM alpine
 ---> 4a415e366388
Step 2/4 : MAINTAINER Cyklodev <support@cyklodev.com>
 ---> Using cache
 ---> 01cb5de9b7ae
Step 3/4 : RUN apk update
 ---> Using cache
 ---> 0b834cd92d79
Step 4/4 : ADD cyklodev /cyklodev
 ---> b2269d9ddc76
Removing intermediate container 2ede9d2dfa8f
Successfully built b2269d9ddc76
/ # ls -l /cyklodev/
total 4
-rw-r--r--    1 root     root             5 Apr 10 19:55 maintainer.txt
/ # cat /cyklodev/maintainer.txt
#support@cyklodev.com

Mission accomplie, le répertoire est bien présent dans notre conteneur.

Docker Hub

Connexion

Vous devez avoir en possession votre login/password sur la plateforme DockerHub. Commencez par vous connecter.

cyklo@testmachina:~/alpine$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (): cyklodev
Password: *************
Login Succeeded

Vous pouvez retrouver cette information comme cela:

cyklo@testmachina:~/alpine$ docker info  | grep Username
Username: cyklodev

Publication (push)

Une fois le login réussi vous pouvez envoyer votre conteneur, enfin plutôt votre image ! Voyons la différence.

cyklo@testmachina:~/alpine$ docker push cyklodev/alpine:0.0.3
The push refers to a repository [docker.io/cyklodev/alpine]
5050e29b8091: Pushed
3c4ce4610249: Pushed
23b9c7b43573: Layer already exists
0.0.3: digest: sha256:15de4011899fb45bde440f5b4da3f0f472986faa5b6b15e934758befe5d0182a size: 946

Vous pouvez faire un tour sur l’interface de DockerHub pour voir le résultat.

Un peu de ménage

Maintenant que votre image est au chaud, faisons un peu de ménage dans les images locales.

cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
cyklodev/alpine               0.0.3               b2269d9ddc76        21 minutes ago      5.01 MB
cyklodev/alpine               0.0.2               0b834cd92d79        About an hour ago   5.01 MB
cyklodev/alpine               0.0.1               01cb5de9b7ae        About an hour ago   3.99 MB
alpine                        latest              4a415e366388        5 weeks ago         3.99 MB

 

La commande suivante va supprimé les images par leur ID même si une instance stoppée utilise une de ces images.

cyklo@testmachina:~/alpine$ docker rmi b2269d9ddc76
Error response from daemon: conflict: unable to delete b2269d9ddc76 (must be forced) - image is being used by stopped container f2de64d51253
cyklo@testmachina:~/alpine$ docker rmi -f b2269d9ddc76
Untagged: cyklodev/alpine:0.0.3
Untagged: cyklodev/alpine@sha256:15de4011899fb45bde440f5b4da3f0f472986faa5b6b15e934758befe5d0182a
Deleted: sha256:b2269d9ddc769bd50b0fe458861478d297471d5182769e351e970f02e4343eaf
cyklo@testmachina:~/alpine$ docker rmi -f 0b834cd92d79 01cb5de9b7ae
Untagged: cyklodev/alpine:0.0.2
Deleted: sha256:0b834cd92d792fe6f30d6c88239abe9639237008239b5d167d8f29c48fc9b8a6
Untagged: cyklodev/alpine:0.0.1
Deleted: sha256:01cb5de9b7ae248d3405e67974857d6d8e4b75922ccab58c4c8dd720e7e7a0b1
cyklo@testmachina:~/alpine$ docker rmi -f 4a415e366388
Untagged: alpine:latest
Untagged: alpine@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
Deleted: sha256:4a415e3663882fbc554ee830889c68a33b3585503892cc718a4698e91ef2a526

Vérification en listant les images locales.

cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE

Récupération (pull)

On va utiliser l’outil de recherche pour retrouver notre image.

cyklo@testmachina:~/alpine$ docker search cyklodev/alpine
NAME              DESCRIPTION             STARS     OFFICIAL   AUTOMATED
cyklodev/alpine   Alpine distro updated   0

 

Enfin téléchargeons notre image toute fraiche.

cyklo@testmachina:~/alpine$ docker pull cyklodev/alpine:0.0.3
0.0.3: Pulling from cyklodev/alpine
627beaf3eaaf: Already exists
bbff04e417c4: Already exists
8e7852599cbe: Already exists
Digest: sha256:15de4011899fb45bde440f5b4da3f0f472986faa5b6b15e934758befe5d0182a
Status: Downloaded newer image for cyklodev/alpine:0.0.3

 

cyklo@testmachina:~/alpine$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
cyklodev/alpine               0.0.3               b2269d9ddc76        38 minutes ago      5.01 MB

Avec ce nouvel article, vous êtes en mesure de construire, modifier et publier vos images Docker.

Pour marque-pages : Permaliens.

Laisser un commentaire

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