- 1 1. Úvod
- 2 2. Základní struktura Dockerfile
- 3 3. Praktikum: Vytvoření Dockerfile založeného na Ubuntu
- 4 4. Sestavování a Ověřování Docker Obrazu
- 5 5. Aplikace: Vytvoření Python prostředí
- 6 6. Časté problémy a řešení
- 7 7. Závěr
- 8 8. FAQ (Často kladené otázky)
- 8.1 Otázka 1. Kterou verzi Ubuntu bych měl zvolit ve svém Dockerfile?
- 8.2 Q2. Proč dostávám „Package not found“ při používání apt-get install?
- 8.3 Q3. Jak nastavuji proměnné prostředí v Dockerfile?
- 8.4 Q4. Jaký je rozdíl mezi CMD a ENTRYPOINT v Dockerfile?
- 8.5 Q5. Upravil jsem svůj Dockerfile, ale změny se neprojeví. Proč?
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.
| Instruction | Description |
|---|---|
FROM | Specifies the base Docker image. Example: FROM ubuntu:24.04 |
RUN | Executes shell commands. Used for package installation, etc. |
COPY | Copies local files into the image. |
ADD | Similar to COPY, but also allows fetching from URLs and extracting archives. |
WORKDIR | Sets the working directory. |
ENV | Sets environment variables. |
CMD | Defines the command to be executed when the container starts (can be overridden). |
ENTRYPOINT | Similar 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
RUNco 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
rma--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
-tse používá k zadání názvu (tagu) obrazu. V tomto příkladu ho pojmenovávámemy-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
-itvá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í
virtualenvnebovenvpomoci 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 pippř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 updatepředinstall: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
CMDneboENTRYPOINTnarazí na chybu. - I když zadáte
["/bin/bash"]vCMD, 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
CMDaENTRYPOINTa 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,CMDaENV. - 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,piparequirements.txtvá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í.
| Item | CMD | ENTRYPOINT |
|---|---|---|
| Overridable | Can be overridden by the docker run command | Basically not overridden (treated as arguments) |
| Usage | Sets the default execution command | Defines 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í.



