Un monde d'octets

Aller au contenu | Aller au menu | Aller à la recherche

lundi, juin 12 2023

Image docker d'analyse réseau

docker pull praqma/network-multitool

Peux s'utiliser en contexte kube en étant lancé dans le même namespace que le pod à contacter.

jeudi, octobre 28 2021

Docker : one liners

Détruire tous les containers exited

docker rm $(docker ps -qa --filter "status=exited")

vendredi, octobre 22 2021

Compter les containers docker par réseaux docker (oneliner)

docker network inspect $(docker network ls -q)| jq '.[]|(.Name + " " + ((.Containers | length)|tostring))' -r

mercredi, octobre 13 2021

Podman & Docker

Docker est le plus connu des systèmes de container. mais Podman est une alternative poussée par Openshift, le système de clustering de Redhat. Quelques différences sont à connaitre.

Les registries

Docker sait ou chercher des l'installation. Podman non.

Il faut éditer le fichier /etc/containers/registries.conf et y ajouter :

[registries.search]
registries = ["registry.access.redhat.com", "quay.io"]

Si votre registry ne supporte pas https :

[registries.insecure]
registries = ['localhost:5000']

vendredi, janvier 29 2021

Docker : one line killer for all exited container

docker ps --filter status=exited | awk '{if (NR>1) print $1}' | xargs docker rm

jeudi, novembre 5 2020

Docker and humans

La césure des lignes dans un docker ps m'ennuie toujours. J'aime donc reformater l'output :

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Ports}}"

Bien sur il existe d'autres formats de sorties (comme json) permettant de "verticaliser" l'output :

docker container ls --format='{{json .}}' | jq

Ce qui est bien pratique, car ca nous donne tous les champs utilisables dans format "table". Bien sur, tout cela est moins puissant que la syntaxe go, mais c'est une autre histoire...

mardi, octobre 13 2020

Docker Registry

Pour mes travaux perso, publier sur mon docker hub perso est plutot contraignant. Il était largement temps de faire une simplissime docker registry pour ces besoins ponctuels.

Lancer la registry avec le container docker fourni par le docker hub est trivial :

docker run --restart always \
           -p 5000:5000 \
           --name registry \
           registry:2

Puis pour uploader une image docker ubuntu sur notre registry :

docker pull ubuntu
docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu

mercredi, septembre 16 2020

Docker : erreur de crédentials

Après avoir joué avec gcloud, pour travaux kubernetes, il peut arriver qu'on ai le probleme suivant :

docker.credentials.errors.InitializationError: docker-credential-gcloud not installed or not available in PATH

En fait, il s'agit d'un reliquat de configuration présant dans .docker/config.json :

{
  "credHelpers": {
    "gcr.io": "gcloud", 
    "us.gcr.io": "gcloud", 
    "eu.gcr.io": "gcloud", 
    "asia.gcr.io": "gcloud", 
    "staging-k8s.gcr.io": "gcloud", 
    "marketplace.gcr.io": "gcloud"
  }
}

Il suffit donc de supprimer les références à gcloud, ou plus simplement détruire le fichier si il n'y a rien d'autre.

samedi, septembre 5 2020

Ctop

ctop permet devoir l'utilisation des containers en cpu, mem, etc.

il permet de ce faire de vérifier que vos limites positionnées sont respectées.

il peut s'installer avec apt, mais aussi tourner dans un container docker pour ne nécessiter aucune installation locale :

sudo apt install ctop
docker run --rm -ti \
  --name=ctop \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  quay.io/vektorlab/ctop:latest

A vous de choisir !

dimanche, mai 10 2020

Docker 100% cpu ... traefik coupable ?

Ce jour, un docker qui prend 100% de cpu sur un front web, c'est très probablement lié aux logs …

Purger les logs de traefik avec la commande truncate :

truncate -s 0 $(docker inspect --format='{{.LogPath}}' traefik) %%%

Ca semble régler le problème. Il faudrait voir tout ce qui est loggué, car il y'a surement beaucoup d'inutile ....

Une solution de mitigation, est d"activer une rotation de logs avec docker :

Pour cela, il suffit de modifier le /etc/docker/daemon.json comme suit,

{
   "live-restore": true,
   "log-driver": "json-file",
   "log-opts": {"mode": "non-blocking", "max-file": "7", "max-size": "2G"}
}

Dans le cas présent, la rotation a lieu des que le fichier de log atteint 2 gigas, et seuls les 7 derniers fichiers seront gardé. Ce qui veut dire que pour nos services, chacun à un max de log possible de 14go.

Cette valeur arbitraire est ici assez importante, mais cela est du au fait que seul traefik est présent en container sur ce serveur.

Dans un cas de production, il vaudrait mieux avoir une valeur de base faible, et des options locales au container pour ceux nécessitant plus.

Cela peut se faire au niveau de l'orchestrateur (kubenertes, mesos, ...)

vendredi, mai 1 2020

Docker et X11

Je dois avouer que même si j'aime beaucoup lxd pour certaines taches, docker dispose d'un écosystème plus riche.

Exemple : firefox dans un container en rattachant l'environnement X11 de l'hôte :

docker run -ti --rm \
       -e DISPLAY=$DISPLAY \
       -v /tmp/.X11-unix:/tmp/.X11-unix \
       firefox

Dans la foulée, noté d'une vidéo de la super jolie et géniale Jessie Frazelle :

docker run -d -v /etc/machine-id:/etc/machine-id:ro -v /var/run/dbus:/var/run/dbus -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY --device /dev/dri --device /dev/snd <CONTAINER>

mardi, avril 21 2020

Docker et Iptables, Round 2

Pour firewaller des container dockerisés, mettre des règles sur le port mappé ne fonctionne pas. En effet, la règle de nat court-circuite la chaine INPUT et envoie le packer sur les chaines DOCKER-*

Pour firewaller, il faut donc utiliser la chaine DOCKER-USER, en réspectant :

  • Il faut insérer avant l'unique règle qui laisse tout passer
  • Il faut utiliser le port dans l'environnement containérisé car nous ne somme plus dans le contexte hôte

C'est bien pensé, ca marche, mais c'est tout sauf évident. Enfin bon, c'est bien pensé et ca marche, mais si on peut s'en passer (par exemple en n'exposant pas le port, ou au moins pas 100% publiquement, on peut s'affranchir de complexifier l'iptables).

Docker Runlike

Retrouver les paramètres d'un container

Un outil qui m'a été conseillé et qui est véritablement utilie, c'est RUNLIKE. il s'installe avec pip :

pip install runlike

ou se lance directement dockérisé

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

mercredi, avril 8 2020

Monitoring Docker par Inception !

Il existe beaucoup d'outils utilisant la socket de docker pour administrer docker et proposer des cui et gui très intéressantes

Analyse d'un container :

docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    wagoodman/dive:latest <dive arguments...>

Monitoring curses :

docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock lazyteam/lazydocker
docker run --rm -ti \
  --name=ctop \
  --volume /var/run/docker.sock:/var/run/docker.sock:ro \
  quay.io/vektorlab/ctop:latest

WebUI :

docker volume create portainer_data 
docker run -d -p 9000:9000 -p 8000:8000 \
   --name portainer --restart always \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v portainer_data:/data portainer/portainer

mercredi, février 26 2020

Docker - PID des containers

lister les containers et leurs PID (pour chercher un gros consommateur cpu)

docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}'

lundi, août 26 2019

Installation de Jenkins via docker

Installation de docker

apt install docker.io docker-compose:w

Récupération de l'image de Jenkins

docker pull jenkins/jenkins

Trouver l'emplacement des fichiers de docker:

docker info | grep Root

Docker Root Dir: /var/lib/docker

Création d'un docker-compose

vi docker-compose.yml

version: "3"
services:
   jenkins:
      container_name: alfred
      image: jenkins/jenkins
      ports:
         - "8080:8080"
      volumes:
         - "/srv/jenkins:/var/jenkins"
      networks:
         - net
   networks:
      net: 

Il est nécessaire créer le home de jenkins :

mkdir /srv/jenkins

Ainsi nous avons sur le serveur hébergeant les containers, un volume pour le container jenkins

mercredi, avril 10 2019

Docker : petites recettes

Renommer un container

docker rename <container_name> <new_name>

Obtenir l'ip d'un container depuis l'hôte :

docker inspect -f 'range .NetworkSettings.Networks.IPAddressend' <container_name_or_id>

vendredi, mars 1 2019

Docker : Exited since 5d ...

Dans un contexte d'ordonnanceur externe à docker, comme kubernetes, la vie d'un container n'est pas éternelle, et même pire, elle peut être très courte (selon le cycle de développement du service proposé).

Il n'est donc pas rare de voir sur les nodes des container qui sont en état "Exited since ...". Ces container peuvent correspondre à des suppression de pods et services, puis à la récréation de ceux-ci, ce qui peut nous donner de jolis semis doublons lors d'un :

docker ps -a

Kubernetes ne fait pas le ménage sur les nodes, ni meme sur le controlleur, exemple :

root@Krilin:~$ docker ps -a | grep weave
776a6b33278f        1f394ae9e226           "/home/weave/launch.…"   4 minutes ago            Exited (1) 4 minutes ago                                k8s_weave_weave-net-vzv6m_kube-system_6d5bf007-31d6-11e9-8af5-e094673af96c_3348
a7714ac685e7        789b7f496034           "/usr/bin/weave-npc"     13 hours ago             Up 13 hours                                             k8s_weave-npc_weave-net-vzv6m_kube-system_6d5bf007-31d6-11e9-8af5-e094673af96c_3
b823cbb9669c        k8s.gcr.io/pause:3.1   "/pause"                 13 hours ago             Up 13 hours                                             k8s_POD_weave-net-vzv6m_kube-system_6d5bf007-31d6-11e9-8af5-e094673af96c_3
467b8f9b7802        789b7f496034           "/usr/bin/weave-npc"     14 hours ago             Exited (1) 13 hours ago                                 k8s_weave-npc_weave-net-vzv6m_kube-system_6d5bf007-31d6-11e9-8af5-e094673af96c_2
c8309215ce8b        k8s.gcr.io/pause:3.1   "/pause"                 14 hours ago             Exited (0) 13 hours ago                                 k8s_POD_weave-net-vzv6m_kube-system_6d5bf007-31d6-11e9-8af5-e094673af96c_2

Pour nettoyer tout cela, nous pouvons faire un script shell qui cherchera le mot Exited pour ensuite faire un docker rm sur l'id du container associé, mais il restera encore a faire des "prune" sur les volumes pour que le nettoyage soit complet.

Il existe une commande plus directe dans docker :

docker system prune

rootKrilin:~$ docker system prune
WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all dangling images
        - all dangling build cache
Are you sure you want to continue? [y/N] 

Si vous repondez "y" vous voyez alors les suppressions faites :

Deleted Containers:
118d43446820ee48fbc2448f458fd310da1a2fa8e9c4288eebc687f6ead02b40
7bd02c21bd056f2206deafb8d2c1f962e460726ea5baac382326315c0200fae6
2d13ae91cd9b2c2c0a0ef6deae378da973eb09a353778c386b946143cd5da611
5c01da141458bad077f8398d235cc29aa571816d9fc377a54663fe60a7b551fa
748087e020c6a012e25a8b78321c45c86471de22f0fbc5e4e14936fa88090382
8ad02c451417f9b4c6c016b330775082b64330284ba9e4eaa20e064fb9f6cf3f
1a8bc77db31831bd0ef177d7a70b0ddafd2f1d9a69a2d7f1f504da69a15f838e
624f19e5050ced840a31e17b857071f25c30afdb46719cb28429ecb7853c2090
c2430cafa2a988cecebffb16ce7a5c90f78dc18053003dd8d6f0cdea438b8473
1796f28b9dbc1c2c31724e91d031a12eae19b1b513c168dec236005e42036969
20fcbb1c937042ef86dccd03f60f59c168947cfc0440fbc20bd99052fdb5a789

Total reclaimed space: 0B

Le 0B correspond à l'espace récupéré sur les volumes. Mais le ménage a bien été fait question reliquats de containers et d'images inutiles.

On y voit un peu plus clair, non ?

samedi, juillet 28 2018

Docker swarm 101

Depuis la verson 1.12, le mode swarm est directement disponible dans l'installation basique de docker.

Pour initialiser un essaim :

docker swarm init

il vous est alors donné la commande à exécuter sur les autres serveurs docker pour joindre l'essaim :

docker swarm join --token token ip:port

Pour voir lister les noeuds de l'essaim

docker node ls

Et en version un peu plus sommaire

docker node ls --format '.ID .Hostname .Status .TLSStatus'

Creation d'un container dans l'essaim

docker service create image_name

exemple :

docker service create --name lampadaire lamp

Lister les containers présents

docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
121fg1dd9xq2        lampadaire          replicated          1/1                 lamp:latest         

En lançant une deuxième fois un "create" sur l'essaim, on voit avec un "ls" que le container est placé sur l'autre noeud :

ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
121fg1dd9xq2        lampadaire          replicated          1/1                 lamp:latest         
ycg88kgulcmd        lamproie       replicated          1/1                 lamp:latest         

mais on voit que les deux ne sont pas en situation de replicas entre eux.

Nous pouvons updater les ports publiés ou d'autres informations :

docker service update --publish-add 80 lampadaire

Chose interressante, le forwarding de port est disponible sur les deux noeuds a l'identique, quelque soit le noeud qui héberge.

Modifier le nombre de replicas

docker service scale eager_benz=REPLICAS_NUMBER

lundi, mars 12 2018

Docker compose pour Wekan

Wekan est une implémentation libre en node-js d'un kanban !
Pour héberger un container docker Wekan chez vous, voici un docker compose récupéré sur internet :

version: '2'
services:
  wekan:
    image: wekanteam/wekan:latest
    links:
      - wekandb
    environment:
      - MONGO_URL=mongodb://wekandb/wekan
      - ROOT_URL=http://localhost:80
    ports:
      - 80:80

  wekandb:
    image: mongo:3.2.14
    volumes:
      - /srv/wekan/data:/data/db

le répertoire /srv/wekan/data contiendra les données à backuper de votre kanban.
il sera accessible a http://localhost/

Personnellement je conseillerai pltot d'annuler le redirect de ports, et de faire sur l'hote englobant un reverse proxy qui mappe le http://ip-du-container:80/ en http[s]://localhost/wekan/

samedi, octobre 28 2017

Openldap 2.4 Dockerisé tout automatique !

Voici le dockerfile :

FROM ubuntu:latest

RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt-get update && apt-get install -y apt-transport-https

RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN chmod 755 /var/run/sshd
COPY ssh/id_rsa.pub /root/.ssh/authorized_keys

RUN apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor

ENV PASS "maypoass"
ENV DOMAIN "mapetiteentreprise.fr"
ENV ORG "Ma Petite Entreprise"

RUN echo "slapd slapd/internal/adminpw password $PASS" | debconf-set-selections
run echo "slapd slapd/internal/generated_adminpw password $PASS" | debconf-set-selections
run echo "slapd slapd/password2 password $PASS" | debconf-set-selections
run echo "slapd slapd/password1 password $PASS" | debconf-set-selections
run echo "slapd slapd/dump_database_destdir string /var/backups/slapd-VERSION" | debconf-set-selections
run echo "slapd slapd/domain string $DOMAIN" | debconf-set-selections
run echo "slapd shared/organization string $ORG" | debconf-set-selections
run echo "slapd slapd/backend string HDB" | debconf-set-selections
run echo "slapd slapd/purge_database boolean true" | debconf-set-selections
run echo "slapd slapd/move_old_database boolean true" | debconf-set-selections
run echo "slapd slapd/allow_ldap_v2 boolean false" | debconf-set-selections
run echo "slapd slapd/no_configuration boolean false" | debconf-set-selections
run echo "slapd slapd/dump_database string when needed" | debconf-set-selections

RUN apt-get install -y slapd ldap-utils

COPY entry-point.sh /entry-point.sh
RUN chmod -R 755 /entry-point.sh

EXPOSE 22 389

CMD ["/entry-point.sh"]

Les informations de mot de passe, domain et organisation sont passé par variables d'environnment docker, et le compte admin est cn=admin.

Aucun schéma additionnel n'est importé, ce sera pour ne prochaine fois. Il n'y a pas non plus de TLS activé. C'"est vraiment du openldap de base :)

mercredi, septembre 27 2017

Supervisor

Supervisor est un service pour lancer automatiquement et surveiller d'autres services. Il est donc très utile pour les containers ne disposant pas d'un boot complet et donc de scripts de démarrage des services.

Nous allons donc faire une image qui utiliser supervisor comme point d'entrée du container.

Pour commencer, créons un container avec le Dockerfile suivant :

FROM ubuntu:latest
RUN apt-get update && apt-get install -y supervisor
RUN apt-get install -y apache2
RUN mkdir -p /var/log/supervisor
COPY apache2.conf /etc/supervisor/conf.d/apache2.conf
COPY entry-point.sh /entry-point.sh
RUN chmod -R 755 /entry-point.sh
CMD ["/entry-point.sh"]

Dans le fichier apache2.conf, nous avons mis la configuration de lancement d'apache suivante :

[program:apache2]
command=/usr/sbin/apache2ctl -DFOREGROUND
autostart=true
autorestart=true
startretries=3

Enfin le script entry-point.sh lance simplement supervisor en mode no-deamon :

#!/bin/sh

/usr/bin/supervisord -n

Compilons l'image :

docker build -t pepiniere .

Créons notre container :

docker create --name testdrive pepiniere

Puis nous pouvons constater que le container testdrive (qui a ici l'ip 172.17.0.3) fait bien tourner apache !!

curl -I http://172.17.0.3

Voila, nous avons un container docker testdrive qui fait tourner un apache2 !

L'entry-point et supervisor étant fonctionnels, il reste maintenant à faire des container de bases, pour industrialiser les déploiements, par exemple :

  • une image wordpress
  • une image apache+php+mysql
  • une image elastiksearch+kibana+logstash
  • une image ubuntu de base

Bien sur chacune de ses images aura un prérequis : le fonctionnement d'ansible et la mise en place des clefs ssh initiales nécessaires ! Ansible pourra se charger de la mise en place et révocation des clefs ssh des utilisateurs additionnels.

Docker, Ansible et service start

Une problématique classique sur docker est le lancement des services au démarrage du container, qui nécessite l'écriture d'un script complet et avancé ....

Aujourd'hui j'ai réfléchi à une solution simple basée sur Ansible. Sur un container créé à partir d'une ubuntu/latest, j'ai exécuté (dans un docker exec -t -i <container> bash) les commandes suivantes :

apt update
apt install openssh-server python
cd /root
mkdir .ssh
cat > .ssh/authorized_keys

et j'ai copié la clef ssh du compte administrateur. Je démarre ensuite openssh comme suit :

docker exec <container> -t -i "bash" /etc/init.d/ssh start

Puis à l'aide du playbook suivant et du fichier hosts contenant l'ip du container :


- hosts: all

 tasks:
 - name: ensure apache is running (and enable it at boot)
   service: name=apache2 state=started enabled=yes


Nous pouvons démarrer apache2 avec un simple

ansible-playbook ensure.yml -i hosts

Et voila !

Nous pouvons donc écrire un script de démarrage de hote qui lancerait ssh pour chaque container, et exécuterai le playbook dans la foulée.

Ce n'est qu'une idée de base artisanale. Il serait préférable que le serveur ssh soit lancé automatiquement, puis que le playbook soit lancé régulièrement pour s'assurer que le reste des services sont up ....

Pour des container de type apache + mysql, c'est une solution fonctionnelle et suffisante, mais bien sur inférieure à la véritable écriture d'un script de démarrage.

Elle à cependant l'avantage de faire en sorte que si le service interne au container meurt sans entrainer un restart du container, alors ansible pourras essayer de le relancer !

Du pour et du contre, donc ...

Cependant, la solution que tous les packagers de container utilisent c'est supervisor ! Un prochain post à venir donc ;)

lundi, août 21 2017

Docker et iptables ...

Pour que le réseau des containers Docker fonctionne, il faut de la translation d'adresse. Docker fait donc le travail tout seul au lancement ... Cependant si vous avez déjà paramétré iptables sur votre poste, Docker va court-circuiter tout ça sans vous prévenir.

Il faut donc dire a docker de ne pas toucher au firewall.

Pour cela, ajouter dans le fichier /etc/default/docker la ligne :

DOCKER_OPTS="--iptables=false"

Docker ne placera plus de règles iptables lui même. Mais vos containers n'ont plus accès à internet ....

Pour rétablir leur accès, voici ce qu'il faut ajouter deux règles iptables :

la première fait une translation d'adresse sortante, en mappant votre réseau Docker sur votre ip sortante de votre hôte docker, exemple :

-A POSTROUTING -s 172.16.0.0/16 ! -o docker0 -j SNAT --to-source 10.0.0.1

la deuxième règle autorise votre interface docker0 à se connecter à votre réseau local :

-A INPUT -i docker0 -j ACCEPT

Attention au placement de ces règles dans votre firewall, car rappel : la première règle qui correspond est appliquée !

Voila c'est tout ce qu'il faut savoir pour avoir un docker fonctionnel, tout sage qui ne parasite pas son hôte. Bien sur, il faut adapter et étendre ce concept à votre plan ip de containers et même aux différents types de réseaux docker que vous utilisez.

lundi, juillet 24 2017

Changer son range IP dans docker

Docker utilise par defaut 172.17.0.0/16 comme range pour l'interface Docker0 et pour les container. Mais si ce range entre en collision avec votre réseau local, vous pouvez le changer comme suit :

Editer le fichier /etc/docker/daemon.json, et y mettre les lignes :

{
"bip": "172.26.0.1/16"
}

Puis relancer docker avec la commande :

service docker restart

Attention, cela relance les containers actifs qui changeront donc d'ip conformément au nouveau pool.

samedi, juillet 1 2017

Dockeristation de Cacti

Cacti est un bon outil de monitoring réseau, mais l'installation et le paramétrage lors de la reinstallation complète du pc est une épine dans le ....

Historiquement, j'aurai opté pour une machine virtuelle, mais maintenant, docker est bien plus séduisant, d'autant plus qu'il existe des images de cacti déjà faites pour docker !

Récupération de l'image docker de base et démarrage

docker pull quantumobject/docker-cacti
docker create -t -i --name cacti --dns=8.8.8.8 --restart unless-stopped quantumobject/docker-cacti
docker start cacti

L'ip du container cacti s'obtient ainsi :

echo "cat /etc/hosts" | docker exec -i cacti bash

127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet, par exemple figer l'ip et parametrer les dns avec les options suivantes 
ff00::0	ip6-mcastprefix, par exemple figer l'ip et parametrer les dns avec les options suivantes
ff02::1	ip6-allnodes.1.3.6.1.4.1.2021.52
ff02::2	ip6-allroutersf5e91448b6d2
172.17.0.2	f5e91448b6d2castorama

ici, f5e91448b6d2 est l'identiant du container cacti. Nous pouvons donc nous connecter a http://172.17.0.2 et nous arrivons sur l'interface de cacti !

Une fois notre cacti paramétré, il reste à en faire une nouvelle image de container puis à faire un tar pour archivage !

docker stop cacti
docker commit cacti teknomage/cacti
docker save teknomage/cacti -o docker-cacti.tar

Nous pouvons alors, sur un autre serveur, reimporter l'image et recréer le container comme suit :

docker load -i teknomage.cacti.tar
docker create -t -i --name raster --restart unless-stopped teknomage/cacti
docker start raster

Une fois l'ip de raster determinée, une connection à http://{ip} nous montre bien notre cacti tout paramétré et meme avec l'état des graphes au moment du commit.

mercredi, juin 21 2017

Docker 101

Ce petit post pour conserver les commandes basiques de docker :

Ramener l'image "debian" depuis les dépots

docker pull debian

Creer une machine virtuelle a partir de l'image debian

docker create -t --name balthazar debian

"-t" permet de créer un pseudo-tty, sans quoi le process initial "bash" se termine tout de suite et le container s'arrête quelques secondes après avoir été lancé.

Démarrer le container

docker start balthazar

Executer un bash dans le container

docker exec -t -i balthazar "bash"

Vous pouvez maintenant modifier le container, ex:

apt update
apt install ssh
apt install vim
apt install net-tools
password root

Une fois vos modifications faites, quittez avec ^D. Les modifications faites sont dans le container, et non pas dans l'image debian.

Créer une image du container

docker commit creche balthazar

Créer un nouveau container depuis l'image creche

docker create -t --name gaspard creche
docker start gaspard

La nouvelle image gaspard contient maintenant elle aussi le demon sshd (qui n'est pas lancé automatiquement), vim et les net-tools. La suite consiste ensuite a modifier le containter pour y créer un script de démarrage complet. Puis faire un "commit" et de la nouvelle image, générer de nouveaux container qui utiliseront ce script comme point d'ancrage.