docker-composeAan de slag met Docker-Compose


Opmerkingen

Compose is een hulpmiddel voor het definiëren en uitvoeren van Docker-toepassingen met meerdere containers. Met Compose gebruikt u een Compose-bestand om de services van uw toepassing te configureren. Vervolgens maakt en start u met een enkele opdracht alle services vanuit uw configuratie. Raadpleeg de lijst met functies voor meer informatie over alle functies van Compose.

Het gebruik van Compose is in feite een proces in drie stappen.

  1. Definieer de omgeving van uw app met een Dockerfile zodat deze overal kan worden gereproduceerd.
  2. Definieer de services waaruit uw app in docker-compose.yml zodat ze samen in een geïsoleerde omgeving kunnen worden uitgevoerd.
  3. Voer ten slotte docker-compose up en Compose start en voert uw hele app uit.

Maak een eenvoudige applicatie

Dit voorbeeld komt uit het officiële document. Stel dat u een python-toepassing hebt die redis als backend gebruikt. Nadat u Dockerfile , maakt u een docker-compose.yml bestand als volgt:

version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
  redis:
    image: redis
 

Dan lopen docker-compose up wil het instellen van de gehele applicatie bestaat uit: python app en herverdeling.


  • version: '2' is de versie van de syntaxis van het docker-bestand
  • services: is een sectie die de uit te voeren services beschrijft
  • web: en redis: zijn de namen van de services die moeten worden gestart, hun inhoud beschrijft hoe docker containers voor die services moet starten
  • depends_on impliceert een afhankelijkheid van web voor redis en daarom start redis -compose eerst de redis container en vervolgens de web-container. Niettemin wacht redis docker-compose niet totdat de redis container gereed is voordat de web container wordt gestart. Om dit te bereiken, moet u een script gebruiken dat de start van de applicatieserver of wat dan ook redis totdat de redis container aanvragen kan uitvoeren.

Een sectie volumes en netwerken kan ook worden toegevoegd. Het gebruik van het volume-gedeelte zorgt voor een losgekoppeld volume dat onafhankelijk van het gedeelte voor het samenstellen van de docker kan leven. Het netwerkgedeelte heeft een soortgelijk resultaat.

Het gedeelte services opnieuw bewerken zou als volgt moeten worden aangepast:

redis:
  image: redis
  volumes:
    - redis-data:/code
  networks:
    -back-tier 
 

Voeg vervolgens de volgende secties toe aan de onderkant van het dock 2-bestand.

volumes:
  # Named volume
  redis-data: 
    driver: local
networks:
  back-tier:
    driver: bridge
 

redis-data biedt een toegankelijk label uit de servicessectie. driver:local stelt het volume in op het lokale bestandssysteem.

back-tier stelt het label van de netwerksectie in als toegankelijk in de servicessectie als overbrugd.

Docker Stel hallo wereld samen

Een zeer eenvoudige docker-compose.yml ziet er zo uit:

version: '2'
services:
  hello_world:
    image: ubuntu
    command: [/bin/echo, 'Hello world']
 

Dit bestand zorgt ervoor dat er een hello_world service is, die is geïnitialiseerd vanuit de ubuntu:latest afbeelding en dat, wanneer het wordt uitgevoerd, het gewoon echo 'Hello world'

Als u zich in de folder van de folder (en het bevat dit docker-compose.yml bestand), kunt u docker-compose up en zou u moeten zien

Creating folder_hello_world_1
Attaching to folder_hello_world_1
hello_world_1 | Hello world
folder_hello_world_1 exited with code 0
 

Hiermee is de container gemaakt op basis van de ubuntu-afbeelding en is de opdracht uitgevoerd die is opgegeven op de docker-compose.yml

Docker-Compose gebruikt de mapnaam als projectnaam om containers en netwerken te prefixen. Om een andere projectnaam in te stellen, kunt u ofwel docker-compose --project-name NAME {up|down|...} noemen of u plaatst een bestand met de naam .env naast uw docker-compose.yml en schrijft COMPOSE_PROJECT_NAME=name in het. Vermijd lange projectnamen met koppeltekens (-), omdat docker bahaves vreemd samenstelt met dit soort namen.

Opmerking: met docker-compose kunt u meerdere docker-containers op één host uitvoeren. Als u meerdere containers op meer dan één knooppunt wilt uitvoeren, raadpleeg dan een oplossing zoals zwerm / kubernetten.

Docker Compose installeren

  1. Installeer Docker Engine .

Als u een foutmelding Permission denied , voert u sudo -i voor de twee onderstaande opdrachten en sluit u af.

  1. Trek Docker Compose naar /usr/local/bin/docker-compose .
curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
 

U kunt versie 1.7.1 aanpassen aan uw gewenste versie. Probeer een versie van https://github.com/docker/compose/releases te krijgen

  1. Pas uitvoerbare machtigingen toe op het binaire bestand.
chmod +x /usr/local/bin/docker-compose
 
  1. Test de installatie.
docker-compose --version
 

Verwachte docker-compose versie 1.7.1, build 0a9ab35

Installatie

Als u Docker op OS X of Windows gebruikt, moet docker-compose worden opgenomen in de installatie van Docker voor Windows of Docker Toolbox.

Op Linux kunt u de nieuwste binaire bestanden rechtstreeks van de GitHub-releasepagina ophalen: https://github.com/docker/compose/releases

U kunt de specifieke release installeren met de volgende opdrachten:

curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
 

Raadpleeg de documentatiepagina voor meer informatie

Ruby on Rails met docker-compose

Als u de docker-app voor rails wilt gebruiken en de database wilt gebruiken, moet u weten dat alle gegevens in de docker-container worden vernietigd (tenzij u de container specifiek configureert voor het bewaren van gegevens) Soms moet u een docker-container maken met een toepassing en koppel deze aan een oude container met een database.

Als een voorbeeld van rails-applicatie, gebruikte ik een eenvoudige app. U kunt het maken met de opdracht:

rails new compose-app --database=postgresql
 

Natuurlijk moet u vooraf rails, robijn, enz. Installeren.

Maak vervolgens Dockerfile in uw project en stel deze gegevens hierop in:

FROM ruby:2.3.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /compose-app
WORKDIR /compose-app
ADD Gemfile /compose-app/Gemfile
ADD Gemfile.lock /compose-app/Gemfile.lock
RUN bundle install
ADD . /compose-app
 

Volgende stap - maak docker-compose.yml met de gegevens:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -e development -p 80 -b '0.0.0.0'
    volumes:
      - .:/compose-app
    ports:
      - "80:80"
    depends_on:
      - db
 

U kunt 80-poort (-p 80) vervangen door een andere.

De sectie Ontwikkelen van database.yml-configuratie moet worden gewijzigd in:

development: &default
  adapter: postgresql
  encoding: unicode
  database: postgres
  pool: 5
  username: postgres
  password:
  host: db
 

U kunt nu afbeeldingen maken met de opdracht:

docker-compose build
 

(Voer dit uit in de projectmap)

En begin allemaal met:

docker-compose up
 

Als alles correct is gedaan, kunt u logboeken vanaf rails in de console zien.

Sluit console. Het zal werken.

Als u alleen de container met de rails-toepassing zonder de database wilt verwijderen, moet u deze vervolgens in de projectmap uitvoeren:

docker-compose stop web
docker-compose build web
docker-compose up -d --no-deps web
 

Er wordt een nieuwe container met rails-app gemaakt en gelanceerd.

Voer de opdracht uit in de Docker-compose-service

docker-compose run service-name command

Als u bijvoorbeeld rake db:create in uw web wilde uitvoeren, zou u de volgende opdracht gebruiken:

docker-compose run web rake db:create