Dockerfile Ubuntu: Průvodce pro vývojáře začátečníky

目次

1. Úvod

Co jsou Docker a Dockerfile?

V posledních letech si Docker rychle získal popularitu jako prostředek pro zjednodušení nastavení vývojových prostředí a nasazení aplikací. Docker má jedinečnou schopnost zabalit aplikaci a její závislosti do jediného „kontejneru“, který pak může být spuštěn ve stejném prostředí kdekoli. Pro vytvoření tohoto Docker kontejneru je potřeba šablona nazývaná „Dockerfile“. Dockerfile je textový soubor, který určuje základní obraz OS, software k instalaci, nastavení proměnných prostředí a další. Vývojáři mohou tento soubor použít k automatickému vytvoření přizpůsobených prostředí.

Důvody pro výběr Ubuntu jako základního obrazu

Při tvorbě Dockerfile je prvním krokem určení základního obrazu OS. Mezi mnoha možnostmi je Ubuntu obzvláště populární. Ubuntu je na Debianu založená linuxová distribuce známá svou snadnou použitelností a flexibilitou pro tvorbu různorodých prostředí díky rozsáhlému repozitáři balíčků. Dockerfile založený na Ubuntu nabízí následující výhody:

  • Dostupná bohatá oficiální i komunitní dokumentace, což snižuje křivku učení.
  • Mnoho balíčků a nástrojů lze snadno nainstalovat pomocí APT (Advanced Package Tool).
  • Lehké minimální obrazy (např. ubuntu:20.04, ubuntu:24.04) jsou poskytovány oficiálně.

Účel a cílové publikum tohoto článku

V tomto článku se zaměříme na klíčové slovo „Dockerfile Ubuntu“ a poskytneme srozumitelný výklad pro začátečníky, jak vytvořit Dockerfile založený na Ubuntu. Konkrétně podrobně pokryjeme vše od základní struktury Dockerfile po kroky skutečného vytvoření Ubuntu prostředí, příklady instalace aplikačních prostředí jako Python a běžné chyby s jejich řešeními. Tento článek je určen pro:

  • Ty, kteří chtějí poprvé vytvořit prostředí pomocí Dockerfile.
  • Ty, kteří chtějí vytvořit reprodukovatelné vývojové prostředí na Ubuntu.
  • Ty, kteří chtějí prohloubit své znalosti, včetně řešení problémů.

2. Základní struktura Dockerfile

Co je Dockerfile? Porozumění jeho roli

Dockerfile je jako recept na vytvoření Docker obrazu. Konkrétně jde o textový soubor, který popisuje, jaký základní OS použít, jaký software nainstalovat a jaké konfigurace aplikovat. Spuštěním příkazu docker build s tímto souborem můžete snadno vytvořit vysoce reprodukovatelné vývojové a aplikační prostředí. Výhody používání Dockerfile:

  • Automatizace nastavení prostředí (není potřeba opakovat ruční kroky).
  • Eliminace nesrovnalostí v prostředí při vývoji v týmu.
  • Snadná integrace do CI/CD pipeline.

Často používané základní instrukce (direktivy) v Dockerfile

Dockerfile obsahuje několik instrukcí (direktiv), přičemž následující jsou nejreprezentativnější. Tyto instrukce vhodně zkombinujeme pro vytvoření Dockerfile založeného na Ubuntu.

InstructionDescription
FROMSpecifies the base Docker image. Example: FROM ubuntu:24.04
RUNExecutes shell commands. Used for package installation, etc.
COPYCopies local files into the image.
ADDSimilar to COPY, but also allows fetching from URLs and extracting archives.
WORKDIRSets the working directory.
ENVSets environment variables.
CMDDefines the command to be executed when the container starts (can be overridden).
ENTRYPOINTSimilar to CMD, but defines a command that is always executed.

Minimální příklad Dockerfile založeného na Ubuntu

Níže je velmi jednoduchý příklad Dockerfile založeného na Ubuntu.

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y
    curl
    vim

CMD ["/bin/bash"]

Tento Dockerfile je nastaven tak, aby používal Ubuntu 24.04 jako základ, nainstaloval dva nástroje (curl a vim) a nakonec spustil bash shell.

O výběru tagů Ubuntu

Obrazy Ubuntu jsou k dispozici v oficiálním repozitáři Docker Hub. Zatímco specifikace ubuntu:latest použije nejnovější verzi, doporučuje se explicitně uvést konkrétní verzi. Například:

  • ubuntu:22.04 (LTS: Long Term Support verze, klade důraz na stabilitu)
  • ubuntu:24.04 (nejnovější kandidát LTS, klade důraz na funkce)

Zvažte, zda dáváte přednost stabilitě nebo novým funkcím, podle vašeho účelu.

3. Praktikum: Vytvoření Dockerfile založeného na Ubuntu

Instalace potřebných balíčků pro Ubuntu prostředí

Při budování prostředí Ubuntu pomocí Dockerfile budete často potřebovat instalovat další balíčky. Například následující nástroje se běžně používají k nastavení vývojového prostředí:

  • curl : Pro stahování souborů a kontrolu API.
  • vim : Jednoduchý textový editor.
  • git : Nástroj pro správu verzí.
  • build-essential : Sbírka základních nástrojů nezbytných pro budování programů v C/C++.

Pro instalaci těchto v Dockerfile použijte instrukci RUN.

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y
    curl
    vim
    git
    build-essential

Spuštěním apt-get update nejprve zajistíte, že se před instalací získají nejnovější seznamy balíčků.

Nastavení Neinteraktivní Instalace

V Ubuntu může apt-get install vyžadovat vstup od uživatele, ale interaktivní operace nejsou během procesu sestavování Dockeru možné. Proto se doporučuje nastavit proměnnou prostředí následovně, aby se instalace provedla v neinteraktivním režimu.

ENV DEBIAN_FRONTEND=noninteractive

To přeskočí výzvy, jako je „Nastavení regionu“, které se objevují během konfigurace balíčků, a umožní hladký průběh instalace.

Snížení Velikosti Obrazu Odstraněním Nepotřebného Cache

Při používání APT mohou v obraze zůstat stažené dočasné soubory (cache), což zvětšuje finální Docker obraz. Velikost obrazu můžete snížit odstraněním tohoto cache následovně:

RUN apt-get update && apt-get install -y
    curl
    vim
    && rm -rf /var/lib/apt/lists/*

Tím, že kombinujete více příkazů do jediné instrukce RUN takto, můžete také zabránit vytváření nepotřebných vrstev.

Nejlepší Praxe: Organizace Vašeho Dockerfile

V skutečných vývojových prostředích se doporučují následující nejlepší praxe pro psaní Dockerfile:

  • Kombinujte instrukce RUN co nejvíce, aby se snížil počet vrstev.
  • Explicitně definujte verze a konfigurace pomocí ENV.
  • Používejte komentáře k jasnému uvedení účelu každé operace.
  • Používejte rm a --no-install-recommends, aby se zabránilo ponechání nepotřebných souborů.

Příklad:

RUN apt-get update && apt-get install -y --no-install-recommends
    curl
    git
    && rm -rf /var/lib/apt/lists/*

Tímto způsobem můžete sestavit lehčí a udržitelnější Dockerfile.

4. Sestavování a Ověřování Docker Obrazu

Sestavování Docker Obrazu z Dockerfile

Až napišete svůj Dockerfile, dalším krokem je sestavit Docker obraz. To se provádí pomocí příkazu docker build. Spusťte následující příkaz v adresáři, kde se nachází váš Dockerfile:

docker build -t my-ubuntu-image .
  • Možnost -t se používá k zadání názvu (tagu) obrazu. V tomto příkladu ho pojmenováváme my-ubuntu-image.
  • . odkazuje na aktuální adresář, kde se nachází Dockerfile.

Když spustíte tento příkaz, Docker sekvenčně přečte instrukce v Dockerfile a podle nich sestaví nový obraz.

Ověřování Sestaveného Docker Obrazu

Po dokončení vytvoření obrazu ho můžete ověřit následujícím příkazem:

docker images

To zobrazí seznam Docker obrazů, které existují lokálně, a můžete zkontrolovat následující informace:

  • REPOSITORY (název obrazu)
  • TAG (tag)
  • IMAGE ID (unikátní identifikátor)
  • CREATED (datum a čas vytvoření)
  • SIZE (velikost)

Příklad:

REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
my-ubuntu-image    latest    abcd1234abcd    5 minutes ago   189MB

To potvrzuje, že obraz, který jste vytvořili, byl úspěšně zaregistrován.

Spouštění Docker Kontejneru a Ověřování Funkčnosti

Pro ověření, že vytvořený obraz funguje správně, spusťme Docker kontejner. Použijte následující příkaz:

docker run -it my-ubuntu-image
  • Specifikace volby -it vám umožní spustit terminál v interaktivním režimu.
  • Pokud se spustí úspěšně, v kontejneru se objeví výzva bash a budete ve stavu, jako byste se přihlásili do prostředí Ubuntu.

Uvnitř kontejneru můžete spustit příkazy jako následující, abyste zkontrolovali, zda nainstalované nástroje fungují správně:

curl --version
vim --version

Pokud nejsou žádné problémy, Dockerfile byl úspěšně vytvořen.

Odstranění nepotřebných obrazů a kontejnerů

Jak opakujete sestavování a experimenty, mohou se lokálně hromadit nepotřebné Docker obrazy a kontejnery. Doporučuje se je pravidelně čistit pomocí následujících příkazů:

  • Odstranění zastavených kontejnerů:
    docker container prune
    
  • Odstranění nepoužívaných obrazů:
    docker image prune
    
  • Odstranění všech nepoužívaných dat (Pozor!):
    docker system prune
    

Tyto operace pomáhají šetřit místo na disku a předzet problémům.

5. Aplikace: Vytvoření Python prostředí

Zpřístupnění Pythonu v Dockerfile založeném na Ubuntu

Přidáním Python prostředí při vytváření Ubuntu prostředí pomocí Dockerfile můžete podpořit širokou škálu použití, jako je vývoj, testování a strojové učení. I když Ubuntu může mít Python předinstalovaný, běžnou praxí je jej explicitně vytvořit s ohledem na správu verzí a balíčků.

Jak nainstalovat Python pomocí apt

Nejjednodušší způsob je nainstalovat Python pomocí balíčků APT. Zde je příklad:

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y
    python3
    python3-pip
    && rm -rf /var/lib/apt/lists/*

Tímto způsobem můžete použít stabilní verzi Pythonu nainstalovanou v systému (obvykle Python 3.10 nebo 3.12 atd.). Navíc můžete přidávat Python balíčky pomocí příkazu pip.

Správa verzí Pythonu pomocí pyenv

Pokud chcete použít konkrétní verzi Pythonu nebo přepínat mezi více verzemi, je pohodlné použít pyenv.
Níže je příklad použití pyenv k instalaci Pythonu 3.11.6 v Dockerfile:

FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y
    git
    curl
    make
    build-essential
    libssl-dev
    zlib1g-dev
    libbz2-dev
    libreadline-dev
    libsqlite3-dev
    wget
    llvm
    libncurses5-dev
    libncursesw5-dev
    xz-utils
    tk-dev
    libffi-dev
    liblzma-dev
    && rm -rf /var/lib/apt/lists/*

# Install pyenv
RUN git clone [https://github.com/pyenv/pyenv.git](https://github.com/pyenv/pyenv.git) ~/.pyenv

ENV PYENV_ROOT="$HOME/.pyenv"
ENV PATH="$PYENV_ROOT/bin:$PATH"

RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc

# Install a specific Python version
RUN pyenv install 3.11.6 && pyenv global 3.11.6

To vám umožní flexibilněji vytvářet a spravovat vaše Python prostředí.

Správa balíčků pomocí requirements.txt

V reálných projektech často potřebujete více Python knihoven. requirements.txt se používá k jejich správě.
Nejprve připravte soubor requirements.txt v kořenovém adresáři vašeho projektu:

flask==2.3.2
requests>=2.25.1
pandas

Poté jej popište v Dockerfile následovně:

COPY requirements.txt /app/requirements.txt
WORKDIR /app

RUN pip install --no-cache-dir -r requirements.txt

To vám umožní nainstalovat potřebné knihovny najednou,ímž se zvýší reprodukovatelnost vašeho vývojového prostředí.

Nejlepší postupy

  • Při používání Pythonu může vytvoření virtuálního prostředí pomocí virtualenv nebo venv pomoci předejít konfliktům závislostí.
  • Velikost Docker obrazu můžete snížit odstraněním cache ( --no-cache-dir ).
  • Instalace nejnovější verze pip pomocí pip install --upgrade pip před instalací Python balíčků může předejít chybám.

6. Časté problémy a řešení

Chyby oprávnění

Příklad:

Permission denied

Toto se stane, když zkopírovaný soubor nemá práva k vykonání nebo když vlastník souboru/vykonávající uživatel není vhodný.

Řešení:

  • Udělejte soubor spustitelným:
    RUN chmod +x script.sh
    
  • Změňte uživatele, pokud je to nutné:
    RUN chown root:root /path/to/file
    

Balíček nenalezen nebo nelze nainstalovat

Příklad:

E: Unable to locate package xxx

Tato chyba nastane, když nebyl spuštěn apt-get update nebo když je název zadaného balíčku nesprávný.

Řešení:

  • Vždy napište apt-get update před install :
    RUN apt-get update && apt-get install -y curl
    
  • Zkontrolujte název balíčku na překlepy a ujistěte se, že je správný.

Chyby související se sítí

Příklad:

Temporary failure resolving 'deb.debian.org'

Tento typ chyby nastane, když selže řešení DNS během procesu sestavení.

Řešení:

  • Restartování Docker démona může problém vyřešit:
    sudo systemctl restart docker
    
  • Zkontrolujte nastavení DNS Dockeru (přidejte specifikace DNS do /etc/docker/daemon.json ):
    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }
    

Sestavení zůstává ve starém stavu kvůli efektům mezipaměti

Docker používá vrstvu po vrstvě mezipaměť pro rychlost. V důsledku toho se i když upravíte Dockerfile, nemusí se sestavit podle záměru, protože se znovu používají vrstvy mezipaměti.

Řešení:

  • Sestavte znovu bez použití mezipaměti:
    docker build --no-cache -t my-image .
    

Příkaz spuštění v kontejneru selže při vykonání nebo okamžitě skončí

Příčiny:

  • Příkaz zadaný v CMD nebo ENTRYPOINT narazí na chybu.
  • I když zadáte ["/bin/bash"] v CMD , skončí okamžitě, pokud neběží interaktivně.

Řešení:

  • Spusťte kontejner pro ladění a zkontrolujte:
    docker run -it my-image /bin/bash
    
  • Pochopte rozdíl mezi CMD a ENTRYPOINT a použijte je vhodně pro svůj účel.

Zkušenostmi s těmito problémy se vaše dovednosti v návrhu Dockerfile určitě zlepší. Když narazíte na problém, klidně si přečtěte chybovou zprávu a pečlivě vystopujte, která vrstva nebo instrukce je příčinou.

7. Závěr

Opětovné potvrzení klíčových bodů pro vytváření Dockerfile založených na Ubuntu

V tomto článku jsme krok za krokem vysvětlili od základních po pokročilé metody jak sestavit prostředí Ubuntu pomocí Dockerfile. Zopakujme zde důležité body.

  • Porozumění základní struktuře Dockerfile je prvním krokem. Automatizaci nastavení prostředí můžete dosáhnout kombinací instrukcí jako FROM , RUN , CMD a ENV .
  • Ubuntu je stabilní a vysoce flexibilní základní obraz. Jeho bohatý repozitář balíčků, velká uživatelská základna a dostupnost verzí LTS ho činí vhodným základem pro vývojová prostředí.
  • Potřebné nástroje a knihovny můžete instalovat prostřednictvím praktického spravování balíčků . Znalost toho, jak používat apt-get , odstraňovat mezipaměť a provádět neinteraktivní instalace, je klíčová.
  • Sestavení praktických prostředí jako Python je také možné s Dockerfile. Nástroje jako pyenv , pip a requirements.txt vám umožní vytvořit vysoce reprodukovatelná vývojová prostředí.
  • Dovednosti řešení problémů přímo vedou k stabilnímu provozu. Porozumění běžným pastím, jako jsou oprávnění, síťové problémy a mezipaměť sestavení, může výrazně zlepšit efektivitu vývoje.

Další kroky pro učení Dockerfile

Schopnost pracovat s Dockerfile vám umožní podporovat širokou škálu použití, nejen ve vývoji, ale také v testování a nasazování do produkčních prostředí. Pro budoucí učení by bylo prospěšné přejít k následujícím tématům:

  • Správa konfigurací s více kontejnery pomocí Docker Compose .
  • Integrace s nástroji CI/CD (GitHub Actions, GitLab CI atd.) .
  • Interoperabilita s nástroji pro orchestraci kontejnerů, jako je Kubernetes .

8. FAQ (Často kladené otázky)

Otázka 1. Kterou verzi Ubuntu bych měl zvolit ve svém Dockerfile?

A1. Základně, pokud upřednostňujete stabilitu a dlouhodobou podporu, je běžné zvolit verzi LTS (Long Term Support). Například ubuntu:22.04 a ubuntu:20.04 se používají v mnoha vývojových prostředích a lze je používat s důvěrou díky jejich 5letému období podpory. Na druhé straně, pokud chcete používat nejnovější balíčky a verze jazyků, můžete zvolit novější vydání jako ubuntu:24.04, ale doporučujeme to předem otestovat.

Q2. Proč dostávám „Package not found“ při používání apt-get install?

A2. Nejběžnější důvod je, že jste předem nespustili apt-get update. Pokud se pokusíte instalovat bez aktualizace seznamu balíčků, dostanete chybu, protože odpovídající balíček nelze nalézt ve starém seznamu. Příklad správného použití:

RUN apt-get update && apt-get install -y curl

Také buďte opatrní s překlepy v názvech balíčků a zastaralými názvy balíčků (např. python3 místo python).

Q3. Jak nastavuji proměnné prostředí v Dockerfile?

A3. Nastavujete proměnné prostředí pomocí instrukce ENV. Tato proměnná prostředí bude platit během buildingu i běhu kontejneru. Příklad:

ENV DEBIAN_FRONTEND=noninteractive

Toto je typické nastavení používané k potlačení interaktivních výzev během instalace APT. Používá se také k nastavení konfigurací aplikací a API klíčů v Dockerfile.

Q4. Jaký je rozdíl mezi CMD a ENTRYPOINT v Dockerfile?

A4. Oba specifikují příkazy, které se mají spustit při startu kontejneru, ale existují rozdíly v jejich použití a chování.

ItemCMDENTRYPOINT
OverridableCan be overridden by the docker run commandBasically not overridden (treated as arguments)
UsageSets the default execution commandDefines a command that should always be executed

Příklad:

CMD ["python3", "app.py"]
# vs
ENTRYPOINT ["python3"]
CMD ["app.py"]

V druhém případě můžete předat CMD jako argument ve formě docker run my-image another_script.py.

Q5. Upravil jsem svůj Dockerfile, ale změny se neprojeví. Proč?

A5. Docker používá cache během procesu buildingu, takže i když provedete malé změny v Dockerfile, mohou se stále používat cachované vrstvy. Řešení:

docker build --no-cache -t my-image .

Toto provede nový build bez použití cache a všechny změny se projeví.

侍エンジニア塾