# docker ## concept - image: template en lecture seul pouvant créer un container - conteneur: instance d'une image ## command - telecharger une image: ` docker pull debian:$tag` - crer et lancer un container en tty ` docker run -it bash ` - arreter container: `docker stop` - démarrer containeur: `docker start` - lister tous les conteneur `docker ps -a` - delete conteneur: `docker rm 2cdc - run a commad in container: `docker exec ` - voir stdout d'un container: `docker logs` - créer et lancer un conteneur `docker run -d --name node-app -p 3000:3000 -v $(pwd):/app node:0.12.4 node /app/server.js` - -d lance en tant que daemon - --name permet de nommer le conteneur - -p associe le port au port de l'hote (1er port pour l'hote et second pour le conteneur) - -v $(pwd):/app : cette option permet de partager un dossier avec votre conteneur, ici, nous partageons le dossier courant (où se trouve notre fichier server.js) avec le dossier /app dans le conteneur (attention si vous êtes sur Mac ou Windows uniquement votre 'home' est partagé). - node:0.12.4 : l'image Docker que vous voulez utiliser. - node /app/server.js : la commande à exécuter dans le conteneur. ## dockerfile ``` #FROM permet de définir notre image de base, vous pouvez l'utiliser seulement une fois dans un Dockerfile. FROM debian #RUN permet d'exécuter une commande à l'intérieur de votre image comme si vous étiez devant un shell unix. RUN apt-get update \ && apt-get install -y curl xz-utils \ && rm -rf /var/lib/apt/lists/* RUN curl -LO "https://nodejs.org/dist/v12.2.0/node-v12.2.0-linux-x64.tar.xz" \ && tar -xJf node-v12.2.0-linux-x64.tar.xz -C /usr/local --strip-components=1 \ && rm node-v12.2.0-linux-x64.tar.xz #copy permet d'ajouter des fichiers locaux ou distants à l'intérieur de votre image, il est le plus souvent utilisé pour importer les sources de votre projet ou des fichiers de configuration. COPY package.json /app/ #WORKDIR permet de changer le répertoire courant de votre image, toutes les commandes qui suivront seront exécutées à partir de ce répertoire. WORKDIR /app RUN npm install #ajoute le répertoire a projet a l'image COPY . /app/ #ADD permet de rcupérer des source depuis un url ou d'extraire une archive #EXPOSE et VOLUME permettent respectivement d'indiquer quel port et quel dossier nous souhaitons partager. EXPOSE 3000 VOLUME /app/log #USER permet de selectionner kl'utilisateur qui lancera le service #ENTRYPOINT ["executable", "param1", "param2"] sets the command and parameters that will be executed first when a container is run. #instruction qui doit s'exécuter au lancement du conteneur CMD node server.js ``` le .dockerignore permet comme un .gitignore de ne pas inclure certain fichiers dans l'image Docker, - lancer la build du fichier: `docker build -t nomducontainer .` - -t permet de nommer l'image docker ## docker compose permet de gérer plusieur container ensemble (IaS) exemple de fichier de confid en yaml: ``` version: 3 services: #1 container postgress avec son image et ces variable d'environement postgres: image: postgres:10 environment: POSTGRES_USER: rails_user POSTGRES_PASSWORD: rails_password POSTGRES_DB: rails_db redis: image: redis:3.2-alpine rails: #lance une build en fontion du dockerfile locale build: . #n'est construit que lorsque les dependance dont ok #depends_on crée un pointage au sein du réseau créé par Docker entre conteneur depends_on: - postgres - redis environment: DATABASE_URL: 'postgres://rails_user:rails_password@postgres:5432/rails_db' REDIS_HOST: 'redis:6379' #monte le répertoire local sur /app volumes: - .:/app nginx: image: nginx:latest links: - rails ports: - 3000:80 #on ne monte ici que un fichier de configuration volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro ``` - `docker-compose up` démarre les services décrits dans docker-compose.yml et ne rend pas la main. - `docker-compose up -d` fait la même chose mais rend la main une fois que les services sont démarrés. - `docker-compose up –build` reconstruit les services avant de les lancer. - `docker-compose down` stoppe les services. - `docker-compose restart` redémarre l’ensemble des services. - `docker-compose restart nginx` redémarre un des service (ici nginx). - `docker-compose exec rails bash` fournit une console bash au sein du conteneur rails. - `docker-compose logs` retourne l’ensemble des logs des services depuis le dernier démarrage et rend la main. - `docker-compose logs -f` affiche les logs des services et continue à les « écouter » sansrendre la main. - `docker-compose logs -f rails` fait la même chose pour le conteneur rails uniquement.