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

Jak zmenšit velikost obrázku Docker v kontejnerech Docker

Trvá vytvoření a nasazení vašeho obrazu Dockeru příliš dlouho? Trvá export hodiny? Přestaňte ztrácet čas a urychlete tyto procesy vytvořením menšího obrazu. V tomto tutoriálu se naučíte tři triky, jak zmenšit velikost obrázku Docker.

Začněme!

Předpoklady

Tento tutoriál bude praktickou ukázkou. Pokud je chcete sledovat, ujistěte se, že máte následující:

  • Docker Desktop nebo Engine. K dispozici jsou verze Dockeru pro Linux, Windows a macOS. Tento tutoriál používá Docker verze 20.10.8 sestavení 3967b7d na počítači Ubuntu 18.04 LTS.
  • Node.js. Tento výukový program používá Node.js verze 10.10.0, ale měl by fungovat i s novějšími verzemi.
  • Budete potřebovat editor kódu, jako je Visual Studio Code, vim a nano . Tento tutoriál používá nano.

Vytvoření obrázku Docker

Pravděpodobně již máte kolem sebe obrázek Dockeru, který chcete zmenšit. ne V tomto tutoriálu začnete znovu vytvořením obrazu Docker pro vaše testování.

Začnete vytvořením kontejneru pro aplikaci Node.js Aplikace Node.js, kterou budete používat, je příklad Hello World Express.js, který zobrazuje text „Ahoj světe!“ ve vašem prohlížeči.

1. Nejprve otevřete relaci terminálu a vytvořte adresář, kde vytvoříte svůj obraz Dockeru a související soubory. V tomto příkladu bude pracovní adresář ~/docker_demo .

# Create the project directory
mdkir ~/docker_demo
# Change the current directory to your working directory
cd ~/docker_demo

Dále vytvořte tři soubory ve svém pracovním adresáři. Tyto soubory jsou:

  • index.js – výchozí bod pro vaši ukázkovou aplikaci.
  • package.json – obsahuje metadata vaší aplikace.
  • Dockerfile – obsahuje pokyny pro vytvoření vašeho obrazu Docker. Spusťte níže uvedený příkaz v terminálu a vytvořte všechny tyto soubory najednou.
touch index.js package.json Dockerfile

3. Otevřete index.js v editoru kódu jej vyplňte níže uvedeným kódem a uložte.

const express = require('express')
const app = express()

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(3000, () => {
  console.log(`Example app listening on port 3000!`)
})

4. Dále otevřete soubor package.json soubor pro úpravu, zkopírujte a vložte níže uvedený kód a uložte.

{
  "name": "hello-world",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "express": "^4.16.2"
  },
  "scripts": {
    "start": "node index.js"
  }
}

5. Stejným způsobem upravte Dockerfile k vyplnění níže uvedeného kódu a uložení souboru.

# use the Node.js parent image 
FROM node:8 

# set a directory for the app
WORKDIR /app
# copy all the files to the container
COPY . .
# install dependencies
RUN npm install
# define the port number the container should expose
EXPOSE 3000

# run the application
CMD ["npm", "start"]

6. Spusťte následující docker build příkaz k vytvoření obrazu Dockeru. Volitelný -t flag označí váš obrázek názvem, aby byl identifikovatelný. Tento příklad používá název 'moje_aplikace.'

docker build -t my_app .

7. Když Docker dokončí vytváření obrázku, spusťte následující příkaz a zobrazte obrázek označený ‘my_app.‘

The grep příkaz je k dispozici pouze v systému Linux, ale chcete-li obrázek zobrazit v jiných operačních systémech, spusťte příkaz docker images a vyhledejte obrázek se značkou „moje_aplikace“.

docker images | grep my_app

Jak ukazuje následující obrázek, velikost obrázku Dockeru je 904 MB.

8. Nyní ověřte, zda váš obrázek funguje správně. Proveďte následující příkaz spuštění dockeru. Tento příkaz použije váš obrázek Docker k vytvoření kontejneru, kde bude vaše aplikace spuštěna.

docker run -p 3000:3000 -ti --rm --init my_app

Pokud se aplikace spustí správně, zobrazí se zpráva „Ukázková aplikace naslouchající na portu 3000!“ budou vytištěny na vašem terminálu.

9. Chcete-li ověřit, zda vaše aplikace funguje, otevřete prohlížeč a přejděte na adresu http://localhost:3000/. Text ‚Ahoj světe!‘ by měl být zobrazen tak, jak je znázorněno na následujícím obrázku.

10. Chcete-li ukončit aplikaci a vrátit se na výzvu terminálu, stiskněte CTRL+C .

Zmenšení velikosti obrázku Docker

Nyní, když máte obrázek Docker, je čas naučit se, jak zmenšit velikost obrázku! Následující části pokrývají tři způsoby, jak zmenšit velikost obrázku Docker.

Metoda 1:Použití vícestupňových sestav

Mít samostatné soubory Dockerfile pro vývoj a produkci bylo běžnou praxí.

Vývojový Dockerfile obsahoval vše potřebné k sestavení aplikace, zatímco produkční obsahoval to, co aplikace potřebovala ke svému běhu. Tato metoda vytváří finální produkční obraz s optimální velikostí. Ale správa dvou Dockerfiles je zbytečně komplikovaná.

Od zavedení vícestupňových sestavení ve verzi 17.05 nyní vývojáři potřebují pouze jeden Dockerfile obsahující více FROM pokyny k oddělení vývojové a výrobní fáze sestavení. Tedy selektivní kopírování artefaktů z jedné fáze sestavení do druhé.

Nyní je čas použít ve svém obrazu vícefázové sestavení!

1. Otevřete svůj Dockerfile v editoru kódu a nahraďte jeho obsah následujícím kódem. Tento nový kód Dockerfile má dvě fáze sestavení, jak je označeno dvěma FROM linky.

Fáze sestavení standardně nemají názvy a váš kód na ně může odkazovat pouze jako na celé číslo v pořadí, v jakém se objevují (počínaje nulou) v souboru Dockerfile. Můžete připojit as <name> do FROM řádek pro přiřazení názvu k fázi sestavení pro lepší identifikaci .

# the develop build stage using the node parent image
FROM node:8 as develop

# set a directory for the app
WORKDIR /app
# copy all the files to the container
COPY . .
# install dependencies
RUN npm install

# the production build stage using the node parent image
FROM node:8

# Copy only the build artifact from the first (develop) build stage
# Any intermediate artifacts used to build your application are not included in the final image.
COPY --from=develop /app /

# define the port number the container should expose
EXPOSE 3000

# run the application
CMD ["npm", "start"]

2. Vytvořte svůj nový obrázek s názvem my_app_multi_stage_builds provedením následujícího příkazu.

docker build -t my_app_multi_stage_builds .

3. Po sestavení zobrazte aktualizovanou velikost obrazu provedením následujícího příkazu.

docker images | grep my_app_multi_stage_builds

Ukázková aplikace je malá a má pouze několik přechodných artefaktů. Stále je zde ale snížení o 1 MB oproti předchozímu sestavení obrazu Dockeru.

Metoda 2:Použití odlehčeného nadřazeného obrázku

Pokud nevytvoříte obrázek Dockeru od začátku (pomocí FROM scratch direktiva), každý obrázek Dockeru má nadřazený obrázek. Dockerfile soubory v předchozích částech používají node:8 jako nadřazený obrázek během sestavení.

Pokud vaše aplikace ke spuštění nevyžaduje konkrétní verzi operačního systému, zvažte výměnu nadřazené bitové kopie za jinou odlehčenou. Pokud používáte Linux, nejlehčí obraz v Docker Hub je Alpine.

Nyní je čas se naučit, jak nahradit nadřazený obrázek Alpine!

1. Upravte svůj Dockerfile a nahraďte druhý FROM node:8 řádek s FROM node:8-alpine . Tento nový FROM instrukce, Docker, bude používat node-8-alpine jako nadřazený obrázek. Nyní váš konečný obrázek poběží na Alpine namísto Node.

# the first build stage using the node parent image
FROM node:8 as build

# set a directory for the app
WORKDIR /app
# copy all the files to the container
COPY . .
# install dependencies
RUN npm install

# the second build stage using the node-8-alpine parent image
FROM node:8-alpine

# copy the required artifacts to from the first build stage
COPY --from=build /app /
# define the port number the container should expose
EXPOSE 3000

# run the application
CMD ["npm", "start"]

2. Spusťte níže uvedený příkaz a vytvořte obraz Dockeru s názvem my_app_alpine.

docker build -t my_app_alpine .

3. Nakonec zobrazte aktualizovanou velikost obrázku provedením následujícího příkazu.

docker images | grep my_app_alpine

Konečná velikost obrázku Dockeru je nyní pouze 75,2 MB. Výrazné snížení o 827,8 MB!

Metoda 3:Vytvoření souboru .dockerignore

Docker je aplikace typu klient-server sestávající z klienta Docker nebo CLI a démona Docker, který spravuje obrazy Docker (a kontejnery, sítě a svazky).

CLI zkompiluje kontext sestavení skládající se ze souborů, které mají být zahrnuty do obrázku k sestavení. CLI také hledá soubor .dockerignore se seznamem souborů, které je třeba ignorovat, než odešle kontext sestavení démonu Docker. Výsledkem je, že kopírování menšího počtu souborů snižuje velikost obrazu Docker.

Nyní je čas použít soubor .dockerignore do vašeho sestavení!

1. Nejprve vytvořte nový prázdný soubor s názvem .dockerignore .

touch .dockerignore

2. Dále vytvořte fiktivní soubor, který bude Docker během sestavování ignorovat. V tomto příkladu vytvořte fiktivní soubor README.md o velikosti 2 MB.

Pokud používáte počítač se systémem Linux, vytvořte soubor spuštěním příkazu fallocate níže.

fallocate -l 2MB README.md

Pokud používáte počítač se systémem Windows, spusťte místo toho příkaz fsutil.

fsutil file createnew README.md 2000000

3. Dále vytvořte svůj nový obraz Docker provedením následujícího příkazu. Protože je soubor README.md ve stejném adresáři, očekávejte, že tento fiktivní soubor bude součástí výsledného obrazu Dockeru.

docker build -t my_app_readme .

4. Zobrazte aktualizovanou velikost obrázku provedením následujícího příkazu.

docker images | grep my_app_readme

Jak se očekávalo, se zahrnutím souboru README.md se konečná velikost obrazu Docker zvětšila o 2 MB.

5. Nyní vylučte všechny soubory s .md rozšíření z sestavení obrázku. Chcete-li tak učinit, upravte soubor .dockerignore soubor a vyplňte jej následujícím kódem.

# ignore markdown files
.md

Soubory Markdown (.md) obvykle neovlivňují funkčnost aplikace a lze je obecně bezpečně vyloučit ze sestav. Další soubory, které můžete vyloučit, jsou protokoly sestavení, testovací skripty, složka .git vašeho úložiště a jakékoli soubory obsahující citlivé informace (jako jsou hesla).

6. Nyní, když jste aktualizovali ignorovaný soubor, znovu spusťte příkaz sestavení obrazu Dockeru, jak je znázorněno níže.

docker build -t my_app_dockerignore .

7. Nakonec spusťte níže uvedený příkaz a zobrazte novou velikost obrazu Docker, včetně souboru README.md.

docker images | grep my_app_dockerignore

Nyní, když je soubor README.md mimo nové sestavení, velikost obrazu Docker je snížena na 75,2 MB!

Závěr

V tomto kurzu jste se naučili různé metody, jak zmenšit velikost obrázku Docker. Naučili jste se používat vícefázové sestavení, sestavit z menšího nadřazeného obrazu a vyloučit nepodstatné soubory.

Až bude příště Dockeru trvat sestavení a nasazení příliš dlouho, nezdržujte se a použijte své znalosti k optimalizaci velikosti obrázku Dockeru. Kterou metodu si myslíte, že budete používat nejčastěji?


Docker
  1. Jak zmenšit velikost obrázku Docker:6 metod optimalizace

  2. Jak používat Docker Compose

  3. Jak připojit kontejnery Docker

  1. Jak použít Dockerfile k vytvoření Docker Image

  2. Jak vypsat Docker kontejnery

  3. Jak zacházet s aktualizacemi zabezpečení v kontejnerech Docker?

  1. Jak předávat proměnné prostředí do kontejnerů Docker

  2. Jak upravit obrázky Docker

  3. Jak potvrdit změny v obrazu Dockeru