Простое руководство

Время на прочтение

Простое руководство

Семен Тюреньков

Старший разработчик ГК Юзтех

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

Если это Senior Full Stack разработчик с опытом администрирования Linux, то установка и настройка конфигов Nginx, PHP-fpm, MariaDB для него не будут проблемой (а может и с Docker даже знаком?). 

Разработчик Middle уровня (особенно без опыта с backend) возможно пользуется одним из готовых решений под Windows/MacOS.

Junior верстальщик, в свою очередь, раньше не запускал приложение работающее на PHP на своем компьютере вообще, и вот-вот попробует в первый раз.

Было такое? У меня было. Случалось даже поздним вечером помогать новичку с установкой или решением проблемы, возникшей в ходе установки.

А потом, еще через некоторое время, из-за разных конфигов или окружения возникали и новые проблемы из разряда “на моем компьютере же все работает”, которые в том числе могут появиться из-за разных настроек готовых сборок.

Простое руководство

Я начал регулярно сталкиваться с этими проблемами, когда стал ответственным за релизы и работу команды. Это было сравнительно недавно.Docker к этому времени уже был широко известен и даже использовался другими отделами в компании, в том числе отделом DevOps на production, но для разработки в образе с прода не хватало компонентов. 

Чтобы решить проблему с локальным окружением, которое у всех в команде должно быть максимально похожим на Production, и удобным  для разработки, я начал сам погружаться в документацию и примеры по Docker. В этой статье я поделюсь с вами инструкцией как сделать аналогичный образ для нужд своей команды.

Простое руководство

Установка

Хотя в результате вы получите практически одинаковые локальные окружения, установка на Windows, Linux и Mac несколько отличается.

Я расскажу о двух способах установки – для Windows и Mac. 

Некоторые шаги одинаковы, а об индивидуальных отличиях я скажу по ходу. Начнем с простого:

Docker Desktop

Для начала нужно поставить Docker Desktop, чтобы заниматься менеджментом образов и контейнеров через визуальный интерфейс – видеть скачанные образы, удалять неиспользуемые, запускать или останавливать контейнеры, создавать тома для данных и заходить в командный интерфейс каждого контейнера для выполнения команд, дебага или проверки гипотезы до занесения ее в конфиг.

Немного теории в контексте веб-разработки своими словами (для более официального описания посмотрите документацию):

  • Образ – это конфигурация системы с программами-компонентами и их зависимостями. Образы могут быть как отдельные для каждого компонента (Nginx, PHP-fpm, MariaDB, Redis, Postfix и т.п.), так можно создать и единый образ сразу со всеми компонентами и самим веб-сайтом внутри.

  • Том – это постоянное хранилище данных, используемое контейнерами. Зачем это нужно? Все данные появляющиеся в контейнере удаляются при перезапуске, кроме тех, что заложены в образ. Чтобы сохранить какие-то данные, папки их содержащие нужно подключить как тома.

  • Контейнер – это изолированная система, созданная из образа и, возможно, с подключенными к ней томами, в котором выполняются нужные вам программы.

Дополнительная информация для Windows: для выполнения шагов в этой статье, ваш компьютер должен поддерживать WSL2. 

При установке Docker Desktop спросит хотите ли вы использовать WSL2 и вам следует согласиться. К тому же это рекомендуется и самим Docker.

Если вы пропустили этот шаг и Docker у вас давно, попробуйте включите поддержку WSL2 через настройки.

Простое руководство

Хранение данных и проекта

Далее вам нужно подготовить, где вы будете хранить данные – папки с проектами, базы данных, nginx конфиги сайтов и SSL сертификаты.

На Windows можно настроить хранение проектов в файловой системе Windows, но обращения к файловой системе от веб-сервера будут очень медленные, поэтому в этой статье мы делаем через WSL2. 

Лично мне сложно работать с проектом, когда страницы грузятся долго. Лучшим решением будет хранить файлы в Linux подсистеме, поэтому для пользователей Windows рекомендую поставить еще одну подсистему через WSL2, например Debian или Ubuntu и хранить проекты там. 

Создайте или определите 4 папки в проекте, которые вы будете использовать в .env при установке Docker окружения:

Я рекомендую все хранить внутри той же директории, что и проект:

SITE_DOMAIN=”localhost”
SITE_PATH=”$PWD”
SSL_PATH=”$PWD/ssl”
DB_PATH=”$PWD/db”
NGINX_CONF_PATH=”$PWD/docker/nginx/site-conf”

Установочный скрипт

#!/bin/bash
# скрипт прочитает .env файл и возьмет переменные
if [ -f .env ]; then export $(cat .env | xargs)
fi
# небольшая функция которая будет проверять существует ли том, и если нет, то создаст
# его из указанных в .env путей. Если захотите переопределить тома, их надо будет
# удалить в интерфейсе Docker Desktop или через командную строку
create_volume() { local volume_name=$1 local volume_path=$2 echo "Creating volume $volume_name..." \ && docker volume create --driver local --opt type=none --opt device=$volume_path --opt o=bind $volume_name
}
# и, наконец, основное тело скрипта, создает папки из указанных путей, на случай если они # еще не существуют. Затем входит в подпапки nginx и php-fpm для сборки образа (об
# этом расскажу еще чуть позже). И создает тома используя указанную выше функцию.
mkdir -p $SSL_PATH \
&& mkdir -p $SITE_PATH \
&& mkdir -p $DB_PATH \
&& mkdir -p $NGINX_CONF_PATH \
&& openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout $SSL_PATH/nginx.key -out $SSL_PATH/nginx.crt \
&& sed -i ‘’ "s|server_name localhost;|server_name ${SITE_DOMAIN};|g" "${NGINX_CONF_PATH}/website.conf" \
&& cd docker/nginx \
&& sh builddocker.sh \
&& cd ../php-fpm \
&& sh builddocker.sh \
&& create_volume ssl $SSL_PATH \
&& create_volume site $SITE_PATH \
&& create_volume db $DB_PATH \
&& create_volume nginx-conf $NGINX_CONF_PATH

Docker Compose

Создайте файл docker-compose.yml, а также добавьте в .env еще одну переменную – 

Содержимое docker-compose файла ниже, о синтаксисе можете прочитать в документации, а я поясню, что именно будет выполняться.

  1. На основе указанных образов запустяться контейнеры

  2. В контейнеры пробросятся созданные нами ранее тома

  3. В контейнерах откроются порты

  4. Создается внутренняя сеть, которая упростит взаимодействие контейнеров друг с другом.

version: '3.1'
services: db: image: mariadb:11.2.2 container_name: db restart: always volumes: - db:/var/lib/mysql ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} networks: - localhost_net php-fpm-custom: image: php-fpm-custom:latest container_name: php-fpm-custom restart: always volumes: - www:/var/www ports: - 9000:9000 networks: - localhost_net redis: image: redis:7.2.4 container_name: redis restart: always ports: - 6379:6379 networks: - localhost_net expose: - '6379' nginx-custom: depends_on: - db - php-fpm-custom image: nginx-custom:latest container_name: nginx-custom restart: always volumes: - ssl:/etc/nginx/ssl - www:/var/www - nginx-conf:/etc/nginx/sites-enabled ports: - 80:80 - 443:443 networks: localhost_net: aliases: - ${SITE_DOMAIN}
node: image: node:21.5 container_name: node restart: always networks: - localhost_net command: "tail -f /dev/null" phpmyadmin: depends_on: - db image: phpmyadmin:5.2.1 container_name: phpmyadmin restart: always ports: - 8081:80 environment: - PMA_ARBITRARY=1 networks: - localhost_net
networks: localhost_net:
volumes: ssl: external: true nginx-conf: external: true www: external: true db: external: true

Небазовые образы

Если по каким-то причинам базового образа недостаточно, вы можете создать папки в проекте с Dockerfile для вашего индивидуального образа. В моем случае мне потребовалось изменить некоторые настройки в Nginx и PHP-fpm образах, поэтому создайте папки nginx и php-fpm соответственно.

В каждой папке создайте Dockerfile и builddocker.sh скрипт.

# Используем этот базовый образ
FROM nginx:1.25.3
# Установим дополнительные пакеты, которые оказались нужны в этом контейнере
RUN apt-get update \ && apt-get -y install lsb-release libssl-dev ca-certificates curl openssl
# Если хотите пробросить кастомный основной конфиг nginx, то это можно сделать здесь
COPY nginx.conf /etc/nginx/nginx.conf
# Откроем порты
EXPOSE 80 443
# Запустим Nginx как foreground процесс, чтобы контейнер не выключался
CMD ["nginx", "-g", "daemon off;"]

Этот скрипт будет создавать образ с тегом :latest в вашей локальной системе, а также удалять старый образ, если вдруг вы обновите конфигурацию, который потом будет использовать docker compose.

#!/bin/bash
docker build -t nginx-custom --label nginx-custom . \
&& docker image prune --force --filter='label=nginx-custom'

Основной конфиг nginx.conf

В моем случае я только увеличил client_max_body_size, возможно еще gzip и tcp директивы, не помню точно стандартный конфиг, но настройка конфига nginx под себя – это тема отдельных статей. 

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events { worker_connections 1024;
}
http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nodelay on; tcp_nopush on; keepalive_timeout 35; gzip on; client_max_body_size 20M; include /etc/nginx/conf.d/*.conf;
}
# В моем случае я использую 8.1 т.к. WordPress ещё слабо поддерживает версии выше, но вы можете указать нужную вам версию PHP.
FROM php:8.1-fpm
# добавим в PATH композер, который мы установим далее.
ENV PATH="/root/.composer/vendor/bin:${PATH}"
# А вот здесь устанавливаем довольно много всего - рекомендуемые php-extensions для WordPress, Composer, WP-CLI,
RUN apt-get update \ && apt-get install -y libzip-dev unzip libpq-dev libmagickwand-dev libpng-dev libjpeg-dev libfreetype6-dev less \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-install zip pdo_pgsql pgsql bcmath opcache \ && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \ && chmod +x /usr/local/bin/composer \ && curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \ && chmod +x wp-cli.phar \ && mv wp-cli.phar /usr/local/bin/wp \	&& pecl install imagick && docker-php-ext-enable imagick \	&& docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd
# Если хотите пробросить кастомный php.ini, то это можно раскомментировать
# COPY php.ini /usr/local/etc/php/php.ini
# Expose port 9000 for PHP-FPM
EXPOSE 9000
# Start PHP-FPM
CMD ["php-fpm"]

Не буду публиковать весь огромный файл конфига, но стандартно я в нем меняю следующие настройки:

upload_max_filesize = 16M

post_max_size = 16M

Следует помнить, что за основу нужно брать стандартный конфиг от выбранной вами версии PHP, найти его можно например запустив контейнер сначала без пробрасывания собственного php.ini.

Nginx конфиги для проектов

В указанной в .env папке для nginx конфигов сайтов создайте файл website.conf

:/>  <strong>как форматировать числа до 2 десятичных знаков</strong>

Мы указали выше, что все созданные конфиги будут добавляться, как том в контейнер с Nginx, и при запуске он их учтет.

В моем случае, конфиг для сайта на WordPress вот такой:

server { listen 80; server_name localhost; return 301 https://$host$request_uri;
}
server { listen 443 ssl; server_name localhost; gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_proxied any; gzip_vary on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; root /var/www/site; index index.php; location / { proxy_request_buffering off; try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi_params; fastcgi_pass php-fpm-custom:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; }
}

Важно! Выбранные вами домены надо также указать в hosts родительской системы или прописать в DNS, если разворачиваете на сервере!

Запуск окружения

Если вы еще этого не сделали, то выполните

sh install.sh в вашем терминале.

Затем вы можете запустить окружение командой
docker-compose up -d

И остановить командой
docker-compose down

Алиасы

Так как все привычные вам инструменты разработки тоже оказались в контейнере, то это скажется на процессе разработки.

Привычные вам короткие команды потребуется запускать через docker exec или docker run, поэтому предлагаю использовать алиасы. Да и линтеры не будут выполняться если в родительской системе их нет и не созданы алиасы на контейнер.

Добавьте следующее содержимое в файл ~/.bashrc (если используете bash в качестве терминала):

alias composer='docker exec -it -w /var/www/site php-fpm-custom composer'
alias phpcs='docker run --rm -it -v $(pwd):/app -w /app php-fpm-custom vendor/bin/phpcs'
alias phpcbf='docker run --rm -it -v $(pwd):/app -w /app php-fpm-custom vendor/bin/phpcbf'
alias wp='docker exec -it -w /var/www/site php-fpm-custom wp'
alias node='docker run --rm -it -v $(pwd):/app -w /app node:21.5 node'
alias npm='docker run --rm -it -v $(pwd):/app -w /app node:21.5 npm'
alias npx='docker run --rm -it -v $(pwd):/app -w /app node:21.5 npx'
alias yarn='docker run --rm -it -v $(pwd):/app -w /app node:21.5 yarn'

Алиас позволит вам привычно писать команду, но выполняться будет другая, указанная вами. То есть написав npm run build, вы фактически выполните команду docker run --rm -it -v $(pwd):/app -w /app node:21.5 npm run build

Если у вас в родительской системе уже стоят свои версии ПО и вы хотите оставить их доступными, вы можете изменить алиасы, добавив суффиксы в команды: -docker

Таким образом, вы сможете выполнять npm или npm-docker в зависимости от того, хотите ли вы использовать родительские программы или те, что находятся в контейнере.

IDE

Я использую VScode, поэтому могу рассказать только про эту IDE.

Если вы все же решите использовать только алиасы, а на родительской системе программ не будет, вы можете столкнуться с тем, что придется дополнительно настроить IDE или же заменить некоторые extensions на аналоги, которые будут использовать программы в контейнере.

В моем случае это коснулось линтеров PHP и JS. 

В рекомендациях своего проекта я указал следующие:

Также при использовании подсистемы для хранения файлов необходимо будет установить WSL extension и запускать VScode в режиме WSL.

Простое руководство

Заключение

Надеюсь, эта информация окажется вам полезна, а о причинах переноса локального окружения для разработки в Docker, я рассказал в начале статьи. 

Возможно, помимо использования разработчиками, вы также сможете внедрить процессы тестирования веток QA командой на их локальных машинах. 

Также эти образы можно использовать в пайплайнах GitLab для автоматических линтов и тестов MR.

  • Основные команды Docker, которые вам необходимо знать для эффективной работы

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

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

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

  • docker run

Создает и запускает контейнер из образа. Принимает различные параметры и аргументы, которые определяют настройки контейнера.

Запуск контейнера в фоновом режиме, проброс порта с хоста на контейнер и передача переменной окружения:

docker run -d -p 8080:80 -e ENV_VAR=value nginx

Запуск контейнера с ограничением ресурсов, в данном примере — количества оперативной памяти:

docker run --memory=2g myimage
  • docker start

Запускает остановленный контейнер. Позволяет возобновить выполнение контейнера, который был ранее остановлен.

Запуск одного остановленного контейнера:

docker start mycontainer
docker start first_container second_container third_container
  • docker stop

Останавливает работающий контейнер. Позволяет завершить выполнение контейнера и отключить его.

Остановка одного работающего контейнера:

docker stop mycontainer
docker stop first_container second_container third_container

Остановка по времени (в данном примере — через 30 секунд):

docker stop -t 30 mycontainer
  • docker restart

Перезапускает контейнер. Позволяет остановить контейнер и затем опять запустить.

Перезапуск одного контейнера:

docker restart mycontainer
docker restart first_container second_container third_container

Перезапуск через определенное время:

docker restart -t 30 mycontainer
  • docker rm

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

Удаление одного контейнера:

docker rm mycontainer
docker rm first_container second_container third_container

Принудительное удаление (позволяет удалить контейнер, который выполняется в данный момент):

docker rm -f mycontainer
  • docker ps

Отображает список активных контейнеров в системе. Позволяет получить различную информацию о работающих контейнерах, включая их ID, имена, статус, порты, использование ресурсов.

Отображение списка только работающих контейнеров:

Отображение списка всех (включая остановленные):

docker ps -a

Отображение размера занимаемого дискового пространства:

docker ps -s

Команды для управления образами

  • docker pull

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

Если Docker Hub недоступен, можно использовать наш бесплатный прокси, который возобновляет этот доступ. 

Загрузка последней версии Ubuntu:

docker pull ubuntu

Здесь ubuntu — это имя образа, но версия не указана, поэтому будет загружена последняя.

Загрузка определенной версии:

docker pull ubuntu:20.04
  • docker build

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

Сборка образа из текущего каталога, используя Dockerfile в этом каталоге:

docker build -t myimage:latest .

Сборка образа из удаленного репозитория Git, который содержит Dockerfile:

  • docker push

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

Загрузка в репозиторий по умолчанию:

Загрузка в другое хранилище (в данном примере — репозиторий ECR):

docker push myecr/myimage:latest
  • docker rmi

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

Удаление одного образа:

docker rmi myimage:1.0
docker rmi myimage:1.0 myotherimage:latest
  • docker images

Выводит список образов, которые находятся на вашем локальном хосте. Она позволяет просматривать информацию о доступных образах: идентификаторы, размеры, теги и прочее.

Вывод всех образов:

Вывод образов по конкретному репозиторию:

docker images myrepository/myimage

Команды для управления хранилищами данных

  • docker volume create

Создает новый том Docker. Тома в Docker представляют собой постоянные хранилища данных, которые используются контейнерами для хранения и обмена информацией между ними. Тома позволяют сохранять данные даже после удаления или перезапуска контейнеров.

Создание нового тома:

docker volume create myvolume

Создание с указанием драйвера:

docker volume create --driver local myvolume

Создание тома с добавлением меток:

docker volume create --label mylabel=myvalue myvolume
  • docker run -v

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

Привязка существующего тома:

docker run -v myvolume:/data myimage

Привязка тома с указанием дополнительных опций (например, read only):

docker run -v myvolume:/data:ro myimage
  • docker volume rm

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

Удаление одного тома:

docker volume rm myvolume
docker volume rm first_volume second_volume third_volume
  • docker volume ls

Используется для вывода списка всех доступных томов на локальном хосте. Позволяет просмотреть существующие тома и получить информацию о них, в том числе имена и идентификаторы.

docker volume ls

Будет выведен список всех доступных томов на вашем локальном хосте. Результат будет содержать столбцы с информацией о каждом томе, включая их имена, идентификаторы и дополнительные сведения, если они есть. Пример вывода:

DRIVER    VOLUME NAME
local     myvolume1
local     myvolume2

Команды Docker Compose

Docker Compose работает поверх Docker и позволяет управлять множеством контейнеров в рамках одного проекта. Давайте рассмотрим основные команды (принципы работы большинства из них вам уже знакомы):

  • docker-compose up — запускает приложение со всеми контейнеры, информация о которых есть в docker-compose.yml. Если файл не указан, по умолчанию используется файл в текущем каталоге;
  • docker-compose down — останавливает и удаляет все контейнеры, а также тома, связанные с ними;
  • docker-compose start — запускает остановленные контейнеры;
  • docker-compose stop — останавливает работу запущенных контейнеров без их удаления;
  • docker-compose restart — перезапускает контейнеры;
  • docker-compose build — позволяет обновить образы или создать их заново, если они были изменены;
  • docker-compose logs — выводит журналы состояния;
  • docker-compose ps — отображает текущее состояние контейнеров;
  • docker-compose pull — загружает последние версии образов для сервисов, описанных в файле docker-compose.yml.

Заключение

Мы рассмотрели основные команды Docker, которые позволяют управлять контейнерами и образами. Изучив эту платформу более глубоко, вы убедитесь в том, что Docker предоставляет мощные возможности для разработки, тестирования и развертывания приложений, обеспечивая эффективное использование ресурсов и изоляцию приложений. Желаем успехов!

Docker Scout трансформировал сложную область безопасности контейнеров, предоставив унифицированный взгляд на прямые и транзитивные зависимости во всех слоях образов. Для более глубокого понимания революционного вклада Docker Scout в безопасность контейнеров, рекомендую ознакомиться с моей предыдущей статьей, названной “Docker Scout это революция в области безопасности контейнеров”.

В этой статье мы переходим от теории к практике, демонстрируя Docker Scout в действии, позволяя вам увидеть его инновационные возможности. Я продемонстрирую работу Docker Scout через графический интерфейс Docker Desktop и интерфейс командной строки (CLI).

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

Установка Docker Scout

Чтобы использовать Docker Scout, необходимо установить Docker Desktop. Платформа доступна для операционных системах Linux, macOS и Windows. Установщик Docker Desktop также включает в себя инструмент Docker CLI.

Подробно о том, как установить Docker Desktop на macOS, вы можете прочитать в моем руководстве “Установка Docker Desktop на macOS”.

Установка Docker Scout на сервер

Чтобы без усилий развернуть Docker Scout на вашем сервере, просто выполните следующую команду:

curl https://raw.githubusercontent.com/docker/scout-cli/main/install.sh | sh 

Ручная установка

  • Распакуйте Docker Scout в виде:
    • docker-scout на Linux и macOS
    • docker-scout.exe на Windows
  • Скопируйте Docker Scout в локальную директорию плагинов CLI:
    • $HOME/.docker/cli-plugins на Linux и macOS
    • %USERPROFILE%\.docker\cli-plugins на Windows
  • Сделайте Docker Scout исполняемым на Linux и macOS:
    • chmod +x $HOME/.docker/cli-plugins/docker-scout
  • Разрешите бинарному файлу быть исполняемым на macOS:
    • xattr -d com.apple.quarantine $HOME/.docker/cli-plugins/docker-scout

Изучение Docker Scout с помощью Docker Desktop GUI

Убедитесь, что вы используете самую последнюю версию Docker Desktop, и перейдите в раздел “Images” в меню.

В этом руководстве мы проведем тщательное исследование уязвимостей безопасности, связанных с образом Mattermost.

Для более подробного изучения процесса установки Mattermost с помощью Docker Compose, я приглашаю вас ознакомиться с моим подробным руководством под названием “Установка Mattermost с помощью Docker Compose”.

На вкладке “Local” вы найдете все образы, доступные в вашей системе. Если у вас еще нет образов, то вы можете загрузить любой из них с помощью команды docker pull.

Нажмите на образ, который вы хотите проверить на уязвимости.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

На вкладке “Vulnerabilities” вы увидите отчет обо всех проблемах безопасности в образе.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Затем вы можете нажать “Recommended fixes” и выбрать “Recommendations for base image”, чтобы проверить рекомендации.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

В этом случае вы можете рассмотреть возможность обновления вашего базового образа.

Смотрите рекомендации на вкладке “Refresh base image”.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Или полностью изменить базовый образ.

Смотрите рекомендации на вкладке “Change base image”.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Изучение Docker Scout с помощью CLI

В этой части мы рассмотрим некоторые ключевые команды, которые неотъемлемы для функциональности Docker Scout CLI:

docker scout quickview: Эта команда предоставляет краткую сводку образа, позволяя вам быстро понять его основные характеристики.

docker scout cves: Эта команда открывает общие уязвимости (CVE), обнаруженные для любых программных артефактов, найденных в образе, держа вас в курсе потенциальных рисков безопасности.

docker scout recommendations: С помощью этой команды вы получите список всех возможных обновлений базового образа и предложений по устранению недостатков, что поможет вам улучшить безопасность и эффективность вашего контейнера.

docker scout compare: Эта команда позволяет вам сравнивать два разных образа, выделяя их различия. Эта функция особенно полезна, когда вы отслеживаете изменения или обновления.

Понимая и используя эти команды Docker Scout CLI, вы значительно улучшите свои практики управления контейнерами и безопасности.

В данном руководстве я буду использовать терминальный эмулятор iTerm2, установленный на операционную систему macOS.

В этом руководстве мы проведем тщательное исследование уязвимостей безопасности, связанных с образом Mattermost.

Для более подробного изучения процесса установки Mattermost с помощью Docker Compose, я приглашаю вас ознакомиться с моим подробным руководством под названием “Установка Mattermost с помощью Docker Compose”.

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

docker scout quickview mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Теперь давайте раскроем общие уязвимости (CVE), обнаруженные для любых программных артефактов, найденных в образе, используя команду:

docker scout cves mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

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

docker scout recommendations mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Давайте прокрутим вверх, чтобы увидеть больше деталей.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Теперь давайте попробуем сравнить образы, выделяя их различия. В этом случае мы сравним два разных релиза Mattermost.

docker scout compare --to mattermost/mattermost-team-edition:release-7.11 mattermost/mattermost-team-edition:release-7.10

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Давайте прокрутим вверх, чтобы увидеть больше деталей.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Изучение Docker Scout с помощью CLI в контейнере

В этой части мы рассмотрим способ использования Docker Scout в контейнере.

В данном руководстве я буду использовать терминальный эмулятор iTerm2, установленный на операционную систему macOS.

В этом руководстве мы проведем тщательное исследование уязвимостей безопасности, связанных с образом Mattermost.

Для более подробного изучения процесса установки Mattermost с помощью Docker Compose, я приглашаю вас ознакомиться с моим подробным руководством под названием “Установка Mattermost с помощью Docker Compose”.

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

docker run -it \
-e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
-e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
docker/scout-cli quickview mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Теперь давайте раскроем общие уязвимости (CVE), обнаруженные для любых программных артефактов, найденных в образе, используя команду:

docker run -it \
-e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
-e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
docker/scout-cli cves mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

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

docker run -it \
-e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
-e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
docker/scout-cli recommendations mattermost/mattermost-team-edition:release-7.11

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Теперь давайте попробуем сравнить образы, выделяя их различия. В этом случае мы сравним два разных релиза Mattermost.

docker run -it \
-e DOCKER_SCOUT_HUB_USER=YOUR_DOCKER_HUB_USER_NAME \
-e DOCKER_SCOUT_HUB_PASSWORD=YOUR_DOCKER_HUB_PASSWORD_OR_ACCESS_TOKEN \
docker/scout-cli compare --to mattermost/mattermost-team-edition:release-7.11 mattermost/mattermost-team-edition:release-7.10

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Давайте прокрутим вверх, чтобы увидеть больше деталей.

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Изучение Docker Scout с помощью Docker Desktop GUI и CLI

Заключение

И вот оно – подробное руководство по использованию Docker Scout как через графический интерфейс Docker Desktop, так и через CLI. Если поддержание максимальной безопасности ваших контейнеров является приоритетом – и это определенно должно быть так – то немедленное интегрирование этого мощного инструмента в ваш рабочий процесс настоятельно рекомендуется. С Docker Scout вы не просто повышаете безопасность; вы вкладываетесь в устойчивость и надежность архитектуры вашего контейнера.


Мои курсы

🎓 Погрузитесь в мои обширные курсы по информационным технологиям, разработанные как для энтузиастов, так и для профессионалов. Независимо от того, хотите ли вы освоить Docker, покорить Kubernetes или углубить свои навыки в области DevOps, мои курсы предлагают структурированный путь к повышению вашего технического мастерства.

Мои услуги

💼 Загляните в мой каталог услуг и узнайте, как мы можем сделать вашу технологическую жизнь лучше. Будь то повышение эффективности вашей IT-инфраструктуры, развитие вашей карьеры или расширение технологических горизонтов — я здесь, чтобы помочь вам достичь ваших целей. От DevOps-трансформаций до сборки игровых компьютеров — давайте сделаем ваши технологии непревзойденными!

Этот контент создан искусственным интеллектом?

Нет! Каждая статья — результат моей работы, наполненной страстью к Docker и десятилетиями опыта в IT. Я применяю ИИ для улучшения грамматики, чтобы обеспечить четкость технических деталей, однако все идеи, стратегии и рекомендации исключительно мои. Этот метод иногда может вызывать срабатывание детекторов ИИ, но можете быть уверены, что вся представленная информация и опыт — подлинно мои.

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию

В конце подарим скидку до 55% на обучение

Работать самостоятельно и не зависеть от других

Работать в команде и рассчитывать на помощь коллег

Организовывать и контролировать процесс работы

Начните работу с Docker, установив Docker Desktop. Затем запустите свой первый контейнер с помощью команды docker run -d -p 80:80 docker/getting-started. Изучите процесс создания образов с помощью Dockerfile, используя команду docker build -t myimage ., а также управления контейнерами с помощью команд docker ps, docker stop.

Основы Docker и его ключевые элементы

  • Значимость Docker: Преобразует ручную настройку программного окружения в автоматизированные, стандартизированные процессы, что критически важно для облачных приложений и управления сервисами.
  • Образы: Служат самостоятельными блоками для запуска приложений, содержащими все необходимые элементы, конфигурации и переменные среды.
  • Контейнеры: Это экземпляры образов Docker, которые изолируют и запускают ваши приложения, обеспечивая изолированное приложение окружение.
  • Docker Hub: Центральный репозиторий для поиска, обмена и управления образами Docker, упрощающий контроль версий и совместную работу.
  • Dockerfile: Скрипт, содержащий команды для автоматического создания образов Docker, указывающий базовый образ, зависимости и шаги сборки.

Начало работы с Docker

  1. Установка: Убедитесь, что ваша система соответствует требованиям (например, 8 ГБ+ ОЗУ для Windows/Mac). Скачайте Docker Desktop с официального сайта Docker.
  2. Запуск первого контейнера: Используйте команду docker run -d -p 80:80 docker/getting-started, чтобы скачать и запустить простой учебный контейнер.
  3. Создание и управление образами: Изучите процесс создания Dockerfile, затем создайте образ с помощью docker build -t myimage . и управляйте образами с помощью команд, таких как docker images, docker rmi.
  4. Управление контейнерами: Используйте команды, такие как docker ps, docker stop и docker rm, для управления запущенными контейнерами.

Практические упражнения и ресурсы

  • Практическое обучение: Применяйте практические упражнения, такие как контейнизация простого веб-приложения, использование томов для постоянных данных и развертывание многообъектного приложения с помощью Docker Compose.
  • Учебные пособия и курсы: Изучите бесплатные ресурсы, такие как учебное пособие Docker 101 на официальном сайте Docker и “Изучаем Docker за 7 простых шагов – Полное учебное пособие для начинающих” на YouTube для практического обучения.
  • Сообщество и поддержка: Присоединяйтесь к сообществу Docker на форумах, Stack Overflow и GitHub для получения поддержки, новых идей и обмена опытом.

Расширенные концепции Docker

  • Docker Compose: Упрощает определение и запуск многообъектных приложений Docker; изучите, как использовать файл docker-compose.yml, чтобы настроить службы вашего приложения.
  • Docker Swarm и Kubernetes: Для оркестрации начните с понимания основ Docker Swarm, затем постепенно переходите к Kubernetes для управления большими кластерами контейнеров.
  • Непрерывная интеграция/непрерывная доставка (CI/CD): Изучите, как Docker интегрируется в конвейеры CI/CD, автоматизируя процесс развертывания и обеспечивая согласованные среды разработки, тестирования и эксплуатации.

Рекомендации по безопасности

  • Безопасность образов: Используйте официальные или хорошо отзывавшиеся образы из Docker Hub, сканируйте образы на наличие уязвимостей и избегайте включения в образы конфиденциальных данных.
  • Изоляция контейнеров: Используйте встроенные в Docker средства безопасности, такие как пространства имен и cgroups, чтобы ограничить влияние потенциальных нарушений.
  • Регулярные обновления: Поддерживайте актуальность установки Docker и образов, чтобы устранить уязвимости безопасности.

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию

В конце подарим скидку до 55% на обучение

Работать самостоятельно и не зависеть от других

Работать в команде и рассчитывать на помощь коллег

Организовывать и контролировать процесс работы

Введение в Docker и docker-compose

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

docker-compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. С помощью файла docker-compose.yml можно описать конфигурацию всех сервисов, сетей и томов, необходимых для вашего приложения, и запустить их одной командой. Это упрощает управление сложными приложениями, состоящими из нескольких взаимосвязанных сервисов. Например, веб-приложение может состоять из веб-сервера, базы данных и кэш-сервиса, и все эти компоненты можно легко управлять с помощью docker-compose.

Установка и настройка Docker

Установка Docker

Для установки Docker на вашу систему следуйте официальной документации для вашей операционной системы:

Процесс установки может немного отличаться в зависимости от операционной системы, но в целом он достаточно прост и хорошо документирован. На Windows и macOS установка включает Docker Desktop, который предоставляет удобный графический интерфейс для управления Docker-контейнерами. На Linux установка может потребовать выполнения нескольких команд в терминале, но это также несложно.

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

После установки Docker, убедитесь, что он работает корректно, выполнив команду:

Вы должны увидеть версию Docker, установленную на вашем компьютере. Это подтверждает, что Docker установлен и готов к использованию. Если команда не работает, проверьте, правильно ли вы следовали инструкциям по установке и не пропустили ли какой-либо шаг.

Установка docker-compose

  • Windows и macOS: docker-compose устанавливается вместе с Docker Desktop.
  • Linux: Следуйте инструкциям на официальном сайте.

Проверьте установку, выполнив команду:

Вы должны увидеть версию docker-compose, установленную на вашем компьютере. Это подтверждает, что docker-compose установлен и готов к использованию. Если команда не работает, проверьте, правильно ли вы следовали инструкциям по установке и не пропустили ли какой-либо шаг.

Основные команды Docker: создание и управление контейнерами

Создание контейнера

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

docker run -d -p 80:80 nginx

Эта команда скачает образ Nginx (если он еще не скачан), запустит контейнер в фоновом режиме (-d) и пробросит порт 80 на ваш локальный порт 80 (-p 80:80). Это позволяет вам получить доступ к веб-серверу Nginx через ваш браузер по адресу http://localhost. Вы можете использовать другие образы и настраивать порты и параметры в зависимости от ваших нужд.

Управление контейнерами

  • Список запущенных контейнеров:

    Эта команда выводит список всех запущенных контейнеров, включая их идентификаторы, имена, образы и статус. Это полезно для мониторинга состояния ваших контейнеров и управления ими.

  • docker stop <container_id>

    Эта команда останавливает контейнер с указанным идентификатором. Вы можете использовать идентификатор контейнера, полученный из команды docker ps. Остановка контейнера позволяет освободить ресурсы, которые он использует.

  • Эта команда удаляет остановленный контейнер с указанным идентификатором. Удаление контейнера освобождает дисковое пространство и позволяет вам управлять количеством контейнеров на вашем компьютере.

  • Список всех контейнеров (включая остановленные):

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

Создание и использование docker-compose.yml

Структура файла docker-compose.yml

Файл docker-compose.yml используется для определения конфигурации всех сервисов вашего приложения. Пример файла для простого веб-приложения на Nginx и Redis:

version: '3'
services: web: image: nginx ports: – "80:80" redis: image: redis

В этом примере определены два сервиса: web и redis. Сервис web использует образ Nginx и пробрасывает порт 80 на локальный порт 80. Сервис redis использует образ Redis. Вы можете добавлять дополнительные сервисы и настраивать их параметры в зависимости от ваших нужд.

Запуск сервисов

Для запуска всех сервисов, определенных в docker-compose.yml, выполните команду:

Эта команда запустит все сервисы в текущем терминале и выведет их логи. Для запуска в фоновом режиме добавьте флаг -d:

Это позволяет вам продолжать работать в терминале, пока сервисы работают в фоновом режиме. Вы можете использовать эту команду для запуска всех сервисов вашего приложения с одной команды.

Остановка и удаление сервисов

  • Остановка всех сервисов:

    Эта команда останавливает все сервисы, определенные в docker-compose.yml, и удаляет их контейнеры. Это полезно для освобождения ресурсов и завершения работы всех сервисов.

  • Удаление всех контейнеров, сетей и томов, созданных docker-compose:

    docker-compose down --volumes

    Эта команда дополнительно удаляет все тома, созданные docker-compose. Это полезно для полного удаления всех данных, связанных с вашими сервисами.

Примеры использования Docker и docker-compose в реальных проектах

Пример 1: Веб-приложение на Node.js и MongoDB

Создадим файл docker-compose.yml для веб-приложения на Node.js с базой данных MongoDB:

version: '3'
services: web: image: node:14 volumes: – .:/app working_dir: /app command: npm start ports: – "3000:3000" depends_on: – mongo mongo: image: mongo ports: – "27017:27017"

В этом примере определены два сервиса: web и mongo. Сервис web использует образ Node.js версии 14, монтирует текущую директорию в контейнер и запускает команду npm start. Сервис mongo использует образ MongoDB и пробрасывает порт 27017 на локальный порт 27017. Сервис web зависит от сервиса mongo, что означает, что MongoDB будет запущен перед запуском веб-приложения.

Пример 2: Использование Docker в GitHub Actions

Для автоматизации CI/CD процессов можно использовать Docker в GitHub Actions. Пример workflow для сборки и тестирования приложения:

name: CI
on: [push]
jobs: build: runs-on: ubuntu-latest steps: – name: Checkout code uses: actions/checkout@v2 – name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 – name: Build and push Docker image uses: docker/build-push-action@v2 with: context: . push: true tags: user/app:latest – name: Run tests run: docker run user/app:latest npm test

Этот workflow запускается при каждом пуше в репозиторий. Он выполняет следующие шаги: проверяет код, настраивает Docker Buildx, собирает и пушит Docker-образ, а затем запускает тесты внутри контейнера. Это позволяет автоматизировать процесс сборки и тестирования вашего приложения, обеспечивая стабильность и предсказуемость.

Пример 3: Многоконтейнерное приложение с Nginx, Flask и PostgreSQL

Создадим файл docker-compose.yml для многоконтейнерного приложения с Nginx, Flask и PostgreSQL:

version: '3'
services: web: image: flask-app build: ./web ports: – "5000:5000" depends_on: – db db: image: postgres environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydatabase nginx: image: nginx ports: – "80:80" volumes: – ./nginx.conf:/etc/nginx/nginx.conf depends_on: – web

В этом примере определены три сервиса: web, db и nginx. Сервис web использует образ Flask-приложения и пробрасывает порт 5000 на локальный порт 5000. Сервис db использует образ PostgreSQL и настраивает параметры базы данных через переменные окружения. Сервис nginx использует образ Nginx и пробрасывает порт 80 на локальный порт 80. Сервис nginx зависит от сервиса web, что означает, что Flask-приложение будет запущено перед запуском Nginx.

Эти примеры помогут вам начать работу с Docker и docker-compose. Надеюсь, они будут полезны для ваших проектов! 🚀