Kako instalirati i koristiti Docker Compose na Ubuntu


Uvod

Docker pojednostavljuje proces upravljanja aplikacijskim procesima u kontejnerima. Iako su kontejneri na određene načine slični virtualnim strojevima, oni su lakši i manje zahtjevni za resurse. To omogućava developerima da razlože aplikacijsko okruženje u više izoliranih servisa.

Za aplikacije koje ovise o nekoliko usluga, usklađivanje pokretanja, međusobne komunikacije i istovremenog gašenja svih kontejnera može brzo postati nezgrapno. Docker Compose je alat koji vam omogućuje pokretanje višekontejnerskih aplikacijskih okruženja temeljenih na definicijama postavljenim u YAML datoteci. Koristi definicije usluga za izgradnju potpuno prilagodljivih okruženja s više kontejnera koji mogu dijeliti mreže i podatkovne volumene.

Ovaj vodič će vas provesti kroz instalaciju Docker Compose-a na Ubuntu serveru i pokretanje jednostavnog kontejnera. Nakon toga, naučit ćete kako izgraditi okruženje s više servisa koristeći WordPress aplikaciju i MySQL bazu podataka. Također ćemo obraditi naprednije teme, uključujući skaliranje servisa, definiranje prilagođenih mreža i korištenje modularnih include direktiva. Na kraju, ovaj članak pruža vodič za migraciju sa starije verzije docker-compose (v1) na modernu docker compose (v2) i detaljnu sekciju o rješavanju uobičajenih problema poput sukoba portova i pogrešaka u dozvolama.

Ključne napomene:

  • Docker Compose je alat za definiranje i pokretanje aplikacija s više spremnika koristeći jednu YAML datoteku za konfiguriranje servisa, mreža i volumena.
  • Docker Compose se instalira na Ubuntu dodavanjem službenog Dockerovog spremišta i korištenjem apt-a za instalaciju paketa docker-compose-plugin.
  • Moderni naredbeni redak je docker compose (s razmakom). Ovo zamjenjuje zastarjeli alat docker-compose (s crticom) verzije 1.
  • Koristite docker compose up -d za pokretanje aplikacije u odvojenom načinu rada i docker compose down za zaustavljanje i uklanjanje svih njezinih kontejnera i mreža.
  • Direktiva depends_on pomaže u kontroli redoslijeda pokretanja servisa, kao što je osiguravanje da kontejner baze podataka započne prije kontejnera web aplikacije.
  • Najčešći problemi su „Dozvola odbijena“ (rješava se dodavanjem vašeg korisnika u grupu docker), sukobi portova (rješava se promjenom porta na hostu u YAML datoteci) i greške u sintaksi YAML-a (rješava se ispravljanjem uvlačenja).
  • Možete pokrenuti više instanci usluge koristeći naredbu docker compose up --scale <ime_usluge>=<broj>.
  • Direktiva include omogućuje vam da razdijelite veliku docker-compose.yml datoteku na manje, lakše upravljive konfiguracijske datoteke.

Preduvjeti

Da biste pratili ovaj članak, trebat će vam:

  • Pristup lokalnom Ubuntu računalu ili razvojnom poslužitelju kao korisnik bez root prava s privilegijama sudo. Ako koristite udaljeni poslužitelj, preporuča se da imate instaliran aktivan vatrozid. Za postavljanje ovoga, molimo pogledajte naš Vodič za početno postavljanje poslužitelja za Ubuntu.
  • Docker instaliran na vašem serveru ili lokalnom računalu, slijedeći korake 1 i 2 iz Vodiča za instalaciju Dockera na Ubuntu – korak-po-korak.

Napomena: Počevši od Docker Compose v2, Docker je prešao na korištenje compose CLI plug-in naredbe, a udaljio se od izvorne docker-compose naredbe, kako je dokumentirano u našem vodiču Kako instalirati Docker Compose na Ubuntu (korak-po-korak). Iako se instalacija razlikuje, općenito stvarna upotreba uključuje uklanjanje crtica iz docker-compose poziva kako bi postali docker compose. Za potpune detalje o kompatibilnosti, provjerite službenu Docker dokumentaciju o kompatibilnosti naredbi između novog compose i starog docker-compose.

Korak 1 — Instalacija Docker Composea

Postoje dva načina za instalaciju Docker Composea na Ubuntu:

  • Instaliraj koristeći repozitorij
  • Instaliraj ručno

U ovom ćemo odjeljku raspraviti oba načina.

Instaliranje Docker Composea pomoću apt spremišta

Prvo, postavimo Docker apt repozitorij.

# Add Docker's official GPG key:

sudo apt-get update

sudo apt-get install ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc



# Add the repository to Apt sources:

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

Sada možete instalirati Docker Compose koristeći sljedeću naredbu:

sudo apt install docker-compose-plugin

Docker Compose je sada uspješno instaliran na vašem sustavu. Za provjeru je li instalacija bila uspješna, možete pokrenuti:

docker compose version

Vidjet ćete izlaz sličan ovom:

Docker Compose version v2.3.3

Ručno instaliranje Docker Composea

Da biste osigurali da dobivate najnoviju stabilnu verziju Docker Composea, preuzet ćete ovaj softver s njegovog službenog Github spremišta.

Prvo, provjerite najnoviju verziju dostupnu na njihovoj stranici izdanja. U trenutku pisanja ovog teksta, najnovija stabilna verzija je v2.40.2.

Upotrijebite sljedeću naredbu za preuzimanje:

mkdir -p ~/.docker/cli-plugins/

curl -SL https://github.com/docker/compose/releases/download/v2.40.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

Zatim postavite ispravne dozvole tako da naredba docker compose bude izvršna:

chmod +x ~/.docker/cli-plugins/docker-compose

U sljedećem odjeljku vidjet ćete kako postaviti datoteku docker-compose.yml i pokrenuti kontejnerizirano okruženje s ovim alatom.

Korak 2 — Postavljanje docker-compose.yml datoteke

Kako bismo pokazali kako postaviti docker-compose.yml datoteku i raditi s Docker Composeom, kreirat ćete web poslužiteljsko okruženje koristeći službenu Nginx sliku s Docker Huba, javnog Docker registra. Ovo kontejnerizirano okruženje će posluživati jednu statičku HTML datoteku.

Započnite tako da stvorite novi direktorij u svojoj početnoj mapi, a zatim uđete u njega:

mkdir ~/compose-demo

cd ~/compose-demo

U ovom direktoriju postavite mapu aplikacije koja će služiti kao korijenski direktorij dokumenata za vaše Nginx okruženje:

mkdir app

Koristeći svoj omiljeni uređivač teksta, stvorite novu datoteku index.html unutar mape app:

nano app/index.html

Postavite sljedeći sadržaj u ovu datoteku:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Docker Compose Demo</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>

    <h1>This is a Docker Compose Demo Page.</h1>
    <p>This content is being served by an Nginx container.</p>

</body>
</html>

Spremite i zatvorite datoteku kad završite. Ako koristite nano, to možete učiniti pritiskom na CTRL+X, zatim Y i ENTER za potvrdu.

Zatim, kreirajte datoteku docker-compose.yml:

nano docker-compose.yml

Umetnite sljedeći sadržaj u svoju docker-compose.yml datoteku:

services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html

U modernom Docker Composeu, polje version je opcionalno i često se izostavlja, jer Compose može automatski detektirati verziju konfiguracije. Gornji primjer ne uključuje polje version, što je preporučeni pristup za većinu novih projekata. Polje version trebate navesti samo radi kompatibilnosti sa starijim verzijama.

Zatim imate blok services, gdje postavljate usluge koje su dio ovog okruženja. U vašem slučaju imate jednu uslugu pod nazivom web. Ova usluga koristi nginx:alpine sliku i postavlja preusmjeravanje portova pomoću ports direktive. Svi zahtjevi na portu 8000 host računala (sustav s kojeg pokrećete Docker Compose) bit će preusmjereni u web kontejner na port 80, gdje će raditi Nginx.

Direktiva volumes stvorit će zajednički volumen između domaćina i kontejnera. Ovo će dijeliti lokalnu mapu app s kontejnerom, a volumen će se nalaziti na /usr/share/nginx/html unutar kontejnera, što će zatim prebrisati zadani dokumentarni korijen za Nginx.

Spremi i zatvori datoteku.

Postavili ste demo stranicu i docker-compose.yml datoteku kako biste kreirali okruženje web poslužitelja u kontejneru koje će je posluživati. U sljedećem koraku, pokrenut ćete ovo okruženje pomoću Docker Compose.

Korak 3 — Pokretanje Docker Compose-a

S datotekom docker-compose.yml na mjestu, sada možete pokrenuti Docker Compose kako biste pokrenuli svoje okruženje. Sljedeća naredba preuzet će potrebne Docker slike, stvoriti spremnik za web servis i pokrenuti okruženje u spremniku u pozadinskom načinu rada:

docker compose up -d

Docker Compose će prvo tražiti definiranu sliku na vašem lokalnom sustavu, a ako ne može pronaći sliku, preuzet će je s Docker Huba. Vidjet ćete izlaz poput ovog:

Creating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... done

Napomena: Ako prilikom pokretanja docker compose up naiđete na pogrešku "pristup odbijen", to obično znači da vaš korisnik koji nije root nema dopuštenje za pristup socketu Docker demona.

Prema zadanim postavkama, Docker daemon se povezuje na Unix socket (/var/run/docker.sock) koji je u vlasništvu korisnika root. Da biste to popravili, morate dodati svog korisnika koji nije root u grupu docker, koja se stvara tijekom instalacije Dockera.

Pokrenite sljedeću naredbu da dodate svog korisnika u docker grupu:

sudo usermod -aG docker ${USER}

Nakon pokretanja ove naredbe, morat ćete se odjaviti i ponovno prijaviti kako bi promjene u grupi stupile na snagu. Također možete aktivirati promjene za trenutnu terminal sesiju tako da upišete:

newgrp docker

Ova naredba trebala bi riješiti sve pogreške vezane uz dozvole povezane s Docker socketom. Za detaljan vodič, molimo pogledajte Korak 2 u Kako instalirati Docker na Ubuntu – korak po korak vodič.

Vaše okruženje sada radi u pozadini. Da biste provjerili je li spremnik aktivan, možete pokrenuti:

docker compose ps

Ova naredba će vam pokazati informacije o pokrenutim kontejnerima i njihovom stanju, kao i sve trenutno postavljene preusmjeravanja portova:

       Name                     Command               State          Ports        
----------------------------------------------------------------------------------
compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8000->80/tcp

Sada možete pristupiti demo aplikaciji tako da u vašem pregledniku odaberete localhost:8000 ako pokrećete ovaj demo na vašem lokalnom računalu, ili your_server_domain_or_IP:8000 ako pokrećete ovaj demo na udaljenom poslužitelju.

Vidjet ćete stranicu poput ove:

Zajednički volumen koji ste postavili unutar datoteke docker-compose.yml održava datoteke u vašoj mapi app sinkroniziranima s korijenskom mapom dokumenata u spremniku. Ako napravite bilo kakve promjene u datoteci index.html, spremnik će ih automatski prepoznati i one će se prikazati u vašem pregledniku kada osvježite stranicu.

U sljedećem koraku vidjet ćete kako upravljati svojim okruženjem s kontejnerima pomoću Docker Compose naredbi.

Korak 4 — Upoznavanje s Docker Compose naredbama

Vidjeli ste kako postaviti datoteku docker-compose.yml i pokrenuti svoje okruženje pomoću docker compose up. Sada ćete vidjeti kako koristiti Docker Compose naredbe za upravljanje i interakciju s vašim okruženim kontejnerima.

Da biste provjerili zapise koje proizvodi vaš Nginx kontejner, možete koristiti naredbu logs:

docker compose logs

Vidjet ćete izlaz sličan ovome:

Attaching to compose-demo_web_1
web_1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1  | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1  | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1  | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1  | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"

Ako želite pauzirati izvođenje okoline bez promjene trenutnog stanja vaših spremnika, možete koristiti:

docker compose pause
Pausing compose-demo_web_1 ... done

Za nastavak izvršavanja nakon izdavanja pauze:

docker compose unpause
Unpausing compose-demo_web_1 ... done

Komanda stop će zaustaviti izvršavanje kontejnera, ali neće uništiti nikakve podatke povezane s vašim kontejnerima:

docker compose stop
Stopping compose-demo_web_1 ... done

Ako želite ukloniti kontejnere, mreže i volumene povezane s ovim kontejneriziranim okruženjem, koristite naredbu down:

docker compose down
Removing compose-demo_web_1 ... done
Removing network compose-demo_default

Primijetite da ovo neće ukloniti osnovnu sliku koju Docker Compose koristi za pokretanje vašeg okruženja (u vašem slučaju, nginx:alpine). Na taj način, kad god ponovno pokrenete svoje okruženje s docker compose up, proces će biti mnogo brži jer je slika već na vašem sustavu.

U slučaju da želite i ukloniti osnovnu sliku sa svog sustava, možete koristiti:

docker image rm nginx:alpine
Untagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a

Napomena: Molimo pogledajte naš vodič Kako instalirati Docker na Ubuntu – Vodič korak po korak za detaljnije informacije o Docker naredbama.

Korak 5 — Izrada aplikacije s više usluga

Prava snaga Docker Composea leži u upravljanju više servisa koji rade zajedno. Primjer s Nginxom bio je jedan servis. Napravimo praktičniju, višeservisnu aplikaciju: WordPress web stranicu povezanu s MySQL bazom podataka.

Ova postavka uključuje dvije usluge: wordpress (koja pokreće aplikaciju) i db (koja pokreće bazu podataka). Također ćemo koristiti Docker volumene kako bismo osigurali da podaci baze podataka ostanu sačuvani čak i ako se kontejner ukloni.

Napravimo novi direktorij za ovu aplikaciju:

mkdir -p ~/compose-demo/wordpressapp

cd ~/compose-demo/wordpressapp

Za ovaj primjer ne trebamo nikakve lokalne datoteke, jer će slike sadržavati sav potreban softver.

Kreirajte novu datoteku docker-compose.yml:

nano docker-compose.yml

Zalijepite sljedeću konfiguraciju. Ova datoteka je složenija, pa ćemo pregledati svaki dio.

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: <^your_wordpress_password_here<^>
    restart: unless-stopped

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "8001:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wp_content:/var/www/html/wp-content
    depends_on:
      - db
    restart: unless-stopped

volumes:
  db_data:

Napomena: Ovdje smo za ilustraciju hardkodirali vrijednosti za lozinku. Prilikom korištenja u stvarnom okruženju, svakako koristite varijable okoline u .env datoteci kako biste izbjegli izlaganje svojih vjerodajnica.

Spremite i zatvorite datoteku. Ne zaboravite zamijeniti <^...^> oznake snažnim, sigurnim lozinkama.

Razložimo nove smjernice u ovoj datoteci:

  • services: Ovaj blok i dalje definira naše kontejnere. Sada imamo dva: db i wordpress.
  • image: Koristimo mysql:8.0 za bazu podataka i wordpress:latest sliku za aplikaciju.
  • container_name: Ovo postavlja specifično, čovjeku razumljivo ime za spremnik, koje je lakše referencirati nego automatski generirana imena.
  • environment: Ovo je popis varijabli okoline koje se prosljeđuju u kontejner. Slika mysql koristi ih za postavljanje root lozinke i kreiranje početne baze podataka i korisnika. Slika wordpress koristi ih da zna kako se povezati sa svojom bazom podataka.
  • volumeni (na razini usluge):

    • Za db servis, db_data:/var/lib/mysql preslikava Docker-om upravljanu volumen pod nazivom db_data na MySQL direktorij podataka unutar kontejnera. Ovo čuva vaše podatke sigurnima.
    • Za servis wordpress, ./wp_content:/var/www/html/wp-content mapira lokalni direktorij (wp_content) na WordPress direktorij za sadržaj. To vam omogućuje izravno uređivanje tema i dodataka s vašeg računala.
  • depends_on: Ovo govori Compose-u da pokrene db servis prije nego što pokrene wordpress servis. Ovo je važno, jer WordPress neće uspjeti ako ne može pronaći svoju bazu podataka prilikom pokretanja.
  • volumes (na najvišoj razini): Ovaj blok definira imenovane volumene. db_data: stvara Docker-volumen kojim upravlja Docker, što je preporučeni način za rukovanje trajnim podacima.

Sada pokrenite ovu aplikaciju s više usluga:

docker compose up -d

Compose će povući slike mysql i wordpress, a zatim stvoriti kontejnere, prvo pokrećući uslugu db.

Creating network "compose-demo_default" with the default driver
Creating volume "compose-demo_db_data" with default driver
Pulling db (mysql:8.0)...
...
Pulling wordpress (wordpress:latest)...
...
Creating mysql_db        ... done
Creating wordpress_app ... done

Sada možete pristupiti svojoj novoj WordPress stranici tako da u pregledniku odete na localhost:8001 ili <^your_server_domain_or_IP<^>:8001. Trebali biste vidjeti ekran za instalaciju WordPressa. Za detaljniji primjer, pogledajte naš članak Kako instalirati WordPress pomoću Docker Compose.

Korak 6 — Korištenje Docker Composea za AI/ML razvoj

Osim web aplikacija, Docker Compose je iznimno koristan alat za stvaranje reproducibilnih okruženja za podatkovnu znanost i strojno učenje (AI/ML). AI/ML projekti poznati su po svojim složenim ovisnostima, uključujući specifične verzije Pythona, biblioteke poput TensorFlowa ili PyTorcha te sistemske upravljačke programe poput NVIDIA CUDA Toolkita. Docker Compose bilježi čitavo ovo okruženje u konfiguracijskim datotekama, rješavajući problem „radi na mojem računalu“, što je ključno za reproducibilna istraživanja.

U ovom primjeru kreirat ćete AI/ML okruženje s više usluga koje se sastoji od:

  • JupyterLab: Kontejner za interaktivni razvoj, izgrađen iz prilagođene Dockerfile datoteke.
  • PostgreSQL: Kontejner baze podataka za pohranu rezultata eksperimenata i metapodataka.
  • Pristup GPU-u: JupyterLab kontejner će biti konfiguriran za pristup NVIDIA GPU-u na glavnom računalu, što je čest zahtjev za treniranje modela.

Preduvjet: Ovaj primjer zahtijeva NVIDIA GPU na vašem računalu i instaliran NVIDIA Container Toolkit. Bez toga, kontejner neće moći pokrenuti kada se zatraže GPU resursi.

Struktura datoteka

Prvo, stvorite direktorij za svoj projekt. Unutar njega, stvorit ćete datoteku docker-compose.yml, direktorij jupyter, Dockerfile za Jupyter i datoteku requirements.txt. Struktura bi trebala izgledati otprilike ovako:

ai-project/
├── docker-compose.yml
└── jupyter/
    ├── Dockerfile
    └── requirements.txt

Izrada datoteka komponente

1. Datoteka requirements.txt

Ova datoteka navodi Python pakete za vaše okruženje za znanost o podacima.

nano jupyter/requirements.txt

Dodajte potrebne pakete. U ovom primjeru uključit ćemo biblioteke za obradu podataka, povezivanje s bazom podataka i okvir za duboko učenje.

pandas
scikit-learn
tensorflow
jupyterlab
psycopg2-binary

Spremi i zatvori datoteku.

2. Dockerfile

Ova datoteka definira vašu prilagođenu JupyterLab uslugu. Koristi službenu Jupyter sliku kao osnovu i instalira pakete iz requirements.txt.

nano jupyter/Dockerfile

Zalijepite sljedeći sadržaj:

# Start from a base image that includes Jupyter and scientific libraries
FROM jupyter/scipy-notebook:latest

# Copy our local requirements file into the container
COPY requirements.txt /tmp/requirements.txt

# Install the Python packages
RUN pip install --no-cache-dir -r /tmp/requirements.txt

Ova datoteka uputi Docker da koristi jupyter/scipy-notebook kao početnu točku, kopira vašu requirements.txt u kontejner, a zatim koristi pip za instalaciju paketa.

Definiranje okruženja pomoću docker-compose.yml

Sada kreirajte glavni docker-compose.yml datoteku. Ova datoteka će orkestrirati i db servis i vaš prilagođeni jupyter servis.

nano docker-compose.yml

Zalijepite sljedeću konfiguraciju i zamijenite <^...^> oznake vlastitim sigurnim vjerodajnicama.

services:
  db:
    image: postgres:15-alpine
    container_name: ai_postgres_db
    environment:
      POSTGRES_USER: <^your_db_user^>
      POSTGRES_PASSWORD: <^your_db_pass^>
      POSTGRES_DB: experiments
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U <^your_db_user^> -d experiments"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    networks:
      - ai_net

  jupyter:
    build: ./jupyter
    container_name: ai_jupyter_lab
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_USER=<^your_db_user^>
      - POSTGRES_PASSWORD=<^your_db_pass^>
      - POSTGRES_DB=experiments
    restart: unless-stopped
    networks:
      - ai_net
    depends_on:
      db:
        condition: service_healthy
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]

volumes:
  postgres_data:
    name: ai_project_data

networks:
  ai_net:
    driver: bridge

Ova konfiguracijska datoteka uvodi nekoliko važnih koncepata:

  • build: ./jupyter: Ovo govori Docker Composeu da izgradi prilagođenu sliku za jupyter servis. Traži Dockerfile unutar navedenog ./jupyter direktorija.
  • volumes: - ./notebooks:/home/jovyan/work: Ovo umetne lokalni direktorij nazvan notebooks u kontejner. To osigurava da se svi Jupyter notebooks koje stvorite spremaju izravno na vaš računalo, čime se oni čuvaju čak i nakon uklanjanja kontejnera.
  • healthcheck: Kao što je prikazano u odjeljku za rješavanje problema, ova provjera potvrđuje da db servis ne samo da je pokrenut, već i spreman za prihvaćanje veza prije nego što drugi servisi počnu raditi.
  • depends_on: ... condition: service_healthy: Ovo govori jupyter servisu da čeka dok db healthcheck ne prođe prije nego što se pokrene.
  • deploy.resources.reservations.devices: Ovo je blok koji zahtijeva pristup GPU-u.

    • driver: nvidia: Određuje upravljački program domaćina koji se koristi.
    • count: 1: Zahtijeva jednu GPU.
    • capabilities: [gpu]: Osigurava da spremnik ima potrebne mogućnosti za korištenje GPU-a.

Pokretanje AI/ML okruženja

Kada su vaše datoteke na mjestu, spremni ste za izgradnju i pokretanje usluga.

  1. Iz svog direktorija ai-project, pokrenite naredbu docker compose up. Prvi put morate dodati zastavicu --build kako biste Composeu rekli da izgradi vašu prilagođenu jupyter sliku.

    docker compose up -d --build
  2. Compose će prvo izgraditi jupyter sliku (što može potrajati nekoliko minuta dok se preuzima TensorFlow), zatim povući postgres sliku, i na kraju pokrenuti oba kontejnera.

    [+] Building 5.8s (9/9) FINISHED
     => [internal] load build definition from Dockerfile
    ...
    [+] Running 3/3
     ✔ Network ai-project_ai_net        Created
     ✔ Container ai_postgres_db         Started
     ✔ Container ai_jupyter_lab         Started
  3. Sada možete pristupiti JupyterLab sučelju tako da u svom pregledniku odete na http://localhost:8888 (ili <^your_server_ip^>:8888). Bit će vam zatražen token, koji možete dobiti iz zapisnika spremnika:

    docker compose logs jupyter

    Potražite redak sličan http://127.0.0.1:8888/lab?token=a1b2c3d4e5f6...

  4. Unutar Jupyter bilježnice sada se možete povezati s bazom podataka koristeći ime hosta db i podatke za prijavu koje ste unijeli. Vaše okruženje također ima pristup GPU-u domaćina za treniranje modela.

Proširenje usluga i korištenje prilagođenih mreža

Docker Compose uključuje značajke za skaliranje servisa i upravljanje mrežama na kojima komuniciraju.

Skaliranje usluge s replikama

Zamislite da vaš Nginx web server iz Koraka 2 dobiva previše prometa. Možete povećati web servis kako bi pokrenuo više primjeraka kontejnera. Docker Compose to može automatski upravljati.

Postoje dva glavna načina za skaliranje usluge.

1. Korištenje replicas ključa (Preporučeno u v2)

Broj željenih instanci možete definirati izravno u svojoj datoteci docker-compose.yml koristeći ključeve deploy i replicas. Ova je značajka izvorno bila dio Docker Swarm-a, ali je sada dostupna i za standardne Compose implementacije.

Izmijenite svoj Nginx docker-compose.yml iz Koraka 2:

services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html
    deploy:
      replicas: 3

Kada pokrenete docker compose up -d, Compose će kreirati tri web kontejnera. Međutim, imat ćete problem: sva tri će pokušati vezati se na host port 8000. To će uzrokovati pogrešku „port je već zauzet“ za drugi i treći kontejner. Da biste to riješili u produkcijskoj konfiguraciji, trebali biste ukloniti mapiranje ports iz web servisa. Na taj način, web kontejneri su dostupni samo unutar Docker mreže. Poseban servis za balansiranje opterećenja bio bi jedini s javnim portom. On bi zatim distribuirao promet prema tri web replike.

Primjer konfiguracije izgledao bi ovako (ovo je napredni primjer):

services:
  web:
    image: nginx:alpine
    # No 'ports' mapping here.
    # The service is only accessible inside the 'web-net' network.
    volumes:
      - ./app:/usr/share/nginx/html
    deploy:
      replicas: 3
    networks:
      - web-net

  load_balancer:
    image: nginx:latest
    ports:
      - "80:80" # The load_balancer is the only service with a public port.
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf # A config file that load balances to 'web'.
    networks:
      - web-net
    depends_on:
      - web

networks:
  web-net:

U ovoj postavci, load_balancer osluškuje na portu 80 i interno prosljeđuje zahtjeve na web_1, web_2 i web_3.

Ova replicas ključna riječ najkorisnija je kada se koristi s reverznim proxyjem (kao što je Traefik ili neka druga Nginx instanca) koja može uravnotežiti opterećenje zahtjeva između replika unutar Docker mreže, bez potrebe da svaka replika izlaže port na hostu.

2. Korištenje --scale oznake

Uobičajena metoda za skaliranje je zastavica --scale, naslijeđena iz Compose v1. Ova se zastavica primjenjuje u vrijeme izvođenja i nadjačava bilo koji ključ replicas.

Međutim, morate biti oprezni s definicijama portova. Ako vaša usluga definira fiksno mapiranje host portova (npr. "8000:80"), pokretanje docker compose up --scale uzrokovat će pogrešku za drugi i treći spremnik jer svi pokušavaju vezati isti host port.

Da biste koristili --scale za usluge koje izlažu portove, ne smijete koristiti fiksno mapiranje host porta.

  • Opcija 1: Preslikavanje na nasumične portove domaćina (Dobro za razvoj)

    Možete izmijeniti svoj docker-compose.yml kako biste naveli samo port kontejnera. To govori Dockeru da preslika port 80 u svakom kontejneru na nasumični, dostupan port na vašem domaćinu.

    services:
      web:
        image: nginx:alpine
        ports:
          - "80" # No fixed host port
        volumes:
          - ./app:/usr/share/nginx/html

    Sada, kada pokrenete naredbu scale:

    docker compose up -d --scale web=3

    Pokrenite docker compose ps da vidite rezultat. Svaki će kontejner raditi na drugom, nasumično dodijeljenom portu na hostu:

          Name                     Command               State          Ports        
    ----------------------------------------------------------------------------------
    compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49154->80/tcp
    compose-demo-web_2   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49155->80/tcp
    compose-demo-web_3   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:49156->80/tcp
  • docker-compose.yml - Ispravno za --scale

  • Opcija 2: Koristite obrnutu posredničku uslugu (Dobra za produkciju)

    Drugo rješenje, kao što je spomenuto u odjeljku replicas, je potpuno ukloniti direktivu ports iz servisa web. Zatim biste koristili zaseban kontejner za balansiranje opterećenja (koji ima jedini javni port) za upravljanje i distribuciju prometa prema skaliranim replikama unutar Docker mreže.

    Za zaustavljanje i uklanjanje sva tri spremnika, naredba ostaje ista:

    docker compose down

Prilagođena mrežna konfiguracija

Po defaultu, Docker Compose stvara jednu bridge mrežu za vašu aplikaciju. Svaka usluga u datoteci je spojena na nju, zbog čega je wordpress kontejner mogao pronaći db kontejner samo koristeći njegovo ime usluge (db).

Međutim, možete definirati vlastite prilagođene mreže za bolju izolaciju i kontrolu.

Modificirajmo WordPress primjer da koristi prilagođenu bridge mrežu.

services:
  db:
    image: mysql:8.0
    ...
    networks:
      - app_net

  wordpress:
    image: wordpress:latest
    ...
    ports:
      - "8001:80"
    depends_on:
      - db
    networks:
      - app_net

volumes:
  db_data:

networks:
  app_net:
    driver: bridge

Evo što smo dodali:

  • mreže (vrh razine): Ovo definira novu mrežu pod nazivom app_net i specificira da treba koristiti standardni bridge upravljač.
  • mreže (na razini usluge): Ispod obje db i wordpress, ovaj ključ ih povezuje s našom app_net mrežom.

Ako biste imali treću uslugu (poput alata za analitiku) koju ne biste povezali s app_net, bila bi potpuno izolirana i ne bi mogla komunicirati s db ili wordpress kontejnerima.

Za višedomaćinsko klasteriranje s Docker Swarm, trebali biste promijeniti driver s bridge na overlay. Bridge driver je za komunikaciju između kontejnera na jednom domaćinu, što je standard za većinu slučajeva upotrebe Docker Compose-a.

Upotreba modularnih konfiguracijskih datoteka

Kako vaše aplikacije rastu, vaša docker-compose.yml datoteka može postati velika i teška za upravljanje. Docker Compose podržava include direktivu, koja vam omogućuje da svoju konfiguraciju podijelite na više datoteka.

Zamislite da želite odvojiti definicije WordPressa i baze podataka, i možda imati zajednički docker-compose.override.yml za postavke specifične za razvoj (poput povezivanja porta na bazu podataka).

Vaša struktura direktorija mogla bi izgledati ovako:

compose-demo/
├── docker-compose.yml
├── docker-compose.db.yml
├── docker-compose.web.yml

Ova datoteka će samo definirati db servis.

services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: <^your_wordpress_password_here<^>
    restart: unless-stopped

volumes:
  db_data:

Ova datoteka će samo definirati wordpress servis.

services:
  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "8001:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./wp_content:/var/www/html/wp-content
    depends_on:
      - db
    restart: unless-stopped

Sada vaš glavni docker-compose.yml fajl postaje vrlo jednostavan. On samo koristi include za uključivanje drugih fajlova.

include:
  - docker-compose.db.yml
  - docker-compose.web.yml

Kada pokrenete docker compose up -d, Compose će pročitati sve tri datoteke, spojiti konfiguracije i pokrenuti db i wordpress servise točno kao da su definirani u jednoj datoteci. Ovaj pristup čini vašu konfiguraciju mnogo modularnijom i ponovno upotrebljivom.

Napomena: Direktiva include: zahtijeva Docker Compose v2.20 ili noviji. Ako vaš sustav koristi stariju verziju, možete kombinirati datoteke pomoću docker compose -f docker-compose.db.yml -f docker-compose.web.yml up.

Migracija s docker-compose (v1) na docker compose (v2)

Komanda docker compose koju ste instalirali u Koraku 1 je „Compose v2.“. To je plugin baziran na Go-u, izravno ugrađen u Docker CLI.

Izvorna verzija, „Compose v1“, bila je zaseban Python alat koji se pokretao s docker-compose (s crticom). Od srpnja 2023. Compose v1 više nije podržan i zastario je.

Ključne promjene i kompatibilnost unatrag

  • Naredba: Najočitija promjena je naredba. Crtica (docker-compose) sada je zamijenjena razmakom (docker compose).
  • Instalacija: v1 je instaliran pomoću pip. v2 je uključen u Docker Desktop ili instaliran kao CLI dodatak, kao što ste učinili u Koraku 1.
  • YAML datoteke: Vaše docker-compose.yml datoteke gotovo su 100% kompatibilne unatrag. Compose v2 u potpunosti podržava verzije datoteka 3.x. Ne morate mijenjati svoje YAML datoteke za migraciju, samo svoje naredbe.
  • --project-name zastavica: Zastavica -p i dalje radi, ali puna zastavica sada je --project-name umjesto --project_name.

Vodič za migraciju naredbi

Većina naredbi je identična, samo bez crtice. Ovdje je tablica koja uspoređuje uobičajene v1 naredbe s njihovim v2 ekvivalentima.

Naredba docker-compose (v1)docker compose (v2) NaredbaBilješke
docker-compose up -d
docker compose up -d
Nema promjene u sintaksi.
docker-compose down
docker compose down
Nema promjene u sintaksi.
docker-compose ps
docker compose ps
Nema promjene u sintaksi.
docker-compose logs
docker compose logs
Nema promjene u sintaksi.
docker-compose stop
docker compose stop
Nema promjene u sintaksi.
docker-compose build
docker compose build
Nema promjene u sintaksi.
docker-compose exec web bash
docker compose exec web bash
Nema promjene u sintaksi.
docker-compose run web bash
docker compose run web bash
run stvara novi kontejner. exec se pokreće u postojećem.
docker-compose up --scale web=3
docker compose up --scale web=3
Zastavica --scale još uvijek se podržava u verziji 2.

Kao što možete vidjeti, za većinu svakodnevne uporabe, jedina promjena je docker-compose -> docker compose. Ako koristite skripte, možete ih ažurirati jednostavnim uklanjanjem crte.

Ako još uvijek imate instaliranu staru verziju docker-compose v1, možete je ukloniti kako biste izbjegli zabunu:

sudo pip3 uninstall docker-compose

Ili, ako je instalirano putem apt:

sudo apt remove docker-compose

Rješavanje uobičajenih problema s Docker Composeom

Kada radite s Docker Composeom, možete naići na probleme povezane s sintaksom datoteka, dopuštenjima ili sukobima u radu kontejnera. Većina problema može se dijagnosticirati i riješiti metodskim provjeravanjem vaše konfiguracije, dopuštenja i zapisa kontejnera.

Pogledajmo neke od najčešćih pogrešaka i njihova rješenja.

Pristup odbijen (Docker socket)

Ovo je jedna od najčešćih pogrešaka kod novih korisnika Dockera. Pokrenete docker compose up i vidite poruku o pogrešci vezanu za Docker daemon socket.

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
  • Problem: Vaš korisnik bez root prava nema dopuštenje za komunikaciju s Docker daemon-om, koji se pokreće kao root.

  • Rješenje: Morate dodati svog korisnika u docker grupu, koja je stvorena tijekom instalacije Dockera.

    1. Dodajte svog korisnika u grupu docker:

      sudo usermod -aG docker ${USER}
    2. Da bi novo članstvo u grupi stupilo na snagu, morate se odjaviti i ponovno prijaviti.

    3. Kao alternativu, možete aktivirati promjene grupiranja za vašu trenutnu terminalnu sesiju tako da upišete:

      newgrp docker

    Ovo bi trebalo riješiti sve pogreške vezane uz dopuštenja za Docker socket.

Sintaksa YAML-a i pogreške uvlačenja

Docker Compose ne može pokrenuti i javlja da je vaša docker-compose.yml datoteka nevažeća.

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.web.ports contains an invalid type, it should be a list

Ili :

mapping values are not allowed in this context at line 5
  • Problem: Datoteka docker-compose.yml oslanja se na strogu YAML sintaksu. Najčešća pogreška je nepravilno uvlaka. YAML koristi razmake, a ne tabove, za definiranje strukture.
  • Rješenje: Pažljivo provjerite uvlačenje u vašoj docker-compose.yml datoteci.

    • Standard je dva razmaka za svaku razinu uvlake.
    • Provjerite da svi ključevi na istoj razini (poput version, services, volumes) počinju u istom stupcu.
    • Provjerite jesu li svi podključevi (poput image, ports, volumes ispod servisa) uvučeni dva prazna mjesta više od njihovog nadređenog servisa (npr. web).
    • Koristite uređivač koda s YAML lintom kako biste automatski označili pogreške u sintaksi.

Sukobi priključaka

Pokušavate pokrenuti svoje okruženje, ali naredba ne uspijeva s porukom o pogrešci da je adresa već u upotrebi.

Error starting userland proxy: listen tcp 0.0.0.0:8000: bind: address already in use
  • Problem: Drugi proces na vašem računalu već koristi port koji pokušavate mapirati (u ovom slučaju, port 8000). To je često drugi Docker kontejner ili lokalni razvojni server.

  • Rješenje: Imate dvije opcije:

    1. Zaustavite drugi proces. Možete pronaći proces koji koristi port pomoću ove naredbe:

      sudo lsof -i :8000

      Ako je riječ o drugom Docker kontejneru, zaustavite ga pomoću docker stop <container_id>.

    2. Promijenite port na hostu u svojoj docker-compose.yml datoteci. Ovo je često najjednostavnije rješenje. Promijenite mapiranje ports s "8000:80" na drugi port, na primjer "8001:80".

      ...
      ports:
        - "8001:80" # Changed from 8000
      ...
    3. docker-compose.yml

Usluga ne uspijeva s Connection Refused (depends_on)

U aplikaciji s više usluga (poput primjera s WordPressom i MySQL-om), wordpress kontejner se pokrene, ali njegovi zapisi prikazuju Connection refused ili MySQL server has gone away prilikom pokušaja povezivanja s db uslugom.

  • Problem: Koristili ste depends_on, ali ova direktiva samo čeka da db kontejner pokrene. Ona ne čeka da MySQL aplikacija unutar kontejnera bude potpuno inicijalizirana i spremna za prihvaćanje veza.

  • Rješenje: Aplikacija (u ovom slučaju WordPress) mora biti konfigurirana da pokuša ponovno uspostaviti vezu. Većina modernih slika ima ugrađenu ovu logiku ponovnog pokušaja. Za slike koje to nemaju, morate implementirati provjeru zdravlja (healthcheck).

    Možete dodati healthcheck na svoju db uslugu. depends_on za wordpress uslugu tada se može konfigurirati da čeka da baza podataka bude „zdrava“, a ne samo „pokrenuta“.

Primjer zdravstvene provjere za MySQL:

services:
  db:
    image: mysql:8.0
    ...
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p<^your_root_password_here<^>"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    image: wordpress:latest
    ...
    depends_on:
      db:
        condition: service_healthy # This now waits for the healthcheck
    ...

Pogreške s volumenima i vezanim montiranjima

Možete naići na pogreške dopuštenja u zapisnicima vašeg spremnika ili otkriti da je direktorij s podacima vašeg spremnika prazan.

Dozvole datoteka/podataka

  • Problem: Kontejner se pokreće kao određeni korisnik (npr. www-data s ID-om korisnika 33), ali direktorij na hostu koji ste montirali pripada vašem korisniku (npr. ubuntu s ID-om korisnika 1000). Korisnik kontejnera nema dopuštenje za pisanje u direktorij na hostu.

  • Rješenje: Promijenite vlasništvo nad direktorijem domaćina kako bi odgovaralo ID-u korisnika unutar kontejnera. ID korisnika kontejnera možete pronaći pokretanjem docker compose exec <service_name> id. Na primjer, ako je ID 33 (uobičajeno za www-data):

    sudo chown -R 33:33 ./wp_content

Problemi s relativnim putanjama

  • Problem: Vaš docker-compose.yml koristi relativnu putanju kao ./app, ali vaša index.html datoteka se ne poslužuje.

  • Rješenje: Docker Compose tumači relativne putove iz direktorija iz kojeg pokrećete naredbu docker compose up. Uvijek pokrećite Compose naredbe iz istog direktorija koji sadrži vašu docker-compose.yml datoteku.

Umrežavanje i otkrivanje usluga

Dnevnički zapis kontejnera vaše aplikacije prikazuje Host nije pronađen ili Nije moguće riješiti host: db.

  • Problem: Vaš wordpress kontejner ne može pronaći db kontejner na mreži.
  • Rješenje: Po defaultu, Docker Compose kreira mrežu i povezuje sve servise na nju. Servisi se mogu međusobno pronaći koristeći svoja imena servisa.

    1. Provjerite nazive servisa: Provjerite je li naziv hosta u konfiguraciji vaše aplikacije (npr. WORDPRESS_DB_HOST varijabla okoline) točno isti kao naziv servisa u vašem docker-compose.yml (npr. db).

    2. Provjerite mrežu: Koristite docker compose ps da biste pronašli naziv svog projekta (npr. compose-demo). Zatim, provjerite zadanu mrežu:

      docker network inspect compose-demo_default

      JSON izlaz će prikazati sve kontejnere povezane na ovu mrežu. Ako neki od vaših servisa nedostaje, provjerite svoj docker-compose.yml zbog bilo kakvih prilagođenih konfiguracija networks koje bi ga mogle izolirati.

Neusklađenost naredbi (v1 vs. v2)

Upišete docker-compose up (s crticom) i vidite pogrešku „command not found“.

docker-compose: command not found
  • Problem: Pokušavate koristiti naredbu za Compose v1, što je zastarjeli Python alat. Ovaj vodič instalira Compose v2, koji je dodatak integriran izravno u Docker CLI.
  • Rješenje: Upotrijebite ispravnu naredbu zamjenjujući crticom (-) razmak.
docker-compose (v1)docker compose (v2)
docker-compose updocker compose up
docker-compose downdocker compose down
docker-compose psdocker compose ps
docker-compose logsdocker compose logs

Uvijek koristite docker compose (razmak) kada slijedite ovaj vodič.

Često postavljana pitanja

1. Čemu se koristi Docker Compose?

Docker Compose je alat za definiranje i pokretanje višekontejnerskih Docker aplikacija.

Koristi jednu YAML datoteku (po zadanim postavkama, docker-compose.yml) za konfiguriranje svih komponenti vaše aplikacije, koje se nazivaju servisi. Ova datoteka također definira mreže koje omogućuju servisima međusobnu komunikaciju i volumene koji se koriste za trajne podatke.

S ovim jednim datotekom možete upravljati cijelim slojem aplikacije pomoću jednostavnih naredbi:

  • docker compose up pokreće i izvršava cijelu vašu aplikaciju, uključujući sve navedene kontejnere, mreže i volumene.
  • docker compose down zaustavlja i uklanja sve kontejnere, mreže i volumene koje je stvorila vaša aplikacija.

Najkorisnije je za upravljanje aplikacijama koje zahtijevaju više komponenti, poput web stranice koja treba web poslužitelj (poput Nginxa), aplikacijski backend (poput WordPressa) i bazu podataka (poput MySQL-a).

2. Kako instalirati Docker Compose na Ubuntu?

Preporučena metoda je instalirati Docker Compose kao dodatak za Docker CLI. To se radi instalacijom paketa docker-compose-plugin iz Docker-ovog službenog apt spremišta.

  1. Prvo provjerite jeste li slijedili službenu Docker dokumentaciju kako biste postavili Dockerov apt repozitorij na vaš sustav Ubuntu.

  2. Ažurirajte svoj popis paketa:

    sudo apt update
  3. Instalirajte Docker Compose dodatak:

    sudo apt install docker-compose-plugin
  4. Provjerite instalaciju tako da provjerite verziju. Naredba koristi razmak, a ne crtu.

    docker compose version

3. Kako mogu ažurirati Docker Compose na najnoviju verziju?

Budući da je Docker Compose (v2) instaliran kao sistemski paket koristeći apt, možete ga ažurirati koristeći standardni proces ažuriranja softvera na Ubuntu sustavu.

  1. Osvježite svoj lokalni indeks paketa:

    sudo apt update
  2. Pokrenite nadogradnju sustava koja će uključivati Compose dodatak:

    sudo apt upgrade

    Alternativno, ako želite ažurirati samo dodatak, možete pokrenuti:

    sudo apt install --only-upgrade docker-compose-plugin

4. Može li se Docker Compose koristiti u produkcijskim okruženjima?

Da, Docker Compose se često koristi u produkciji, osobito za aplikacije koje rade na jednom računalu.

Omogućuje jednostavan način za definiranje, implementaciju i upravljanje životnim ciklusom servisa, mreža i volumena vaše aplikacije. Za implementaciju na jednom poslužitelju, to je vrlo učinkovito i jednostavno rješenje za upravljanje.

Za složenije scenarije koji zahtijevaju koordinaciju kontejnera preko više računala (klaster), češće se koriste drugi alati. To uključuje Docker Swarm (koji koristi sličnu sintaksu Compose datoteke) i Kubernetes (koji je industrijski standard za orkestraciju kontejnera u velikim razmjerima).

5. Koja je razlika između Dockera i Docker Composea?

Ova tablica prikazuje glavne razlike između Docker CLI-ja i Docker Compose CLI-ja.

Značajkadocker (Docker motor)docker compose (Compose dodatak)
OpsegUpravlja pojedinačnim Docker objektima.Upravlja cjelovitom aplikacijom s više kontejnera kao jednom cjelinom.
Primarna namjenaIzrada slika (docker build), pokretanje pojedinačnih spremnika (docker run), upravljanje spremnicima (docker ps), slikama, volumenima i mrežama.Orkestriranje više usluga definiranih u datoteci docker-compose.yml.
NaredbeNiskorazinske naredbe usmjerene na jedan objekt. Primjer: docker run -d -p 80:80 -v ./:/app nginxVisoke razine naredbi za cijelu aplikaciju. Primjer: docker compose up
AnalogijaA gradivni blok (jedna posuda).Planski nacrt i voditelj gradnje za cijelu zgradu (prijava).

Ukratko, koristite docker za interakciju s pojedinačnim kontejnerom. Koristite docker compose za upravljanje cijelim vašim slojem aplikacije (npr. web, app, db) odjednom.

6. Kako pokrenuti više kontejnera s Docker Composeom?

Pokrećete više kontejnera definirajući ih kao servise u vašoj datoteci docker-compose.yml.

  1. Stvorite datoteku nazvanu docker-compose.yml.

  2. Unutar ove datoteke koristite ključ services: za definiranje svakog kontejnera koji želite pokrenuti.

    Evo praktičnog primjera koji definira i pokreće dva spremnika: WordPress stranicu i MySQL bazu podataka.

    services:
      db:
        # This is the first service (container)
        image: mysql:8.0
        environment:
          MYSQL_ROOT_PASSWORD: <^your_password_here<^>
          MYSQL_DATABASE: wordpress
        volumes:
          - db_data:/var/lib/mysql
    
      wordpress:
        # This is the second service (container)
        image: wordpress:latest
        ports:
          - "8001:80"
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_PASSWORD: <^your_password_here<^>
        depends_on:
          - db
    
    volumes:
      db_data:
  3. docker-compose.yml

  4. Spremi datoteku i otvori terminal u istom direktoriju.

  5. Pokrenite jednu naredbu za pokretanje oba spremnika:

    docker compose up -d

Docker Compose će pročitati datoteku, stvoriti zajedničku mrežu za usluge, povući obje slike mysql i wordpress te pokrenuti kontejner za svaku uslugu.

7. Zašto koristiti Docker Compose za razvoj?

Docker Compose je standardni alat za razvojna okruženja jer rješava nekoliko uobičajenih problema.

  • Dosljedna okruženja: Osigurava da svaki programer u timu koristi potpuno iste usluge (baza podataka, predmemorija, web poslužitelj) s potpuno istim verzijama i konfiguracijama. To je definirano u datoteci docker-compose.yml, koja se unosi u sustav kontrole verzija. To eliminira problem „na mom računalu radi“.

  • Jednostavnost: Zamjenjuje složene instalacijske skripte i duge docker run naredbe. Programer samo treba pokrenuti docker compose up da pokrene cijeli skup aplikacija i docker compose down da ga zaustavi.

  • Izolacija servisa: Programeri mogu raditi na više projekata na istom računalu bez sukoba ovisnosti. Projekt A može koristiti PostgreSQL 9.6, a Projekt B može koristiti PostgreSQL 14, budući da svaka baza podataka radi u izoliranom kontejneru kojim upravlja vlastita Compose datoteka.

  • Jednostavno testiranje integracije: Budući da Compose pokreće sve ovisnosti aplikacije zajedno, stvara savršeno lokalno okruženje za izvođenje testova integracije koji provjeravaju kako usluge međusobno komuniciraju.

Zaključak

U ovom vodiču instalirali ste Docker Compose i konfigurirali kompletnu aplikaciju s više kontejnera. Počeli ste s osnovnom datotekom docker-compose.yml za Nginx web poslužitelj i napredovali do složenije, realističnije strukture koja uključuje WordPress aplikaciju i MySQL bazu podataka. Naučili ste upravljati cijelim životnim ciklusom aplikacije, od izgradnje i pokretanja servisa do njihovog zaustavljanja i uklanjanja.

Sada ste upoznati s ključnim pojmovima za učinkovito upravljanje aplikacijama, uključujući skaliranje servisa, prilagođene definicije mreže i razdvajanje konfiguracije u modularne datoteke pomoću include direktive. Prateći vodič za migraciju i korake za rješavanje problema, također možete riješiti uobičajene probleme poput sukoba portova, grešaka "Permission denied" i pogrešaka u YAML sintaksi. Vještine obrađene ovdje omogućit će vam izgradnju dosljednih, reproducibilnih razvojnih okruženja i sigurno implementiranje aplikacija na jednom poslužitelju.

Za potpuni pregled svih dostupnih docker compose naredbi, provjerite službenu dokumentaciju.

Za više tutorijala vezanih uz Docker, pogledajte sljedeće članke:

  • Kako instalirati Docker na Ubuntu – vodič korak po korak
  • Kako instalirati WordPress pomoću Docker Compose

Hvala što učite s Linux-Console.net zajednicom.