Настройка рабочей станции Linux (Ubuntu) в качестве среды разработки. Часть вторая. Установка и настройка Doсker
Emil GaripovСтатья представляет собой пошаговое руководство по установке и начальной настройке Docker на рабочей станции Linux c версией Ubuntu Desktop 19.04. в качестве среды разработки.
Так как я хочу использовать некоторые инструменты сетевой автоматизации, такие как Nornir, Ansible и Netmiko и многие из этих инструментов построены на Python и предназначены для работы в среде Linux, можно легко столкнуться с проблемами зависимостей. Изолировав эти инструменты в контейнере, мы сможем избежать этой проблемы.
Все это описано на сайте Cisco Devnet, также в документации по установке Docker.
Статьи
- Часть первая. Общая настройка
- Часть вторая. Установка и настройка Doсker
Оглавление статьи:
- Настройка репозитория
- Установка Docker Community Edition
- Управление Docker'ом в качестве не root пользователя
- Настройка Docker'a для запуска при загрузке
- Работа с контейнером
- Установка Nodejs
- Установка текстового редактора и IDE Conda
- Установка Postman
- Установка Ngrok
- Установка Google Chrome
- Установка клиента OpenConnect
Настройка репозитория
В первой части статьи мы уже проделали первые два шага по настройке репозитория. Продублирую их здесь:
- Обновляем индекс пакета apt:
$ sudo apt-get update

2. Устанавливаем необходимые пакеты для того, чтобы разрешить apt использовать репозиторий через HTTPS:
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
После того, как ввели эти команды, он поинтересуется, готовы ли продолжить установку пакетов:

Набираем Y, если хотим продолжить или n, если хотим прервать. Так как я хочу пойти дальше, я набираю Y и нажимаю Enter.
3. Добавляем официальный GPG-ключ Docker'a:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Проверяем, что у нас теперь есть ключ с идентификатором 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88, выполнив поиск последних 8 символов этого идентификатора(0EBF CD88):
$ sudo apt-key fingerprint 0EBFCD88

4. Добавляем репозиторий Docker в apt, чтобы всегда проверять наличие последней стабильной версии:
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"

Установка Docker Community Edition
- Обновляем индекс пакета apt:
$ sudo apt-get update

- Обновляем индекс пакета apt:
$ sudo apt-get update
2. Устанавливаем последнюю версию Docker Engine Community и containerd:
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

После соглашения [Y], установка продолжиться.
3. Проверяем, что Docker Engine Community установлен правильно, запустив образ Hello-world. :
$ sudo docker run hello-world
Эта команда загружает тестовый образ и запускает его в контейнере. Когда контейнер запускается, он выводит информационное сообщение и выходит из него.

Управление Docker'ом в качестве не root пользователя
Демон Docker привязывается к сокету Unix, а не к порту TCP. По умолчанию Unix сокет принадлежит пользователю root, и другие пользователи могут получить к нему доступ только с помощью sudo. Демон Docker всегда работает от имени пользователя root.
Мы не хотим постоянно вводить docker команды с помощью sudo, для этого создадим группу Unix под названием docker и добавим к ней пользователей. Когда демон Docker запуститься, он создаст Unix сокет, доступный для членов группы docker.
Для того, чтобы создать новую группу воспользуемся документацией.
- Создаем группу docker:
$ sudo groupadd docker

Говорит, что уже есть эта группа.
2. Добавляем существующего пользователя, в данном случае gissarsky в группу docker.
$ sudo usermod -aG docker $USER

3. Выйдем из системы и войдем обратно, чтобы членство в группе было пересмотрено.

4. В Linux вы также можете запустить следующую команду для активации изменений в группах:
$ newgrp docker

5. Проверяем, что мы можем выполнять команды Docker'a без sudo.

Все работает.
Настройка Docker'a для запуска при загрузке
В большинстве современных дистрибутивов Linux (RHEL, CentOS, Fedora, Ubuntu 16.04 и выше) используется systemd для управления тем, какие службы запускаются при загрузке системы.
$ sudo systemctl enable docker

Работа с контейнером
Вот мы и подобрались к непосредственной работе с самим контейнером. И как пишется в документации:"Пришло время начать создавать приложения в стиле Docker".
- Coздаем директорию Docker и переходим в эту дирекию.
sudo mkdir Devnet cd Devnet

2. Создаем Dockerfile
Dockerfile определяет, что происходит в среде внутри контейнера. Доступ к таким ресурсам, как сетевые интерфейсы и дисковые накопители, виртуализированы внутри этой среды, изолированной от остальной части системы, поэтому вам нужно отобразить порты во внешний мир и указать, в какие файлы вы хотите "копировать" в эту среду. Dockerfile создаем через nano:
sudo nano Dockerfile

Прописываем в файле следующие строки:
# Будем использовать официальный Python версии 3.7-stretch в качестве # родительского образа FROM python:3.7-stretch # Зададим рабочую директорию в /automation WORKDIR /automation # Скопируем содержимое текущей директории в контейнер /automation COPY . /automation # Устанавливает все необходимые пакеты, указанные в файле # requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt

3. Создаем файл requirements.txt в той же директории, что и Dockerfile через nano:
sudo nano requirements.txt

В файле requirements.txt перечислены пакеты Python, которые будут помещены в новый образ контейнера. Все они должны быть установлены с помощью pip. В моем случае, содержимое файла выглядит следующим образом:
ansible netmiko napalm nornir pyang ncclient xmltodict

4. Теперь осталось только создать образ. Сначала проверим, что мы находимся в нужной нам директории:
ls

Для создания образа запускаем команду build. Это создаст образ Docker, который мы назовем devnet с помощью опции --tag. Можно использовать более короткий параметр -t:
$ sudo docker build -f ./Dockerfile -t devnet .
Посмотрим, что происходит во время выполнения команды. Часть "-t devnet" задает имя образа. Привязка локального образа к хранилищу в реестре производится через - имя пользователя/репозиторий:тег. Тег является необязательным, но рекомендуемым параметром, так как это механизм, используемый реестрами для выдачи версий для образов Docker.
Точка в конце является обязательной, так как "docker build" предполагает наличие пути. В этом случае команда выполняется непосредственно из директории, содержащей Dockerfile, в нашем случае Devnet. Когда мы выполним эту команду, Docker получит базовый образ Python из Docker Hub. Затем этот образ запуститься как новый контейнер, в котором выполнятся инструкции из Dockerfile. Начнется установка всего, что мы указали в файле requirements.txt. После выполнения этих инструкций контейнер Python будет содержать все изменения и будет сохранен в виде нового контейнера, готового к использованию.

Если все прошло удачно, то ответ будет следующим:

5. Проверяем, где находится наш образ:
$ sudo docker image ls

6. Теперь мы можем запустить новый контейнер, используя наш образ. Запустим его в автономном интерактивном режиме (используя флаг "-dit"), контейнер запуститься и продолжит работать в фоновом режиме:
$ docker run -dit --name automate_net devnet

Проверяем, что получилось:
$ docker ps -a

Контейнер теперь работает в фоновом режиме, но пока ничего не делает.
7. Мы можем подключиться к контейнеру с помощью следующей команды:
$ docker exec -it automate_net /bin/bash

Вышеприведенная команда соединяет нас с bash shell внутри контейнера. В этой среде все инструменты, которые были установлены во время процесса сборки, теперь будут доступны. Проверим, установился ли Nornir:
$ root@690ec45c42b5:/automation# python >>> import nornir.core

Все работает. Теперь, воспользовавшись статьей о Nornir можно начать с ним работать.