# Основы Docker

### 🚀 **Docker с нуля: Полный разбор для новичков**

Docker — это платформа для контейнеризации, которая позволяет упаковать приложение и его зависимости в один контейнер, который можно запустить где угодно.

## 🔹 **1\. Установка Docker (Ubuntu 22.04)**

### 📌 **Шаг 1: Удаляем старые версии**

```bash
sudo apt-get remove docker docker-engine docker.io containerd runc
```

### 📌 **Шаг 2: Устанавливаем необходимые пакеты**

```bash
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
```

### 📌 **Шаг 3: Добавляем официальный репозиторий Docker**

```bash
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

### 📌 **Шаг 4: Устанавливаем Docker**

```bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

### 📌 **Шаг 5: Проверяем установку**

```bash
docker --version
docker-compose --version
```

---

## 🔹 **2\. Основные команды Docker**

### 📌 **Запуск контейнера**

```bash
docker run ubuntu echo "Hello, Docker!"
```

🔹 Запускает контейнер с образом `ubuntu` и выводит `Hello, Docker!`.

### 📌 **Интерактивный запуск контейнера**

```bash
docker run -it ubuntu bash
```

🔹 Открывает терминал внутри контейнера.

### 📌 **Вывести список работающих контейнеров**

```bash
docker ps
```

🔹 Показывает активные контейнеры.

### 📌 **Вывести все контейнеры (включая остановленные)**

```bash
docker ps -a
```

### 📌 **Остановить контейнер**

```bash
docker stop CONTAINER_ID
```

### 📌 **Запустить уже существующий контейнер**

```bash
docker start CONTAINER_ID
```

### 📌 **Удалить контейнер**

```bash
docker rm CONTAINER_ID
```

### 📌 **Удалить все контейнеры**

```bash
docker rm $(docker ps -aq)
```

### 📌 **Удалить все образы**

```bash
docker rmi $(docker images -q)
```

### 📌 **Удалить неиспользуемые ресурсы (контейнеры, образы, сети)**

```bash
docker system prune -a
```

---

## 🔹 **3\. Docker Images (Образы)**

**Образ** — это шаблон для контейнера.

### 📌 **Список локальных образов**

```bash
docker images
```

### 📌 **Скачать образ из Docker Hub**

```bash
docker pull ubuntu
```

### 📌 **Создать свой образ (Dockerfile)**

**Создаём** `Dockerfile`:

```bash
FROM ubuntu:latest
RUN apt update && apt install -y curl
CMD ["echo", "Custom Ubuntu Image"]
```

**Собираем образ:**

```bash
docker build -t my-ubuntu .
```

**Запускаем контейнер из образа:**

```bash
docker run my-ubuntu
```

---

## 🔹 **4\. Docker Volumes (Тома)**

**Тома** позволяют сохранять данные между перезапусками контейнера.

### 📌 **Создать том**

```bash
docker volume create my_volume
```

### 📌 **Список томов**

```bash
docker volume ls
```

### 📌 **Примонтировать том к контейнеру**

```bash
docker run -d -v my_volume:/data ubuntu
```

### 📌 **Удалить том**

```bash
docker volume rm my_volume
```

---

## 🔹 **5\. Docker Networks (Сети)**

По умолчанию Docker создаёт сеть `bridge`.

### 📌 **Создать сеть**

```bash
docker network create my_network
```

### 📌 **Список сетей**

```bash
docker network ls
```

### 📌 **Подключить контейнер к сети**

```bash
docker network connect my_network container_name
```

---

## 🔹 **6\. Docker Compose (Оркестрация нескольких контейнеров)**

**Создаём** `docker-compose.yml`:

```bash
version: '3.8'
services:
  app:
    image: nginx
    ports:
      - "8080:80"
  db:
    image: postgres
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
```

### 📌 **Запустить Compose**

```bash
docker compose up -d
```

### 📌 **Остановить**

```bash
docker compose down
```

---

## 🔹 **7\. Запуск контейнера с пересылкой портов**

```bash
docker run -d -p 8080:80 nginx
```

Теперь Nginx доступен по адресу [`http://localhost:8080`](http://localhost:8080).

---

## 🔹 **8\. Проверка логов контейнера**

```bash
docker logs CONTAINER_ID
```

---

## 🚀 **Вывод**

Docker — мощный инструмент, который позволяет быстро разрабатывать, тестировать и деплоить приложения. Его ключевые возможности:

* **Изоляция** (каждое приложение в своём контейнере)
    
* **Повторяемость** (одно и то же окружение на разных машинах)
    
* **Гибкость** (масштабируемость через `docker-compose` и `swarm`)
