GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Jak přidat svazek do existujícího kontejneru Docker

I když je Docker užitečný nástroj pro balení a správu aplikací, představuje také mnoho jedinečných výzev, jako je například zacházení s uloženými daty. Obvykle přidáváte svazky do kontejnerů ve skriptu pro vytváření, ale co když potřebujete vytvořit nové?

Přidání svazku do běžícího kontejneru dockeru

Bohužel to není tak jednoduché, jako pouhé přidání nového svazku. Kontejnery musí mít své svazky nakonfigurovány při spuštění, což znamená, že chcete-li přidat nový svazek, musíte kontejner restartovat. I když existuje osvědčené řešení (více o něm níže), důrazně se doporučuje restart kontejneru provést tak jako tak.

Je to z několika důvodů. Restartování kontejneru je poměrně snadné a většina aktualizací kódu stejně vyžaduje restart služby. Sledování aktualizací v Gitu je dalším velkým faktorem, zvláště pokud používáte Docker Compose, a úprava spouštěcího skriptu je mnohem lepší než ruční přidávání svazku do běžícího kontejneru.

Pokud je vaše služba dostatečně velká, abyste se obávali několika minut (maximálně) možného plánovaného výpadku pro restartování kontejneru, pravděpodobně byste měli spustit škálovací nasazení s více instancemi, které lze aktualizovat nezávisle. Moderní systémy automatického škálování by měly být navrženy tak, aby to zvládly, protože k nasazování kódu dochází často.

Pokud chcete přidat svazek, budete muset zastavit běžící kontejner:

 docker stop my_container

Vytvořte nový svazek, pokud potřebujete:

docker volume create nginx-config

A pak jej spusťte pomocí aktualizovaného příkazu spuštění, který přidá --mount příznak pro konfiguraci zdrojového svazku a cílového cíle.

docker run -d 
  --name devtest 
  --mount source=nginx-config,target=/etc/nginx 
  nginx:latest

Pokud používáte Docker Compose, můžete tento proces automatizovat a sledovat snadněji, protože konfigurace svazku je řešena prostřednictvím souboru nastavení. budete muset přidat svazek do docker-compose.yml soubor:

version: "3.0"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /docker/nginx-config/:/etc/nginx/

Poté můžete restartovat služby Docker Compose. Compose má příkaz „restart“, ale ve skutečnosti slouží pouze k obnovení běžící služby bez jakýchkoli změn konfigurace. Pokud chcete obrázky aktualizovat, budete muset spustit docker-compose up pomocí --build příznak:

docker-compose up -d --build

Můžete také ručně spustit docker-compose down předem zastavit služby, ale ve většině případů to není nutné, pokud je nechcete spouštět pomocí -v příznak zničit existující svazky.

SOUVISEJÍCÍ: Co je Docker Compose a jak jej používáte?

Klonování ze stávajícího kontejneru

Téměř ve všech případech byste neměli být závislí na aktuálním provozním stavu kontejneru. Vše, na čem vám záleží, jako jsou data aplikací, by mělo být uloženo na svazku, aby to bylo možné přetrvávat při restartování a přestavbě kontejneru.

Tato metoda pravděpodobně není pro většinu lidí dobrý nápad, protože vyžaduje, abyste pokaždé, když to chcete udělat, vytvořili nový obrázek, a stále to vyžaduje prostoje. Pokud však potřebujete přidat svazek do běžícího kontejneru, můžete použít docker commit vytvořit nový obrázek založený na tomto kontejneru a poté jej naklonovat s novým svazkem.

Získejte ID kontejneru z docker ps :

docker ps

A poté jej naklonujte pomocí commit :

docker commit f88f33c918d2 imagename

Poté můžete spustit nový obraz a nahradit starý obraz klonovaným.

docker run -d 
  --name devtest 
  --mount source=nginx-config,target=/etc/nginx 
  imagename

Hacky řešení

Svazky Dockeru jsou ve skutečnosti jen triky, které runtime Docker používá k vystavení hostitelských adresářů kontejnerům, a vše závisí na konfiguraci. Z tohoto důvodu můžete skutečně upravit tuto konfiguraci přímo a restartovat celého démona Docker pro váš systém, aby se tyto změny použily, aniž byste museli restartovat.

To je samozřejmě mnohem složitější než pouhé řešení restartu kontejneru, takže pokud zvládnete minutu výpadku, důrazně doporučujeme udělat to.

Budete muset přejít do adresáře úložiště Docker:

cd /var/lib/docker/containers

Zde bude mnoho složek odpovídajících ID kontejnerů Docker, které můžete najít pomocí docker ps . Otevřete ten pro kontejner, který chcete upravit.

Konfigurační soubor je config.v2.json , ale je v kompaktním formátu a těžko se upravuje. Můžete nainstalovat jq pěkně vytiskněte JSON na příkazovém řádku a přeneste jej do nového souboru pro úpravy:

jq . config.v2.json > tmp.json

Budete se muset posunout dolů a najít „MountPoints“, který obsahuje konfiguraci pro všechny svazky a připojení připojení. Zde můžete přidat nový, který by měl být v následujícím formátu:

  "MountPoints": {
    "/home/container": {
      "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933",
      "Destination": "/home/container",
      "RW": true,
      "Name": "",
      "Driver": "",
      "Type": "bind",
      "Propagation": "rprivate",
      "Spec": {
        "Type": "bind",
        "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933",
        "Target": "/home/container"
      },
      "SkipMountpointCreation": true
    }
  },

Poté, jakmile to bude hotové, můžete JSON znovu minifikovat zpět do konfiguračního souboru:

jq -c . tmp.json > config.v2.json

jq je výkonný nástroj, takže pokud byste chtěli tento proces zcela automatizovat, můžete to udělat.

SOUVISEJÍCÍ: Jak pracovat s JSON na příkazovém řádku

Poté jednoduše restartujte službu Docker, abyste použili změny:

sudo service docker restart

Docker
  1. Jak nainstalovat WordPress pomocí Docker

  2. Jak spustit program uvnitř kontejneru Docker?

  3. Shell:Zkontrolujte, zda existuje kontejner Docker?

  1. Jak spustit MySQL v kontejneru Docker

  2. Jak nainstalovat Vim do kontejneru Docker

  3. Jak přidat uživatele do kontejneru Docker?

  1. Jak SSH do kontejneru Docker

  2. Jak spustit příkaz na spuštěném kontejneru Docker

  3. Jak přiřadit statickou IP ke kontejneru Docker