Docker Introduction
Installation
Docker je možné nainštalovať dvoma spôsobmi - buď priamo z balíčka distribúcie alebo stiahnutím zo stránok http://docker.com.
Inštalácia z balíčkov distribúcie
V prípade, že používate distribúciu založenú na distribúcii Debian (ako napr. Ubuntu):
sudo apt-get install docker
V prípade, že používate distribúciu založenú na distribúcii RedHat (ako napr. Fedora):
$ sudo dnf install docker
$ sudo systemctl start docker
Inštalácia z oficiálnej stránky
$ curl -fsSL https://get.docker.com/ | sh
Poinštalačná konfigurácia
Pridanie do skupiny docker:
$ sudo usermod -aG docker ${USER}
Spustenie docker démona, ak nie je spustený:
$ sudo systemctl start docker
Vytvorenie skupiny docker a priradenie používateľa do nej, aby nebolo potrebné spúšťať docker cez sudo:
$ sudo groupadd docker && sudo gpasswd -a ${USER} docker && sudo systemctl restart docker
$ newgrp docker
Overenie inštalácie
Zobrazenie verzie nainštalovaného docker-u
$ docker version
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-common-1.12.6-6.gitae7d637.fc25.x86_64
Go version: go1.7.4
Git commit: ae7d637/1.12.6
Built: Mon Jan 30 16:15:28 2017
OS/Arch: linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
Spustenie kontajnera s názvom hello-world
$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://cloud.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
Zobrazenie všetkých kontajnerov v systéme
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6e8100709d7 hello-world "/hello" About a minute ago Exited (0) About a minute ago furious_blackwell
Containers Basics
Zobrazíme si zoznam všetkých image-ov, ktoré máme k dispozícii:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/hello-world latest 48b5124b2768 12 weeks ago 1.84 kB
Stiahneme si image s názvom alpine, na ktorom budeme stavať svoje riešenie
$ docker pull alpine
Using default tag: latest
Trying to pull repository docker.io/library/alpine ...
sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4: Pulling from docker.io/library/alpine
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4
Status: Downloaded newer image for docker.io/alpine:latest
Z image-u spustíme container a v ňom príkaz, pomocou ktorého zobrazíme obsah súboru /etc/lsb-release
:
$ docker run alpine cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.5.2
PRETTY_NAME="Alpine Linux v3.5"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
Môžeme sa tiež pozrieť na verziu jadra, ktorá by mala byť rovnaká ako verzia jadra hosťovského systému:
$ uname -a
Linux discovery 4.10.10-200.fc25.x86_64 #1 SMP Thu Apr 13 01:11:51 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ docker run alpine uname -a
Linux 5176596c6c99 4.10.10-200.fc25.x86_64 #1 SMP Thu Apr 13 01:11:51 UTC 2017 x86_64 Linux
Keď si teraz necháme zobraziť zoznam vytvorených kontajnerov, nájdeme medzi nimi aj tento:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5185d1e18b80 alpine "uname -a" 2 seconds ago Exited (0) 2 seconds ago berserk_turing
390191de5f61 alpine "cat /etc/os-release" 10 seconds ago Exited (0) 10 seconds ago suspicious_easley
Pomocou príkazu ps -a
sa zobrazia všetky kontajnery - či už aktívne alebo neaktívne. Ak chcete kontajner zo zoznamu všetkých kontajnerov odstrániť, musíte tak urobiť príkazom
$ docker rm 5185d1e18b80 390191de5f61
Aby sa tak udialo samo po ukončení kontajneru, použite prepínač --rm
, napr.:
$ docker run --rm alpine echo "hello world"
hello world
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Niekedy je však potrebné získať priamy prístup do kontajneru pomocou shell-u. Pokiaľ spustíte len samotný shell, ten sa po spustení okamžite ukončí. Aby nedošlo k jeho okamžitému ukončeniu, je potrebné spustiť kontajner s prepínačmi -ti
, napr.:
$ docker run --rm -ti alpine /bin/sh
/ # hostname
a6014e2a1080
/ # exit
Committing changes to an image
Spustíme interaktívny shell, doinštalujeme do neho apliáciu figlet
overíme ju a interaktívny shell ukončíme ukončením štandardného vstupu (CTRL+D
):
$ docker run --rm -ti alpine /bin/sh
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
v3.5.2-46-gdf4d97eba7 [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
v3.5.2-47-ga46d5990dc [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
OK: 7959 distinct packages available
/ # apk add figlet
(1/1) Installing figlet (2.2.5-r0)
Executing busybox-1.25.1-r0.trigger
OK: 5 MiB in 12 packages
/ # figlet docker
_ _
__| | ___ ___| | _____ _ __
/ _` |/ _ \ / __| |/ / _ \ '__|
| (_| | (_) | (__| < __/ |
\__,_|\___/ \___|_|\_\___|_|
/ # exit
Ak však vytvoríme kontajner z rovnakého image-u znova, nástroj figlet
sa v ňom už nebude nachádzať - zmeny vykonané v kontajnery totiž nie sú trvalé:
$ docker run --rm -ti alpine /bin/sh
/ # figlet docker
/bin/sh: figlet: not found
^D
Ak chceme, aby boli tieto zmeny trvácne, z upraveného kontajneru potrebujeme vytvoriť nový obraz (ale nesmieme ho vypnúť):
$ docker run --rm -ti alpine /bin/sh
/ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
v3.5.2-46-gdf4d97eba7 [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
v3.5.2-47-ga46d5990dc [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
OK: 7959 distinct packages available
/ # apk add figlet
(1/1) Installing figlet (2.2.5-r0)
Executing busybox-1.25.1-r0.trigger
OK: 5 MiB in 12 packages
/ # figlet docker
_ _
__| | ___ ___| | _____ _ __
/ _` |/ _ \ / __| |/ / _ \ '__|
| (_| | (_) | (__| < __/ |
\__,_|\___/ \___|_|\_\___|_|
/ #
A následne z druhej konzoly spustíme
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/alpine latest 4a415e366388 6 weeks ago 3.984 MB
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10ac49989822 alpine "/bin/sh" 2 minutes ago Up 2 minutes gloomy_fermat
$ docker commit 10ac49989822 lab-image
sha256:25ff95b661848a5275c8c3ad90392d1b87ff784af1468ed91326aaa05f6f848f
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lab-image latest 25ff95b66184 2 seconds ago 5.666 MB
docker.io/alpine latest 4a415e366388 6 weeks ago 3.984 MB
Teraz môžeme uzavrieť predchádzajúci container a vytvoriť nový z novovytvoreného image-u:
$ docker run --rm -ti lab-image /bin/sh
figlet docker
_ _
__| | ___ ___| | _____ _ __
/ _` |/ _ \ / __| |/ / _ \ '__|
| (_| | (_) | (__| < __/ |
\__,_|\___/ \___|_|\_\___|_|
^D