Docker Basics

by admin

01 – 03

Архитектура Docker

Docker host

Docker host — это компьютер, сервер или виртуальная машина, на которую установлен Docker и где запускаются контейнеры. Фактически, Docker host представляет собой операционную систему, предоставляющую ресурсы (процессор, память, диск) для работы Docker‑демона и самих контейнеров.

Docker deamon

Docker daemon — это основной фоновый процесс (служба), который управляет всеми объектами Docker: контейнерами, образами, сетями и хранилищами. Он работает на Docker host, принимает команды от пользователя или других приложений через специальный REST API, и выполняет их — например, создает, запускает, останавливает и удаляет контейнеры.

Когда в командной строке вводится команда (например, docker run), клиент Docker отправляет её Docker daemon, а демон уже реализует весь необходимый функционал на уровне операционной системы. Без работающего Docker daemon запуск контейнеров невозможен — он контролирует их жизненный цикл, управление ресурсами и изоляцию.

Таким образом, Docker daemon — это «двигатель» всей контейнерной платформы, именно он реализует все операции, которые пользователь задает через Docker.

Docker client

Docker client — это часть Docker, с которой ты напрямую работаешь как пользователь.

  • Это программа‑клиент (обычно docker в консоли), которая принимает твои команды: docker run, docker build, docker ps и т.д.
  • Клиент не запускает контейнеры сам; он отправляет эти команды демону Docker через API или сокет, а демон уже создаёт/запускает/останавливает контейнеры.
  • Клиент и демон могут быть на одной машине (локальная разработка) или клиент может подключаться к удалённому Docker‑серверу по сети — тогда ты управляешь контейнерами на другом хосте.

Если по‑простому: Docker client — это «оболочка», через которую ты общаешься с Docker, а Docker daemon — «двигатель», который всё реально делает.

Docker client не обязан стоять на том же сервере, где крутится Docker daemon.

  • Можно поставить клиент на свою рабочую машину (ноутбук/ПК) и по сети подключаться к Docker‑хосту, у которого запущен демон. Так ты будешь управлять контейнерами на удалённом сервере.
  • Главное — чтобы был настроен доступ к API демона (TCP/SSH, сертификаты, права) и совпадали версии протокола. В этом случае клиент просто выступает как «пульт управления», а всё выполнение происходит на сервере с daemon’ом.

Docker Images

Docker Image — это неизменяемый шаблон (шаблон Read Only с инструкциями), из которого создаются Docker‑контейнеры. В нем хранится весь необходимый набор для запуска приложения: исходный код, библиотеки, зависимости, инструменты, окружение и конфигурация.

Ключевые особенности Docker Image:

  • Образы предназначены только для чтения и часто состоят из нескольких слоёв — каждый слой фиксирует отдельное изменение, что удобно для версионирования и повторного использования.
  • Для создания образа обычно используется Dockerfile — набор инструкций по сборке среды, установке зависимостей и копированию файлов в образ.
  • Один и тот же Docker Image можно запускать на любом сервере или компьютере с установленным Docker — из него развернётся полностью изолированный контейнер с приложением.
  • Сами образы хранятся локально или в удалённых репозиториях (например, Docker Hub), откуда их можно скачивать и использовать.
  • Образы на основе других образов

Проще говоря, Docker Image — это исходный «эталон», а контейнер — результат его запуска в среде Docker. Образ гарантирует повторяемость окружения, что важно для разработки, тестирования и продакшн‑развертывания.

Архитектура Docker

Docker Hub — это публичный облачный реестр (хранилище) Docker‑образов.

  • В Docker Hub лежат готовые образы популярных систем и сервисов: nginx, PostgreSQL, Redis, Ubuntu, Node.js и т.д. Их можно скачивать командой docker pull и сразу запускать как контейнеры.
  • Ты можешь заливать туда свои образы (docker push), хранить их в публичных или приватных репозиториях и использовать в CI/CD, на серверах и в облаке.
  • По сути, это аналог «GitHub для образов»: централизованное место, где образы версионируются тегами, откуда их удобно распространять и обновлять.

Установка Docker Desktop на Windows

Docker Desktop — это инструмент для работы с Docker-контейнерами на локальной машине. Он упрощает процесс разработки, тестирования и развёртывания приложений, позволяя взаимодействовать с контейнерами как через консоль, так и через графический интерфейс.

Переходим на официальный сайт https://docs.docker.com/desktop/ и устанавливаем программу Docker Desktop for Windows – x86_64

Я устанавливаю на Windows Server 2022 , вот так выглядит инсталяция.

В момент установки программа потребует перезагрузки.

После установки нас встречает приветвенное окно с предложением зарегистрироватся . Заведем себе аккаунт , это даст нам возможность пользоватся Docker Hub , в будущем мы сможем там хранить свои образы.

Первый запуск приложения Docker Desktop

После регистрации проверяем в трее что приложение Running , в моем случае оно не запустилось на Hyper-V. Если у вас приложение запустилось то можно пропустить этот момент.

Типичные ошибки

WSL need updating

Решается запуском в powershell команды

wsl --update

Если у вас windows 10\11 и вы выполнили команду и окно не уходит – установите все последние обновления и повторите снова команду.

Загрузка образа с Docker Hub и его запуск

этом руководстве мы:

  1. Загрузим образы Docker из Docker Hub.
  2. Запустим Docker-контейнеры, используя извлеченные образы.
  3. Запуск и остановка контейнеров Docker .
  4. Удалим образы Docker .

Загрузим образ из Docker Hub

Мы будем скачивать stacksimplify/mynginx:v1, найти его можно в общем репозитории.

Его можно загрузить через кнопку Pull , из приложения но мы воспользуемся Docker Client , который вызовем через Powershell.

docker run stacksimplify/mynginx:v1

Проверим какие Images у нас есть

PS C:\Users\bvadmin> docker images
REPOSITORY              TAG       IMAGE ID       CREATED         SIZE
stacksimplify/mynginx   v1        7024efc5adcc   14 months ago   273MB

Аналогично можно увидеть и в Docker Hub

Запустим контейнер Docker , из скаченного Image

# Run Docker Container
docker run --name <CONTAINER-NAME> -p <HOST_PORT>:<CONTAINER_PORT> -d <IMAGE_NAME>:<TAG>
--name CONTAINER-NAME - Имя запускаемого контейнера
-p <HOST_PORT>:<CONTAINER_PORT>   - где HOST_PORT это на каком порту мы хотим видеть запускаемое приложение , а CONTAINER_PORT это его дефолтый порт
 -d контейнер будет работать в фоновом режиме , а не в терминале . <IMAGE_NAME>:<TAG> - Это имя образа и его тэг

# Пример запуска контейнера:
docker run --name myapp1 -p 8080:80 -d stacksimplify/mynginx:v1

Команды для проверки работы контейнера Docker

docker ps -показываем запущенные контейнеры
docker ps -a - показывает все контейнеры включая выключенные
docker ps -q - показать индетификаторы контейнеров

Подключение к контейнеру Docker через exec

# Connect to the container's terminal
docker exec -it <CONTAINER-NAME> /bin/sh

# Example:
docker exec -it myapp1 /bin/sh
# cd /usr/share/nginx/html
# ls
50x.html  index.html
# cat index.html
<!DOCTYPE html>
<html>
  <body style='background-color:rgb(236, 193, 193);'>
    <h1>Welcome to StackSimplify</h1>
    <p>Learn technology with practical demos</p>
    <p>Application Version: V1</p>
  </body>
</html>
#

Проверим работу

Также команды можно выполнять напрямую

# List directory contents inside the container
docker exec -it myapp1 ls

# Get the hostname of the container
docker exec -it myapp1 hostname

C:\Users\bvadmin>docker exec -it myapp1 hostname
8d9b41dfcf99

# Print environment variables
docker exec -it myapp1 printenv

C:\Users\bvadmin>docker exec -it myapp1 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8d9b41dfcf99
TERM=xterm
NGINX_VERSION=1.27.1
NJS_VERSION=0.8.5
NJS_RELEASE=1~bookworm
PKG_RELEASE=1~bookworm
DYNPKG_RELEASE=2~bookworm
HOME=/root

# Check disk space usage
docker exec -it myapp1 df -h

C:\Users\bvadmin>docker exec -it myapp1 df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay        1007G  1.5G  955G   1% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sde       1007G  1.5G  955G   1% /etc/hosts
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware

Остановить и запустить контейнер Docker

# Stop a running container
docker stop <CONTAINER-NAME>

# Example:
docker stop myapp1

# Verify the container has stopped
docker ps

# Test if the application is down
curl http://localhost:8080

# Start the stopped container
docker start <CONTAINER-NAME>

# Example:
docker start myapp1

# Verify the container is running
docker ps

# Test if the application is back up
curl http://localhost:8080

Пример остановки

C:\Users\bvadmin>docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS          PORTS                                     NAMES
8d9b41dfcf99   stacksimplify/mynginx:v1   "/docker-entrypoint.…"   20 minutes ago   Up 20 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   myapp1

C:\Users\bvadmin>docker stop myapp1
myapp1

C:\Users\bvadmin>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

C:\Users\bvadmin>docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                     PORTS     NAMES
8d9b41dfcf99   stacksimplify/mynginx:v1   "/docker-entrypoint.…"   20 minutes ago   Exited (0) 3 seconds ago             myapp1

C:\Users\bvadmin>

Пример старта

C:\Users\bvadmin>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

C:\Users\bvadmin>docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                     PORTS     NAMES
8d9b41dfcf99   stacksimplify/mynginx:v1   "/docker-entrypoint.…"   22 minutes ago   Exited (0) 2 minutes ago             myapp1

C:\Users\bvadmin>docker start myapp1
myapp1

C:\Users\bvadmin>docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS         PORTS                                     NAMES
8d9b41dfcf99   stacksimplify/mynginx:v1   "/docker-entrypoint.…"   23 minutes ago   Up 4 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   myapp1

C:\Users\bvadmin>

Удалить контейнер Docker

18:40

You may also like

Leave a Comment