Un container c'est donc
Aussi proche que possible d'une installation linux standard mais qui s'exécute sur le kernel hÎte
Dockerfile décrit la construction d'une
image
process et s'arrĂȘte
avec lui
writableread-only
Taille de l'image (virtual size)
Stockage dans /var/lib/docker/image et /var/lib/docker/containers
| Commande | ça fait quoi? |
|---|---|
| docker image build | Construit une image Ă partir d'un Dockerfile |
| docker container create IMAGE | Instancie un container Ă partir d'une image |
| docker container start / docker container stop | Démarre/ArrÚte un container |
| docker container run IMAGE | Instancie un container à partir d'une image, et le démarre |
| Commande | ça fait quoi? |
|---|---|
| docker container logs CONTAINER | Affiche les logs d'un container (stdout+stderr) |
| docker container exec CONTAINER CMD | Exécute une commande dans un container existant |
| docker container diff CONTAINER | Affiche les modifications du filesystem du container |
| docker container update [OPTIONS] CONTAINER | Modifie les options d'un container existant (mem/cpu/restart...) |
Commandes de management
| Commande | ça fait quoi? |
|---|---|
| docker image ls | Liste les images disponibles |
| docker container ls [-a] | Liste les containers running (-a : tous les containers) |
| docker container rm CONTAINER | Supprime un container |
| docker image rm IMAGE | Supprime une image |
Commandes de management
| Commande | ça fait quoi? |
|---|---|
| docker image pull IMAGE | Télécharge une image depuis un registry |
| docker image push IMAGE | Envoie une image dans un registry |
Commandes de monitoring
| Commande | ça fait quoi? |
|---|---|
| docker [container|image] inspect [ID] | Affiche les infos d'une image ou d'un container |
| docker image history [IMG] | Affiche les layers d'une image |
| docker events | Affiche les events (création/suppressions...) |
| docker stats [CONTAINER] | Affiche les stats d'un container |
Démarre un container : RUN = CREATE + START
# Nommer un container
$ docker container run --name monServer nginx # Nomme le container
# Exécute un nouveau container et y attache le terminal
$ docker container run -it ubuntu
# Lancer un container en arriĂšre plan (detached)
$ docker container run -d nginx
# Expose les ports d'un container en automatique (ports aléatoires)
$ docker container run -P nginx
# Exposer un port particulier vers un port de l'hĂŽte
$ docker container run -p 9876:80 nginx
$ docker container run -p 7894:80 -p 1234:443 nginx
# Monte un fichier ou répertoire local dans le container (volume)
$ docker container run -v test.conf:/etc/nginx/nginx.conf -p 4561:80 nginx
# Démarre un container et exécute la commande donnée
# (surcharge la commande par défaut)
$ docker container run nginx cat /etc/nginx/nginx.conf
Exécute un processus dans un container 'running'
# Démarre un shell interactif dans un container
$ docker container exec -it nginx bash
# liste les variables d'environnement d'un container
$ docker container exec nginx printenv
# Affiche le contenu d'un fichier dans le container
$ docker container exec nginx cat /etc/nginx/nginx.conf
Commandes principales
| Instruction | ça fait quoi? | exemple |
|---|---|---|
| FROM | Image parente | FROM ubuntu |
| RUN | Exécute une commande | RUN apt-get install maven |
| COPY | Copie des fichiers dans l'image | COPY myApp.jar /app |
| CMD | Indique la commande qui sera exécutée par les conteneurs | CMD ["/bin/echo", "hello world"] |
Commandes principales
| Instruction | ça fait quoi? | exemple |
|---|---|---|
| ENV | Variable d'environnement | ENV MVN_HOME=/app/maven |
| LABEL | Ajoute une méta-donnée à l'image | Label maintainer="julien@codeka.io" |
| EXPOSE | Marque un port Ă exposer | EXPOSE 8080 |
| VOLUME | Marque un répertoire comme persistant | VOLUME /app/data |
Commandes principales
| Instruction | ça fait quoi? | exemple |
|---|---|---|
| WORKDIR | Modifie le répertoire courant | WORKDIR /opt |
| HEALTHCHECK | Permet de paramétrer le healthcheck des conteneurs | HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ |
Exemple de Dockerfile simple:
FROM ubuntu:latest # image parente
ENV MESSAGE="Julien"
CMD echo Hello $MESSAGE # commande à exécuter au lancement d'un container
$ docker image build -t codekaio/helloworld .
docker image build permet de construire une image.
-t permet de lui donner un tag.
. indique le répertoire de construction.
$ docker build -t /helloworld .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu
latest: Pulling from library/ubuntu
d5c6f90da05d: Pull complete
1300883d87d5: Pull complete
c220aa3cfc1b: Pull complete
2e9398f099dc: Pull complete
dc27a084064f: Pull complete
Digest: sha256:34471448724419596ca4e890496d375801de21b0e67b81a77fd6155ce001edad
Status: Downloaded newer image for ubuntu:latest
---> ccc7a11d65b1
Step 2/3 : ENV MESSAGE Julien
---> Running in 41b69f00b536
---> d74968af6efa
Removing intermediate container 41b69f00b536
Step 3/3 : CMD echo Hello $MESSAGE
---> Running in 1f52994bd3f4
---> 8ce84b0a2112
Removing intermediate container 1f52994bd3f4
Successfully built 8ce84b0a2112
Successfully tagged codekaio/helloworld:latest
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
codekaio/helloworld latest 8ce84b0a2112 About a minute ago 120 MB
ubuntu latest ccc7a11d65b1 2 weeks ago 120 MB
$ docker container run codekaio/helloworld
Hello Julien !
FROM node:latest # image parente
RUN mkdir /app # Création du répertoire
COPY . /app # Copie de tout le contexte dans le répertoire
WORKDIR /app # On se positionne dans le répertoire
RUN npm install -P # Installation des dépendances applicatives
CMD ["npm", "run"] # Commande de lancement de l'application
Permet d'indiquer le contexte du build (quels fichiers sont disponible Ă la copie)
Réduction de la taille de l'image finale
tests/
.idea/
.git/
node_modules/
target/
.editorconfig
.eslintrc
README.md
Créer une instance et obtenir l'accÚs à un shell :
$ docker version
$ docker pull hello-world:latest
$ docker container run hello-world
$ docker ps -a & docker rm <id> & docker rmi hello-world
$ docker pull nginx
$ docker container run -p 8080:80 nginx
$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ docker pull maven:alpine
FROM maven:alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN mvn install
CMD ["mvn", "spring-boot:run"]
$ docker build -t app-spring-boot .
$ docker create --name instance -p 7777:8080 app-spring-boot
$ docker container start instance
$ docker logs instance
Vous avez exécuté votre premiÚre application Spring dans un conteneur !