Все чаще я стал слышать про Docker, но пока не могу понять, где я смогу применять его в своей работе. Поэтому я решил разобраться с ним, чтобы улучшить свой скилл и написать ещё одно умное слово в своём резюме))
Попробую объяснить простыми словами то, что я понял про Docker:
Docker — маленькая виртуальная машина. Обычно цель данной машины поддерживать работу одного приложения или проекта…
Официальный сайт проекта — docker.com
Изучая Docker, надо знать немного терминов-компонентов:
- Docker Engine — ПО Docker, установленное на сервер или компьютер
- Docker Container — отдельный контейнер Docker. Работает независимо от других контейнеров. Создаётся из Docker Image, имеет свою директорию.
- Docker Image — образ (шаблон), из которого можно развернуть Docker Container.
- Docker Registers — место, где располагаются образы и откуда их можно скачать или залить туда собственный образ. Регистры бывают публичными и приватными. Публичный регистр — DockerHub (hub.docker.com).
- Dockerfile — YAML-файл, который описывает Docker Image (конфиг образа).
Как примерно работает Docker и его контейнеры?

- Устанавливаем Docker Engine и создаём или скачиваем Dockerfile
- Запускаем Build Dockerfile и получаем из него Docker Image
- Выполняем Run Docker Image и получаем Docker Container
Установка и настройка Docker Engine на linux (Debian 10):
- Выполняем обновление репозиториев и ставим пакет apt-transport-https:
sudo apt update
sudo apt install apt-transport-https
2. Устанавливаем gpg-ключ от репозитория download.docker.com
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
3. Указываем в параметрах репозитория, что планируем скачивать только стабильные версии
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
4. Далее, снова обновляем список пакетов и устанавливаем docker-ce. CE — community edition — бесплатная версия от Docker.
sudo apt update
sudo apt install docker-ce
5. Проверить, что docker установлен можно командами docker —v или systemctl status docker
vagrant@d10-sysops:~$ docker -v
Docker version 19.03.8, build afacb8b7f0
vagrant@d10-sysops:~$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-09-13 17:50:37 GMT; 1min 43s ago
Docs: https://docs.docker.com
Main PID: 336 (dockerd)
Tasks: 13
Memory: 137.7M
CGroup: /system.slice/docker.service
└─336 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
vagrant@d10-sysops:~$
6. На этом установка Docker Engine завершена. Нужно понимать, что Docker, почти на все свои команды требует права администратора, чтобы перед каждой командой не вводить sudo, можно добавить пользователя (с которого вы работаете) в группу Docker. Обратите внимание: пользователь получит права Администратора.
sudo usermod -aG docker $USER
Базовые команды Docker
Самая первая команда для новичков — это docker run hello-world
vagrant@d10-sysops:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest
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.
(amd64)
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://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
vagrant@d10-sysops:~$
После ввода данной команды Docker начнёт искать Dockerfile с именем hello-world, если файл с таким именем будет не найден, то Docker начнём искать на DockerHub Docker Image с именем hello-world.
Просмотр всех Docker Images: | docker images |
Поиск на dockerhub образа с именем tomcat: | docker search tomcat |
Скачать образ tomcat: | docker pull tomcat |
Показать запущенные Docker-контейнеры | docker ps |
Показать все Вocker-контейнеры | docker ps -a |
Удалить Docker Image | docker rmi <image name> |
Удалить Docker Container | docker rm <container id> |
Запустить Docker Container | docker start <container id> |
Остановить Docker Container | docker stop <container id> |
Практический пример
Задача: развернуть веб-сервер nginx через docker, настроить, чтобы веб-страница открывалась на порту 1234, внести изменения на главную страницу, потом, на основе данного контейнера создать новый образ, удалить старый образ и удалить сам контейнер.
- Находим Docker Image c помощью команды (выведем только 4 самых популярных образа и шапку таблицы): docker search nginx | head -n 5

2. Скачаем Docker Image nginx к нам: docker pull nginx

3. Далее нам нужно запустить Docker контейнер. Предварительно пробросим порт, по которому будет доступна веб-страница, в нашем случае это порт 1234. Вводим команду для фонового запуска контейнера на основе образа: docker run -d -p 1234:80 nginx
Помимо запуска контейнера в фоновом режиме, его можно запустить в интерактивном (вместо параметра -d указываем параметр -it), тогда в терминале вы увидите много служебной информации, а при нажатии клавиш ctrl+c у вас остановится контейнер.


4. Если потребуется, то мы можем зайти внутрь Docker контейнера и внести там изменения:
vagrant@d10-sysops:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74350aa9180c nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 0.0.0.0:1234->80/tcp quirky_einstein
vagrant@d10-sysops:~$ docker exec -it 74350aa9180c /bin/bash
root@74350aa9180c:/#
5. Изменим содержимое веб-страницы внутри контейнера и перезапустим контейнер:
root@74350aa9180c:~# echo "TEST DOCKER CONTAINER" > /usr/share/nginx/html/index.html
root@74350aa9180c:~# exit
vagrant@d10-sysops:~$
vagrant@d10-sysops:~$ docker stop 74350aa9180c
vagrant@d10-sysops:~$ docker start 74350aa9180c

6. Допустим мы внесли много изменений в контейнер и не хотим его заново настраивать. В таком случае можно просто сохранить изменения в отдельный Docker Image командой: docker commit <container id> <repositiry>:<tag>
vvagrant@d10-sysops:~$ docker commit 74350aa9180c testnginx:v1
ssha256:8d98f8491f4d7b56030f910f3992466f4e83b1ca0312c20c4847d4218e98c07a
vvagrant@d10-sysops:~$ docker images
RREPOSITORY TAG IMAGE ID CREATED
ttestnginx v1 8d98f8491f4d 8 seconds ago
nnginx latest 7e4d58f0e5f3 4 days ago 1
Теперь, на основе этого образа мы можем сделать ещё несколько независимых контейнеров, которые будут работать на других портах:
vagrant@d10-sysops:~$ docker run -d -p 1235:80 testnginx:v1
362e605e7f9e1ec00837825bdc5d3fe4a6f7f9e5a892283fa617c137ebcbc65b
vagrant@d10-sysops:~$ docker run -d -p 1236:80 testnginx:v1
fe2e1e5d054fd0f3de6cbf9f174c45853c10b9c5b172097ebb266641ddcc34de
На этом основы Dokcer заканчиваются, спасибо, за внимание.
Большую часть информации для этой статьи я взял из данного видео — https://www.youtube.com/watch?v=I18TNwZ2Nqg&t=1931s&ab_channel=ADV-IT