Шпаргалка по командам Docker
в формате pdf тут https://t.me/itmozg/9689
Чистим Java код используя SonarQube и PMD
В самом начале пути у многих новичков программистов есть много пробелов, даже в базовых вещах. Для выявления таких проблем существует бесплатное решение - SonarQube, которое позволяет довольно быстро обнаруживать множество ошибок и уязвимостей. Здесь мы разберемся, как воспользоваться этим инструментом.
Какие технологии помогают анализировать код на ошибки и уязвимости?
Существует несколько решений, которые позволяют проводить различные виды анализа, но чаще всего у них есть много общего. Популярные решения:
SonarQube
FindBugs
PMD
SpotBugs
Checkstyle
Snyk
JArchitect
Graudit
В данной статье мы рассмотрим SonarQube и PMD.
SonarQube настройка, установка, запуск.
SonarQube - довольно популярное решение, хотя, по моему мнению, изначальные правила проверок лучше немного перенастроить. SonarQube предоставляет бесплатную версию, которая может быть запущена из-под Docker в одну команду. Все, что вам потребуется, это сервер с 2 ГБ оперативной памяти (но чем больше, тем лучше). Как настраивать и арендовать сервер я писал вот тут.
Запускаем Sonar используя Docker.
Запускаем докер одной командой:
docker run -d --name sonarqube -p 9002:9000 -p 9092:9092 sonarqube
Первый логин проходит под admin/admin
После запуска следует подождать примерно пять минут и затем открыть ваш сервер. Первый вход потребует использования имени и пароля admin/admin, после чего система попросит изменить пароль. На данном этапе мы пропустим этот шаг.
Процесс создания проекта и генерации токена.
Существуют разные способы интеграции с SonarQube. Самый простой — интегрировать зависимость в Maven/Gradle вашего проекта и затем выполнить одну команду в командной консоли. Ниже я постараюсь упростить процесс генерации токена и проекта до шести команд:
6 шагов для генерации имени проекта, ключа и токена. Все они нужны для отправки вашего кода сонару
После выполнения всех 6 шагов у нас есть:
Имя проекта pikabu
Имя ключа pikabu
имя токена
Чтобы Sonar проводил более подробную аналитику, рекомендуется установить плагины. Для этого перейдите в раздел Administration => Marketplace и выберите плагины по вашему желанию:
Плагины имеют много общих правил и настроить профиль без пересечений это головная боль.
Настраиваем Maven и добавляем Sonar плагин.
Для настройки мавен проекта достаточно добавить плагин в pom.xml:
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.9.1.2184</version>
</plugin>
Теперь мы готовы к анализу нашего кода.
Напишем код с наиболее популярными ошибками в Java.
Я приведу далеко не все классические ошибки, но для оценки базовой функциональности этого будет достаточно:
Несколько популярных ошибок среди триллиона возможных.
Все настроено. Погнали.
Если в файле pom.xml добавлен Sonar плагин, и имя проекта, ключ и токен готовы, после сборки проекта можно запустить команду для передачи результатов в SonarQube:
mvn sonar:sonar -Dsonar.projectKey=pikabu -Dsonar.projectName=pikabu -Dsonar.host.url=http://IP_СЕРВЕРА:9002 -Dsonar.login=sqp_4d542b25...
Анализируем результаты
После запуска заходим в проект (в моем случае pikabu) и нажимаем Overall Code
Я подключил слишком много правил поэтому среди найденных проблем есть дубликаты.
Результаты
Обнаружено 6 багов.
Покрытие составляет 0% (для более точного анализа покрытия, рекомендуется интегрировать Jococo плагин).
Выявлено 49 вонючих строк кода.
Поскольку я включил более 1000 правил (по умолчанию их всего 400), некоторые проблемы среди 49 являются просто дубликатами. Давайте рассмотрим самые важные, а именно баги:
Часть проблем была найдена, но не все.
В результате часть багов была отловлена, но некоторые например незакрытый стрим или итерация через итератор - нет.
Также можно выбрать файл и посмотреть всю аналитку:
Слишком много правил я выбрал, сонар не анализирует а уже душнит.
Какие выводы можно сделать?
С учетом того что сонар ставится без оплаты и лишь имеет ряд ограничений - утилита хороша. Среди вещей которые я бы отметил:
Сонар однозначно отлавливает много багов но не все.
Во много качество сонара определяется настроеными правилами (Quality profiles) которые затем и используются во время анализа. Подружить их все - довольно непросто.
Слишком большое количество правил руинит весь смысл анализа.
Двигаемся дальше. PMD анализатор кода.
бесплатный, опенсорный.
Sonar не является чем-то уникальным. Давайте рассмотрим другое бесплатное решение - PMD. Кстати, правила PMD могут быть скачены и запущены в Sonar, но с первой попытки у меня это не получилось из-за проблемы с соответствием версий PMD/SONAR/JAVA.
Ставим PMD
Чтобы поставить PMD достаточно скачать с их сайта pmd-dist-7.0.0-rc4-bin.zip и распаковать. Затем добавить в PATH bin папку и запусить команду:
>pmd check -d C:\cleancode -R rulesets/java/quickstart.xml -f html -r report.html
В команде C:\cleancode является папкой проекта где лежит ваш Java код. Результатом работы будет созданный report.html. Вот результаты его работы:
Коротко и по делу.
И так результаты PMD мне зашли. Он нашел почти все проблемы, часть которых Sonar пропустил (точнее тысяча правил которые я подключил из стандартных наборов).
Всем кому интересна разработка на Java и смежный мир технологий добро пожаловать в мой телеграм канал. Всем спасибоо за внимание.
Вы хотите головоломок?
Их есть у нас! Красивая карта, целых три уровня и много жителей, которых надо осчастливить быстрым интернетом. Для этого придется немножко подумать, но оно того стоит: ведь тем, кто дойдет до конца, выдадим красивую награду в профиль!
Продолжение "Простейший способ ускорить изучение мира программирования. Арендуем копеечный сервер..."
В прошлой статье я рассказал о таком понятии как VPS (Virtual Private Station).
Проще говоря, это виртуальный компьютер внутри обычного сервера (Dedicated Server). Настроим инфраструктуру, необходимую для создания промышленных приложений. Познакомимся с тем как работать с linux серверами.
Не буду рекомендовать какой то конкретный курс. Можно зайти на ютуб и вбить "Linux для начинающих" или найти книги просто загуглив "линукс начинающим pdf".
Для начала работы с линуксом нужно знать:
В какой папке вы находитесь и как сменить папку (pwd, cd)
Как создавать папки, файлы и как их читать и писать в них, как искать нужные файлы (mkdir, touch, vim, find)
Понимать самые основы прав и пользователей, как их создавать и пользоваться ими (chown, chmod, id, su)
Как устанавливать и запускать приложения (apt-get update/install/remove)
Как писать простейшие скрипты и запускать (bash scripts)
Уметь проверять состояние сервера - загрузка CPU/RAM/HDD (top, free, df)
Уметь проверять процессы и останавливать их (ps, kill)
Уметь проверить, закрыть порт (netstat и еще парочка)
К этому списку можно обавить пару команд но для начала работы этого будет достаточно. На изучение базовых операций может уйти месяц - другой, в зависимости от предыдущего опыта.
Устанавливаем на сервер необходимую для разработки инфраструктуру.
Раньше большинство инфраструктуры ставили прямо на сам сервер.
Сейчас используют разные решения виртуализации и её оркестрации, например: Docker, Kubernetes и множество других (но часть инфраструктуры продолжают ставить прямо на сервер).
Виртуализация, вроде Docker, значительно уменьшает головную боль для установки сотен решений от баз данных и очередей до чего то более сложного, вроде игровых серверов. Поэтому перед началом разработки я настоятельно рекомендую познакомиться с докером
Минимум, который нужно знать про Docker:
Понимать разницу между образом и контейнером (контейнер по сути экземпляр образа)
Уметь запускать и останавливать контейнер (docker run, stop, start)
Уметь подключаться к контейнеру (docker attach / docker exec)
Уметь проверять работу контейнера (docker ps, docker logs)
Для чего это нужно?
Изучение основ Linux и Docker - процесс не из самых легких. Все это стоит того, чтобы научиться поднимать инфраструктуру в несколько минут.
Ниже я приведу примеры классических контейнеров, которые пригодятся при изучении промышленной разработки.
Классический минимум
Рассмотрим пример архитектуры классического промышленного Java приложения:
Подобная инфраструктура вряд ли вместится в самую дешевую VPSку. Ниже я расскажу какие есть недорогие варианты.
Этот вариант архитектуры является классическим решением большинства веб проектов. Я привел его в качестве примера, который подойдет для новичка.
Используем докер для поднятия данной архитектуры.
Redis (один из многих вариантов кэшей)
Кэш позволяет временно хранить наиболее используемые данные, тем самым снижая нагрузку на систему в целом и повышая производительность.
Для простейшего варианта авторизации по паролю достаточно запустить команду:
docker run -d -p 6379:6379 --name myredis redis redis-server --requirepass <password>
Для удобства (необязательно) можно внутри докера стартовать веб интерфейс для просмотра redis сервера вот такой командой:
docker run -d --name myrediscommander -p 8081:8081 --link myredis:redis rediscommander/redis-commander
После старта админки можно зайти в браузер по адресу ВАШ_IP:8081 и затем подключиться к вашему серверу, чтобы просматривать/удалять/добавлять данные:
RabbitMQ (Очередь, которая получает сообщения и оповещает подписчиков).
Rabbit позволяет получать и оповещать клиентов, подписавшихся на сообщения.
Для запуска очереди достаточно запустить:
docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=myuser -e RABBITMQ_DEFAULT_PASS=mypassword rabbitmq:3-management
Через пару минут можете зайти в админку очереди, вбив в браузере IP_вашего_сервера:15672 и увидеть что то вроде:
Реляционная база данных MYSQL.
Реляционные базы данных являются неотъемлемой частью большинства решений. В нашем примере мы запустим одну из самых популярных MySQL:
docker run -d --name mysql-container -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:latest --default-authentication-plugin=mysql_native_password
Через пару минут сервер стартанет. К нему можно будет подключиться через какой - нибудь MySQL клиент, например Heidi SQL.
С помощью клиента можно легко писать запросы и проверять содержание базы данных. Выглядеть он может примерно так:
Минимальные требования к подобной инфраструктуре.
Если вы хотите пользоваться докером в арендованном сервере вам желательно иметь 2 процессора и 2 Гб оперативки. Система запустится, но будет работать на минималках. Этого достаточно, чтобы изучить данные технологии.
Какие есть недорогие варианты поднятия инфраструктуры без больших затрат?
Запуск на локальной машине с тунелированием данных. В таком случае все запросы на VPS будут перенаправлены на домашний компьютер. В следующих статьях я покажу как это сделать.
Почасовая аренда VPS. Если вы хотите проверить какие - нибудь решения и вы знаете, что это займет несколько часов, есть смысл аренды VPS с почасовой оплатой. В среднем 8 ядерный VPS с 8gb RAM будет стоить порядка 5-12 рублей в час. Конкретного провайдера рекламировать не буду, я пользовался тремя и в такой диапазон цен укладывался.
Использование облаков. Данный метод я не рекомендую, за исключением тех решений, которые не тарифицируют трафик или что нибудь еще. С облаками вроде AWS можно влететь на большие деньги и новичкам я советую избегать их в начале пути.
Как еще можно использовать арендованный сервер?
Кроме разработки, сервер может подарить вам ряд бесплатных, либо условно бесплатных сервисов, которые могут вам пригодиться для работы или игр. Приведу пару примеров.
Запускаем чат сервер MatterMost
Допустим, вам надо создать чат - платформу для группы в университете или на работе с каналами, обменом приватными сообщениями с тектом и картинками. Вместо платных платформ можно запустить MatterMost сервер. К нему можно будет подключиться с компьютера или мобилки. Все это можно скачать и установить бесплатно.
Запустить сервер можно командой ниже:
docker run --name matt -d --publish 8065:8065 --add-host dockeermost/mattermost-preview
После нескольких минут к серверу можно подключиться, вот как выглядит клиент чата:
Хостим MineCraft
Для старта сервера MineCraft понадобится:
Cкачать или скопировать вручную вот такой docker-compose.yml файл: https://pastebin.com/raw/uEP58DRB сделать это можно командой
curl -o docker-compose.yml https://pastebin.com/raw/uEP58DRB
Затем, находясь в той же директории, надо запустить
docker compose up
После старта сервера нужно подождать какое то время. Затем, можно подключиться к миру, используя Minicraft клиент, указав IP вашего сервера:
Вот как выглядел мир в моем примере:
Я перечислил часть возможных решений в качестве примера.
Приведенные команды далеки от идеала и желательно их подправить, например, улучшить безопасность. Для целей ознакомления, думаю, пойдет.
Сама разработка на Java.
В следующей части я покажу как писать простейшие приложения и использовать созданную инфраструктуру.
Больше о Java и смежных технологиях можете узнать тут.
Мир docker-контейнеров и как в нем жить обычному разработчику
В этой статье мы хотим поговорить о контейнерах в общем и о docker-контейнерах в частности. Как с ними жить обычному разработчику?
Раньше в IT люди занимались тем, что запускали софт на одной большой машине(сервере) и ловили разные проблемы: «у нас не работает», конфликты библиотек, проблемы обновления и сопровождения.
Далее на авансцену выходят VM (виртуальные машины), и это в каком-то виде решило проблему доставки кода, так как теперь софт работал изолированно от других версий софта, но не решило проблему обновления и сопровождения.
Наверное, вы часто оказывались по ту или другую сторону проблемы и слышали/говорили следующие слова: «А у нас работает!».
Затем, с течением времени, появились докер-контейнеры. Они стали средством удешевления развертывания софта, упрощения деплоя и обновления.
Итак, с историей мы разобрались, время поговорить более предметно!
Что под капотом у этой технологии?
linux kernel-namespace — так как докер-контейнер не виртуализирует аппаратную составляющую, а только программную, для него создается свое пространство для pid-процессов, сети, файловой системы и процессов ядра.
Вторым китом контейнерной технологии будет cgroups — для того, чтобы управлять системными ресурсами для каждого контейнера, в них входит: оперативная память, процессорное время, доступ к дискам.
Третий кит контейнерной технологии, union file system, – позволяет управлять файловой системой, которая состоит из слоев, и ее фишки хорошо ложатся на контейнеры
Теперь, после того, как вы прошли несколько стадий принятия новой технологии, неплохо бы научиться с ней работать и ей пользоваться:)
Если вы виндузятник или маковод, то вам нужен docker desktop, а с виндой возможно понадобится WSL - windows subsystem for linux.
Если вы красноглазый линуксоид, то apt-get update && apt-get install docker (на самом деле путь чуть-чуть сложнее, но для знакомства хватит этих двух команд).
После того, как вы установили docker на ПК, есть смысл ознакомиться со списком существующих команд. Для этого разработчики docker добавили полезный ключ в вызове CLI-программы: вводим в консоли docker -h (--help) и видим список всех существующих команд.
Выделим самые полезные на старте:
docker pull - сможете скачать образ из любого docker registry, это хранилище докер-образов
docker push - а с помощью этой команды вы сможете загрузить образ в любое доступное для вас docker registry
docker run - эта команда создает и стартует новый контейнер из существующего образа
docker stop - эта команда останавливает работу контейнера
docker ps - а вывод данной команды покажет вам запущенные docker-контейнеры (еще можно написать вот так: docker ps -a и вы увидите все контейнеры - запущенные и остановленные)
docker images - ничего экстравагантного, просто вывод на экран всех образов
docker build - а с помощью этой команды вы сможете создавать свои docker-образы из dockerfile
Это самые популярные команды, но ранее вы видели, что их больше и у каждой команды есть свои различные опции.
Время попрактиковаться!
Теперь на примере образа nginx:1.22 (это популярный веб-сервер) рассмотрим как добавить в наш будущий образ файл index.html, создать на его основе контейнер и просмотреть через браузер.
(Я веб-разработчик, поэтому в качестве примера выбрал демонстрацию с html)
Создадим директорию docker-test (актуально для примеров на OSX и Linux*) и следующей командой перейдем внутрь:
Тут создадим директорию nginx:
Затем открываем ваш любой любимый редактор (nano, vim, vscode, etc) и создаем файл со следующим названием: «Dockerfile»
Откроем наш файл и напишем следующее:
Объясним обе строчки:
Первая строчка: указывает базовый образ версии нашего веб-сервера, в нашем случае это nginx версии 1.22 (крутые специалисты всегда указывают точные версии используемых программ)
Вторая строчка: копирует файл index.html внутрь докер-образа, по которому nginx будет искать html-файлы.
Далее мы создадим html-файл в директории рядом с nginx, для этого выйдем из текущей директории в предыдущий каталог:
И создадим файл index.html
Откроем файл, который мы создали предыдущей командой, с помощью вашего любимого текстового редактора или IDE и добавим следующие строчки:
Сейчас нам необходимо создать наш первый образ, для этого введем следующую команду:
Что делает каждая команда и ключ?
docker build - это команда для создания образа
ключ -f нужен для указания пути до Dockerfile
-t - тут мы называем наш образ my-nginx
точка в конце нужна для указания каталога, для контекста сборки, и чтобы наш сборщик понимал, где искать файлы. Если указать не точку, а какой-то иной каталог, но, при этом, в Dockerfile у вас будет указана инструкция по работе с файлами, то сборка сломается.
После запуска нашей команды, если вы ничего не забыли, вы увидите следующее:
Теперь, когда у нас есть наш небольшой docker-образ, самое время его запустить:
Что делает каждый ключ в нашей команде?
docker run — команда создания и запуска контейнера.
-d — чтобы наш контейнер работал в фоне и не перехватывал управление над консолью
-p 80:80 — открываем порт 80 у нашего контейнера
- -name — присваиваем имя нашему контейнеру
my-nginx — указываем используемый образ нашего контейнера
И после этого мы видим, что nginx отдал index.html при запросе на 127.0.0.1:80, так как мы запустили наш контейнер локально.
Контейнерная технология решает много проблем во взаимодействии программистов и сопровождения, а также делает процесс разработки более удобным. Но не стоит забывать, что это не «серебряная пуля»** и, как в любом инструменте, нужно подходить с умом к ее использованию. Надеюсь, эта статья и небольшая практическая часть поможет вам пользоваться контейнерами правильно.
Автор: Валерий, .Net-разработчик
Примечания:
*Пример для WSL не рассматривается в рамках данной статьи, но мы обязательно разберем его в следующих выпусках
**Серебряной пулей считается супер-крутая технология, которая решит все проблемы разработки. Но пока, увы, такой не существует.
Медаль "За внедрение Докера"
Вручена разработчику за трудовые заслуги в деле всеобщей контейнеризации :)
Полимерная глина, акриловые краски, лак.