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.
[cyklodev_summary]
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.