---
description: >-
  Будет рассмотрен процесс установки и развертывания приложения Docker на ОС
  Ubuntu 20.04
---

# Установка и развертывание приложения в Docker

## Установка Docker <a href="#docker" id="docker"></a>

Мы рассмотрим установку докера на примере Ubuntu. Если у вас другой дистрибутив Linux или операционная система — ищите соответствующую инструкцию на [официальном сайте](https://docs.docker.com/get-docker/).

Для начала синхронизируем пакетную базу apt и установим нужные зависимости:

```
sudo apt-get update
```

```
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

Далее импортируем GPG-ключ для репозитория docker:

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

Теперь добавим новый репозиторий в список apt:

```
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

Теперь можно устанавливать docker:

```
sudo apt-get update
```

```
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

По умолчанию, доступ к **docker daemon** есть только у пользователя root. Чтобы с докером могли работать и другие пользователи, их нужно добавить в специальную группу — docker. Выполните эту команду из под обычного пользователя:

```
sudo usermod -aG docker $USER
```

После этого необходимо перелогиниться, чтобы изменение вступило в силу.

## Запуск контейнера <a href="#start" id="start"></a>

Теперь попробуем запустить какое-нибудь готовое приложение. Выполните команду:

```
docker run ubuntu echo 'hello from ubuntu'
```

Команда _docker run_ создает и запускает контейнер из образа. В этом примере мы создаем контейнер из образа ubuntu, затем выполняем в нем команду _echo ‘hello from ubuntu’_. Но так как у нас чистая установка докера и мы не скачали ни одного образа, докер сначала найдет этот образ в публичном репозитории Docker Hub, скачает, а потом создаст из него контейнер. В следующий раз, когда нам понадобится образ ubuntu, докер уже не будет его скачивать.

После выполнения команды в терминале появится строка _hello from ubuntu_, и контейнер сразу остановится. Теперь выполним другую команду:

```
docker run -it ubuntu
```

Эта команда запустит контейнер в интерактивном режиме, то есть контейнер запустится и будет ждать дальнейших команд. При этом мы окажемся внутри операционной системы контейнера: запустится оболочка (bash), и мы сможем выполнять какие-то команды внутри контейнера. Чтобы выйти из контейнера, введите команду _exit_.

## Создание собственного образа и запуск контейнера <a href="#new" id="new"></a>

Теперь создадим HelloWorld-приложение на Python, обернем его в образ и запустим.

Для начала создадим директорию, в которой мы будем работать и перейдем в нее:

```
mkdir first-docker-app
```

```
cd first-docker-app
```

Создадим файл _main.py_ и запишем в него одну строчку кода:

```
echo 'print("Hello from python");' >> main.py
```

Проверим, что наша программа работает. Для этого выполним команду:

```
python main.py
```

В консоли должно выйти сообщение _Hello from python_. Это и есть наше простое приложение. Теперь нужно обернуть его в докер-образ. Для этого создадим файл _Dockerfile_ и напишем в нем три строчки:

```
FROM python:3
COPY main.py /
CMD [ "python", "./main.py" ]
```

В первой строке мы указываем образ, который берем за основу. Так как мы пишем приложение на Python, нужно чтобы в нашем образе он уже был установлен. Самый простой способ это сделать — использовать готовый [официальный образ](https://hub.docker.com/_/python) с Docker Hub. Цифра 3 — это тег. Он означает, что нужно использовать третью версию Python. Вместо этого можно было бы использовать тег _latest_, который означает самую последнюю версию, или можно было указать номер конкретной версии, например 3.8.8.

Во второй строчке мы копируем наш файл _main.py_ в корневую директорию образа.

Третья строчка — запускаем python и передаем ему в качестве параметра имя нашего файла.

Теперь из этого докер-файла можно собирать образ. Выполним команду:

```
docker build -t first-docker-app .
```

Параметр -t обозначает имя нашего образа, мы назвали его _first-docker-app_.

Так как у нас еще нет скачанного образа python, то докер сам скачает его из Docker Hub и затем будет использовать его в качестве основы для создания нашего образа.

Проверим список установленных у нас образов:

```
docker images
```

Мы увидим, что у нас установлено три образа:

```
REPOSITORY         TAG       IMAGE ID       CREATED         SIZE
first-docker-app   latest    649cceb4dfd2   4 seconds ago   885MB
python             3         b1aa63f57d3c   2 days ago      885MB
ubuntu             latest    8e428cff54c8   4 days ago      72.9MB
```

_first-docker-app_ — это наш образ, который мы только что создали. python — это образ python, который докер автоматически скачал чтобы собрать наш образ. ubuntu — образ, который мы пробовали для запуска готового приложения.

Теперь создадим контейнер из нашего образа и запустим его:

```
docker run first-docker-app
```

В результате нам выведется результат: _Hello from python_.

**Итог:** Мы создали свое приложение, упаковали его в докер-образ и запустили. Конечно, это очень простой пример. Наша программа состоит всего из одной строчки, а dockerfile из трех. Но это позволяет понять базовые принципы работы докера, как он устроен, как создавать свои образы и запускать контейнеры.

## Список полезных команд <a href="#list" id="list"></a>

Теперь приведем список полезных команд, которые могут пригодиться при работе с докером.

### Посмотреть список всех контейнеров

Эта команда выведет список всех докер контейнеров:

```
docker ps
```

Но по умолчанию выводятся только работающие контейнеры. Чтобы вывести все, в том числе и остановленные, используйте опцию _-a_:

```
docker ps -a
```

### Остановить и удалить все докер контейнеры

Чтобы удалить контейнеры, сначала их нужно остановить. Первая команда остановит запущенные контейнеры, если они есть. А вторая команда — удалит их.

```
docker stop $(docker ps -a -q)
```

```
docker rm $(docker ps -a -q)
```

### Запустить контейнер с последующим удалением

По умолчанию контейнеры после завершения работы останавливаются, но не удаляются. Они сохраняют свое состояние и при необходимости их можно запустить снова. Чтобы контейнер удалялся сразу после остановки, добавьте к команде _docker run_ параметр _—rm_, например:

```
docker run --rm ubuntu echo 'hello from ubuntu'
```

### Посмотреть список всех скачанных образов

```
docker images
```

### Удалить docker образ

```
docker rmi <имя-образа>
```

Если у этого образа есть контейнеры, пусть даже остановленные, докер не позволит его удалить. Он выдаст сообщение:

```
unable to remove repository reference <имя-образа> (must force) - container <id-контейнера> is using its
```

Чтобы принудительно удалить образ, добавьте флаг _-f_:

```
docker rmi -f <имя-образа>
```

### Получить список всех контейнеров, созданных из определенного образа

```
docker ps -a --filter ancestor=<название-образа>
```

## Итог <a href="#resume" id="resume"></a>

Мы рассмотрели, что такое контейнеры и Docker, как они работают и чем отличаются от виртуализации. Также мы создали простое python-приложение, обернули его в образ и запустили контейнер.

Мы рассмотрели основы технологий, но не затронули более сложные темы, вроде Docker Swarm, настройку сети или настройки процессов CI/CD. Но этого вполне достаточно, чтобы погрузиться в основы технологий.

Также, рекомендую дополнительно почитать материал по Docker Compose, поскольку он будет на демонстрационном экзамене. Вот некоторые рекомендации, остальное ищите сами):

{% embed url="https://habr.com/ru/companies/ruvds/articles/450312/" %}
