Перейти к содержимому

Имя docker не распознано как имя командлета

  • автор:

Docker и Visual Studio Code Remote-Containers — как сэкономить время при развёртывании проектов

Попробуем использовать инструмент для контейнеризации проекта со всем его окружением. Это позволит автоматизировать развёртывание.

Александр Бунтов
Senior Software Engineer компании СберМаркет

Начало проекта на Ruby on Rails — это время на развёртывание: установка нужной версии, гемов и их зависимостей, а также различных баз данных. Иногда процесс идёт не идеально, и приходится тратить время на поиск решения в Stackoverflow. Чтобы упростить жизнь, можно использовать инструмент для контейнеризации проекта со всем его окружением. Это позволит автоматизировать развёртывание и добавит бонусов вашему резюме.

В качестве полнофункциональной среды разработки мы будем использовать Docker-контейнеры и Visual Studio Code. По тому, как установить и пользоваться Docker есть масса статей и видео, поэтому этот увлекательный путь вы без труда пройдёте сами. А вот для Visual Studio Code нам потребуется установить специальное приложение Remote-Containers plugin, которое позволит работать внутри контейнера и использовать весь набор функций.

Шаг первый: завернуть весь проект с помощью Docker и Docker-Compose. Создать докер файл легко: вам достаточно нажать в VS Code F1 , выбрать Docker: Add Docker Files to Workspace и следовать подсказкам. Также можно создать Dockerfile в корневой папке. Пример файла для Ruby on Rails приложения:

# syntax=docker/dockerfile:1 FROM ruby:3.0.2 RUN apt-get update -qq && apt-get install -y nodejs # throw errors if Gemfile has been modified since Gemfile.lock RUN bundle config --global frozen 1 WORKDIR /workspace COPY Gemfile /workspace/Gemfile COPY Gemfile.lock /workspace/Gemfile.lock RUN bundle install # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"] 

Далее создаем файл со скриптами entrypoint.sh , который так же добавим в корневую папку:

#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" 

Чтобы магия сработала, создадим docker-compose.yml :

version: "3.9" services: db: image: postgres volumes: - ./tmp/db:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: password redis: image: redis:5-alpine workspace: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/workspace ports: - '3000:3000' depends_on: - db - redis 

После этого устанавливаем Remote-Containers plugin в VS Code — плагин позволит работать внутри контейнера. Затем создаем файл конфигурации: F1 >> Remote-Containers: Add Development Container Configuration Files

В папке .devcontainer вы найдете файл devcontainer.json

// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: // https://github.com/microsoft/vscode-dev-containers/tree/v0.187.0/containers/docker-existing-docker-compose // If you want to run as a non-root user in the container, see .devcontainer/docker-compose.yml. < "name": "Existing Docker Compose (Extend)", // Update the 'dockerComposeFile' list if you have more compose files or use different names. // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make. "dockerComposeFile": [ "../docker-compose.yml", "docker-compose.yml" ], // The 'service' property is the name of the service for the container that VS Code should // use. Update this value and .devcontainer/docker-compose.yml to the real service name. "service": "web", // The optional 'workspaceFolder' property is the path VS Code should open by default when // connected. This is typically a file mount in .devcontainer/docker-compose.yml "workspaceFolder": "/workspace", // Set *default* container specific settings.json values on container create. "settings": <>, // Add the IDs of extensions you want installed when the container is created. "extensions": [] // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], // Uncomment the next line if you want start specific services in your Docker Compose config. // "runServices": [], // Uncomment the next line if you want to keep your containers running after VS Code shuts down. // "shutdownAction": "none", // Uncomment the next line to run commands after the container is created - for example installing curl. // "postCreateCommand": "apt-get update && apt-get install -y curl", // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root. // "remoteUser": "vscode" > 

Внесём новые настройки и уберем лишние комментарии. Добавим все сервисы из docker-compose.yml в «runServices»: [«workspace», «db», «redis»] , чтобы запустить их на старте.

Для того, чтобы VS Code останавливал контейнеры, когда окно закроется, добавим строчку «shutdownAction»: «stopCompose» , а также добавим список портов внутрь контейнера, которые будут доступны локально «forwardPorts»: [3000]

Пример итогового содержания файла:

< "name": "Example", "dockerComposeFile": [ "../docker-compose.yml", "docker-compose.yml" ], "runServices": ["workspace", "db", "redis"], "service": "workspace", "shutdownAction": "stopCompose", "workspaceFolder": "/workspace", "forwardPorts": [3000], "settings": <>, "extensions": [] > 

Теперь подготовим базу для нашего приложения и запустим в терминале: docker-compose run workspace rake db:create. Запускаем F1 >> Remote-Containers: Rebuild and Reopen in Container и с помощью команды в терминале rails s открываем готовое приложение.

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

Поздравляю! Теперь не нужно устанавливать никакие зависимости и лишние библиотеки — вы работаете внутри контейнера.

Начало работы с Poetry — Python: Настройка окружения

Во всех проектах профессии мы предлагаем использовать инструмент poetry — с его помощью можно управлять зависимостями. Сегодня это главный инструмент Python-разработчика.

Poetry — простой и удобный инструмент, который упрощает ведение и разработку проекта. Советуем оформлять каждый учебный эксперимент как poetry-проект, так вы быстрее привыкнете к профессиональным инструментам.

В этом уроке будем разбираться, как работать с Poetry. Пойдем по следующим шагам:

  • Установка
  • Настройка
  • Создание первого poetry-проекта
  • Работа с pyproject.toml
  • Инициализация виртуального окружения

Как установить Poetry

Poetry написан на Python, но это не обычная Python-программа, которую устанавливают с помощью pip install . Во вводном разделе документации к Poetry вы найдете команды для установки программы в вашу операционную систему.

Когда вы установите Poetry, он станет доступен как отдельная команда в shell:

--version Poetry version … 

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

Как настроить Poetry

Если сразу после установки запросить перечень настроек Poetry, можно увидеть следующее:

--list cache-dir = "/…/…/.cache/pypoetry" virtualenvs.create = true virtualenvs.in-project = null virtualenvs.path = "/virtualenvs" # /home/astynax/.cache/pypoetry/virtualenvs 

Poetry работает с виртуальными окружениями. При этом он изначально настроен так, что у вас будет много разных версий Python. По этой причине инструмент создает виртуальные окружения для проектов в непривычном месте — обратите внимание на настройку virtualenvs.path .

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

Вспомните, как вы создавали окружения командой python3 -m venv .venv . В Poetry стоит делать так же:

true 

Теперь у каждого poetry-проекта виртуальное окружение будет при себе. Например, так можно переносить проект с одной машины на другую — достаточно просто скопировать директорию.

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

Как создать первый проект

Создадим poetry-проект с помощью команды poetry new ИМЯ . Перед запуском Poetry убедитесь, что в системе доступна команда python3 .

Предположим, вы ввели команду poetry new first . Вот как будет выглядеть результат:

in first cd first # Переходим в созданную директорию tree . . ├── first │ └── __init__.py ├── pyproject.toml ├── README.md └── tests └── __init__.py 2 directories, 4 files 

Сообщение Created package first in first означает, что в проекте first создался одноименный пакет — директория first с соответствующим __init__.py . Любой poetry-проект всегда содержит хотя бы один пакет.

Кроме пакета first в проекте уже есть пакет tests . Пока он нам не нужен, но стоит знать, что у настоящих проектов всегда есть пакет с тестами.

Еще в реальном проекте у вас будет файл README.md , в котором вы будете держать описание проекта. У этого файла расширение .md — это файл формата Markdown . Это очень популярный формат разметки, даже этот урок написан на нем.

Самый важный файл в poetry-проекте — pyproject.toml . Это файл формата TOML , можете почитать о нем подробнее по ссылке.

Файл pyproject.toml содержит конфигурацию проекта. Информация из этого файла нужна, чтобы Poetry мог:

  • Управлять зависимостями проекта
  • Запускать код на исполнение
  • Запускать инструменты для разработки
  • Собирать дистрибутив и публиковать его на PyPI

Чем больше вы работаете с Poetry, тем лучше вы разбираетесь в публикации проектов. Постепенно вы привыкаете, что в каждом пакете должно быть описание, правильная структура, указанная версия. Мы советуем всегда оформлять проекты по этим стандартам, даже если вы не собираетесь публиковать проект в индекс.

Мы создали первый проект. Теперь нужно разобраться с pyproject.toml .

Как работать с pyproject.toml

У нового проекта файл конфигурации выглядит примерно так:

[tool.poetry] name = "first" version = "0.1.0" description = "" authors = ["…"] readme = "README.md" [tool.poetry.dependencies] python = "^3.10" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" 

Строчки вида [tool.poetry] описывают секции с парами «ключ = значение». Большую часть ключей нельзя помещать не в свои секции. В документации можете подробнее изучить ключи и узнать, каким секциям они принадлежат.

Здесь мы рассмотрим такие строчки:

  • tool.poetry — описывает проект с точки зрения Poetry. Здесь хранится версия version , описание description и название проекта name
  • tool.poetry.dependencies — хранит список зависимостей, которые требуются для работы самого кода. Здесь всегда будет указан сам Python — без него код не запустить

Секция build-system указывает, что перед нами проект, который управляется Poetry. При этом есть и другие инструменты, чтобы управлять проектами. Для них секция build-system выглядит иначе.

Осталось разобраться с последним шагом — инициализацией виртуального окружения.

Как инициализировать виртуальное окружение

Poetry понимает, что окружение пора создать или обновить. При этом такую команду можно вызвать — poetry install :

install Updating dependencies Resolving dependencies. Writing lock file … Installing the current project: first (0.1.0) 

Эта команда устанавливает все зависимости в окружение в директорию .venv внутри проекта. Активируется окружение командой poetry shell , а завершается командой exit :

# Выведем список пакетов,установленных в системе pip list Package Version -------------------- --------------- asciinema 2.2.0 attrs 22.1.0 blinker 1.4 # Тут продолжение большого списка . # Как видите, в системе уже стоит немало пакетов # Поэтому мы можем столкнуться с конфликтом версий при установке нового пакета # Чтобы этого избежать, мы и используем виртуальные окружения # Выведем список пакетов в окружении poetry shell Spawning shell within /../first/.venv pip list # В новом окружении есть только необходимый минимум для работы Poetry Package Version ---------- ------- pip 22.2.2 setuptools 65.3.0 wheel 0.37.1 

Зачастую активация окружения необязательна — Poetry предлагает команду run , которая исполняет программы уже изнутри окружения. Например, REPL в рамках проекта принято запускать командой poetry run python .

Так выглядит работа с Poetry. Это удобный инструмент, поэтому мы советуем пользоваться им. Оформляйте даже самые маленькие эксперименты как poetry-проекты — так вы быстрее научитесь работать с инструментом.

Выводы

  • Poetry — удобный инструмент, который упрощает ведение и разработку проекта

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

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

Эта инструкция — часть курса «PostgreSQL для новичков».

Смотреть весь курс

Изображение записи

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

В прошлой статье о Docker-контейнерах мы рассказывали о преимуществах контейнеризации в целом, а в этой рассмотрим их относительно СУБД PostgreSQL. Также расскажем о ее установке внутри контейнера.

Зачем использовать PostgreSQL в контейнере

Чтобы больше понять о преимуществах контейнеризации PostgreSQL, немного забежим вперед и для примера посмотрим на те зависимые пакеты, которые автоматически будут установлены вместе с приложениями, относящимся непосредственно к PostgreSQL, если мы будем ставить СУБД на сервер:

sudo apt install postgresql postgresql-contrib
Reading package lists. Done Building dependency tree Reading state information. Done The following additional packages will be installed: libllvm10 libpq5 libxslt1.1 postgresql-12 postgresql-client-12 postgresql-client-common postgresql-common Suggested packages: postgresql-doc postgresql-doc-12 libjson-perl Recommended packages: sysstat

В нашем примере их три: libllvm10, libpq5, libxslt1.1. В зависимости от дистрибутива их может быть больше. Посмотрим, от каких пакетов на самом деле зависит пакет postgresql-12 (спойлер: 25 обязательных пакетов и 1 рекомендованный):

sudo apt-cache depends postgresql-12
postgresql-12 |Depends: locales Depends: locales-all Depends: postgresql-client-12 Depends: postgresql-common Depends: ssl-cert Depends: tzdata |Depends: debconf Depends: cdebconf debconf Depends: libc6 Depends: libgcc-s1 Depends: libgssapi-krb5-2 Depends: libicu66 Depends: libldap-2.4-2 Depends: libllvm10 Depends: libpam0g Depends: libpq5 Depends: libselinux1 Depends: libssl1.1 Depends: libstdc++6 Depends: libsystemd0 Depends: libuuid1 Depends: libxml2 Depends: libxslt1.1 Depends: zlib1g Recommends: sysstat

Наличие или отсутствие тех или иных пакетов, различные версии и другие факторы напрямую влияют на стабильность работы PostgreSQL. Используя контейнеризацию, возможные конфликты несовместимости нивелируются, т.к. все необходимые зависимости уже будут находиться в среде контейнера. Если загрузить готовый образ контейнера с ресурса Docker Hub (об этом ниже в статье), мы получим протестированную на совместимость и полностью готовую к работе среду.

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

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

Откроем панель управления Selectel, перейдем в представление Облачная платформа и нажмем на кнопку Создать сервер.

Далее вводим имя сервера, выбираем образ операционной системы (остановимся на Ubuntu 20.04 LTS 64-bit) и фиксированную конфигурацию сервера с 2 vCPU и 4 ГБ RAM. Объем дискового пространства диска установим в 20 ГБ. Еще раз проверяем конфигурацию сервера и нажимаем Создать.

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

Подождем минуту или две пока сервер не перейдет в состояние Active.

Теперь можем приступать к установке PostgreSQL в Docker. Поехали!

Как установить PostgreSQL в Docker из образа

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

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Добавим этот репозиторий в локальный список репозиториев и установим Docker:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt install docker-ce

Запустим демон Docker и активируем его автозапуск:

sudo systemctl start docker
sudo systemctl enable docker

Поскольку за пределами жизненного цикла контейнера не остается каких либо данных, на файловой системе сервера (или другом файловом хранилище) необходимо создать каталог для хранения данных, которые будут появятся в процессе работы экземпляра PostgreSQL.

mkdir -p $HOME/docker/volumes/postgres

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

sudo docker pull postgres
Using default tag: latest latest: Pulling from library/postgres f7ec5a41d630: Pull complete d073cd070242: Pull complete 03790957a916: Pull complete b3776ac15dab: Pull complete 7144fd00aec4: Pull complete 54f6491bd120: Pull complete 247ab23c6036: Pull complete 57800498c536: Pull complete bcb15a4d14f4: Pull complete cfc751ecbc6e: Pull complete bbf042afd4a4: Pull complete 453056a20de6: Pull complete d5b1a75378ef: Pull complete 7841e2074775: Pull complete Digest: sha256:61d5d8ef6cb4e2035f053f26b6b455c201a809354084cc8426b6904b8dd35602 Status: Downloaded newer image for postgres:latest docker.io/library/postgres:latest

Теперь все готово к запуску.

Как запустить контейнер PostgreSQL

Выполним команду docker с ключом run:

sudo docker run --rm --name selectel-pgdocker -e POSTGRES_PASSWORD=selectel -e POSTGRES_USER=selectel -e POSTGRES_DB=selectel -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

Если возникла ошибка вида: «Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use.», то следует вначале посмотреть какой процесс задействует порт 5432:

sudo ss -lptn 'sport = :5432'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=2592,fd=3)

Затем прибить” процесс по его PID и вновь выполнить запуск Docker-контейнера:

sudo kill 2592

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

  • —rm — ключ активирует автоматическое удаление контейнера и связанную с ним файловую систему после остановки контейнера. Полезный ключ для экономии дискового пространства.
  • —name — ключ устанавливает имя контейнера. В пределах одного сервера имена контейнеров должны быть уникальны. Даже если один из них остановлен.
  • -e — ключ задает переменные окружения, с которыми будет запущен контейнер. В нашей ситуации мы добавляем пароль суперпользователя, (POSTGRES_PASSWORD=selectel), имя суперпользователя (POSTGRES_USER=selectel) и имя базы данных по умолчанию (POSTGRES_DB=selectel) к базе данных.
  • -d — ключ указывает, что контейнер должен быть запущен в в фоновом режиме (возвращает управление после его запуска).
  • -p — ключ указывает на привязку внутреннего порта контейнера к порту сервера (используем порт по умолчанию 5432).
  • -v — ключ создает точку монтирования каталога $HOME/docker/volumes/postgres на сервере к каталогу /var/lib/postgresql/data внутри контейнера.

Облачные базы данных

Готовые к работе кластеры баз данных в облаке с развертыванием в несколько кликов.

Как подключиться к PostgreSQL в контейнере

После успешного запуска контейнера с PostgreSQL, попробуем к нему подключиться при помощи утилиты psql. Установим ее из пакета postgresql-client:

sudo apt install postgresql-client

Теперь можно подключиться и выполнить тестовый SQL-запрос:

psql -h 127.0.0.1 -U selectel -d selectel
Password for user selectel: psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1), server 13.2 (Debian 13.2-1.pgdg100+1)) WARNING: psql major version 12, server major version 13. Some psql features might not work. Type "help" for help. selectel=#

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

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

sudo docker exec -it selectel-pgdocker psql -U selectel
psql (13.2 (Debian 13.2-1.pgdg100+1)) Type "help" for help. selectel=#

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

  • -i — ключ активирует интерактивную работу с терминалом.
  • -t — ключ запускает псевдо-терминал (pseudo-TTY).
  • selectel-pgdocker — имя контейнера, к которому выполняется подключение.
  • psql — указание на запуск утилиты для подключение к базе данных PostgreSQL.
  • -U — ключ указывает на имя пользователя, которое будет использоваться для подключения к базе данных.

Теперь попробуем создать новую таблицу, добавить в нее данные и выполнить запрос:

selectel=# create table cities (name varchar(80));
CREATE TABLE
selectel=# insert into cities values ('Moscow');
INSERT 0 1
selectel=# select * from cities;
 name -------- Moscow (1 row)

Чтобы остановить запущенный контейнер выполним docker stop и укажем имя контейнера:

sudo docker stop selectel-pgdocker

Файлы и процессы, созданные контейнером, принадлежат пользователю postgres, который является внутренним по отношению к контейнеру. В отсутствие пространства имен пользователей внутри контейнера, UID и GID в контейнере могут иметь произвольное значение. На самом сервере этим UID и GID могут соответствовать привилегированные пользователи или группы соответственно.

Например, пользователь на хосте с тем же UID или GID, что и пользователь postgres в контейнере, сможет получить доступ к данным в различных каталогах хоста, а также сможет завершить любой запущенный процесс. Чтобы избежать такой бреши в безопасности, укажем при запуске контейнера специализированные переменные USERMAP_UID и USERMAP_GID:

sudo docker run --rm --name selectel-pgdocker -e POSTGRES_PASSWORD=selectel -e POSTGRES_USER=selectel -e POSTGRES_DB=selectel -e USERMAP_UID=999 -e USERMAP_GID=999 -d -p 5432:5432 -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres

Как запустить PostgreSQL в контейнере в составе docker-compose

Еще одним вариантом запуска PostgreSQL в Docker-контейнере, является запуск контейнера с базой данных в составе docker-compose. В первую очередь, создадим соответствующий yml-файл:

nano docker-compose.yml
version: '3.1' volumes: pg_selectel: services: pg_db: image: postgres restart: always environment: - POSTGRES_PASSWORD=selectel - POSTGRES_USER=selectel - POSTGRES_DB=selectel volumes: - pg_project:/var/lib/postgresql/data ports: - $:5432

Затем установим docker-compose:

sudo apt install docker-compose

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

sudo docker-compose up -d

Ключ -d указывает, что docker-compose должен быть запущен в в фоновом режиме (вернет управление после его запуска).

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

psql -h 192.168.0.4 -U selectel -d selectel
Password for user selectel: psql (12.6 (Ubuntu 12.6-0ubuntu0.20.04.1), server 13.2 (Debian 13.2-1.pgdg100+1)) WARNING: psql major version 12, server major version 13. Some psql features might not work. Type "help" for help. selectel=#

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

Чтобы остановить запущенный контейнер, выполним docker-compose stop:

sudo docker-compose stop

Заключение

Мы рассказали о работе с базой данных PostgreSQL в контейнере Docker, запуске, выполнении запросов и остановке. Как и говорили в начале статьи, работа с контейнеризованной в Docker базой данных упрощает процесс разработки и администрирование. Контейнеры могут быть легко перезапущены на другом сервере и сервис, предоставляемый базой данных, не прервется.

Резервное копирование и восстановление PostgreSQL: pg_dump, pg_restore, wal-g

Установка пулера соединений PgBouncer для PostgreSQL

Зарегистрируйтесь в панели управления

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

Краткое введение в docker-compose

Как docker может управлять отдельно взятым контейнером, так docker-compose помогает управлять не просто одним, а всеми контейнерами, которые составляют распределенное приложение. Причём, не только контейнерами, но и сетями, подключёнными папками и всеми связанными с этим настройками.

Ведь даже чтобы запустить простое вэб-приложение, состоящее всего из двух контейнеров (например, «web» с контентом и «db» с данными), нужно как минимум:

  1. создать новую пользовательскую сеть (иначе контейнеры не будут видеть друг друга по именам),
  2. запустить контейнер с данными, дать ему имя db и подключить к сети,
  3. запустить контейнер с вэб-контентом, назвать его web, и тоже подключить к сети.

Можно создать скрипт для этого, но тот достаточно быстро выйдет из-под контроля: контейнеры будут добавляться, порядок запуска меняться, и т. п. К тому же нужно учитывать, что какие-то контейнеры нужно сначала собрать, а какие-то уже готовы, сеть может быть уже создана, а может еще и нет, какие-то контейнеры нужно запустить первыми (db), а остальные — потом (web), и т.д. Больше элементов — больше комбинаций.

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

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

compose автоматически устанавливается вместе с Docker на Mac и Windows. На Linux нужно дополнительно сделать несколько телодвижений, и как именно это делать, хорошо описано тут.

docker-compose.yml

docker-compose.yml — это как Dockerfile, но для распределенного приложения целиком. Например, если в упомянутом выше вэб-приложении web контейнер нужно собирать из Dockerfile, которые лежит в папке web-app, а сервис с данными — чистый образ с mysql, то вот как для него может выглядеть compose-файл:

Подсистема Docker в Windows

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

Установка Docker

Для работы с контейнерами Windows требуется Docker. Docker состоит из подсистемы Docker (dockerd.exe) и клиента Docker (docker.exe). Самый простой способ установить все необходимые компоненты изложен в кратком руководстве, которое поможет настроить и запустить первый контейнер.

Сведения об установке с помощью сценария см. в разделе Использование сценария для установки Docker EE.

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

Настройка Docker с помощью файла конфигурации

Предпочтительным способом настройки подсистемы Docker в Windows является использование файла конфигурации. Путь к файлу конфигурации — C:\ProgramData\Docker\config\daemon.json. Если этот файл еще не существует, его можно создать.

Не все доступные параметры конфигурации Docker применяются к Docker в Windows. В примере ниже показаны параметры конфигурации, которые применяются. Дополнительные сведения о конфигурации подсистемы Docker см. в статье Docker daemon configuration file (Файл конфигурации управляющей программы Docker).

< "authorization-plugins": [], "dns": [], "dns-opts": [], "dns-search": [], "exec-opts": [], "storage-driver": "", "storage-opts": [], "labels": [], "log-driver": "", "mtu": 0, "pidfile": "", "data-root": "", "cluster-store": "", "cluster-advertise": "", "debug": true, "hosts": [], "log-level": "", "tlsverify": true, "tlscacert": "", "tlscert": "", "tlskey": "", "group": "", "default-ulimits": <>, "bridge": "", "fixed-cidr": "", "raw-logs": false, "registry-mirrors": [], "insecure-registries": [], "disable-legacy-registry": false > 

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

Аналогично в примере ниже настраивается хранение образов и контейнеров по альтернативному пути в управляющей программе Docker. Если оно не указано, по умолчанию используется значение c:\programdata\docker .

В примере ниже управляющая программа Docker настраивается на прием только защищенных подключений через порт 2376.

Настройка Docker в службе Docker

Подсистему Docker можно также настроить, изменив службу Docker командой sc config . При использовании этого способа флаги подсистемы Docker задаются непосредственно в службе Docker. Выполните указанную ниже команду в командной строке (cmd.exe, не PowerShell).

sc config docker binpath= "\"C:\Program Files\docker\dockerd.exe\" --run-service -H tcp://0.0.0.0:2375" 

Не нужно выполнять эту команду в том случае, если файл daemon.json уже содержит запись «hosts»: [«tcp://0.0.0.0:2375»] .

Распространенные конфигурации

В следующих примерах файла конфигурации представлены распространенные конфигурации Docker. Их можно объединить в один файл конфигурации.

Создание сети по умолчанию

Чтобы настроить подсистему Docker таким образом, чтобы не была создана сеть NAT по умолчанию, используйте следующую конфигурацию.

Дополнительные сведения см. в статье Управление сетями Docker.

Задание группы безопасности для Docker

После входа в систему на узле Docker и запуска команд Docker эти команды выполняются через именованный канал. По умолчанию только члены группы «Администраторы» могут получить доступ к подсистеме Docker через именованный канал. Чтобы указать группу безопасности, имеющую такой доступ, используйте флаг group .

Конфигурация прокси-сервера

Чтобы задать данные о прокси-сервере для docker search и docker pull , создайте переменную среды Windows с именем HTTP_PROXY или HTTPS_PROXY и значением, содержащим данные о прокси-сервере. Это можно сделать в PowerShell, используя команду следующего вида:

[Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://username:password@proxy:port/", [EnvironmentVariableTarget]::Machine) 

После задания переменной перезапустите службу Docker.

Restart-Service docker 

Дополнительные сведения см. в разделе Windows Configuration File (Файл конфигурации Windows) на сайте Docker.com.

Удаление Docker

В этом разделе описывается, как удалить Docker и выполнить полную очистку компонентов системы Docker в Windows 10 или Windows Server 2016.

Все команды в этих инструкциях необходимо выполнять из сеанса PowerShell с повышенными привилегиями.

Подготовка системы к удалению Docker

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

Выполните следующие командлеты, чтобы найти работающие контейнеры:

# Leave swarm mode (this will automatically stop and remove services and overlay networks) docker swarm leave --force # Stop all running containers docker ps --quiet | ForEach-Object

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

docker system prune --volumes --all 

Удаление Docker

Затем необходимо начать собственно удаление Docker.

Удаление Docker в Windows 10

  • На компьютере с Windows 10 перейдите в раздел Параметры>Приложения.
  • В разделе Программы и компоненты найдите Docker для Windows
  • Последовательно выберите Docker для Windows>Удалить.

Удаление Docker в Windows Server 2016

В сеансе PowerShell с повышенными привилегиями используйте командлеты Uninstall-Package и Uninstall-Module, чтобы удалить модуль Docker и соответствующий ему поставщик Управление пакетами из системы, как показано в следующем примере:

Uninstall-Package -Name docker -ProviderName DockerMsftProvider Uninstall-Module -Name DockerMsftProvider 

Вы можете найти поставщик пакетов, который использовался для установки Docker с помощью команды PS C:\> Get-PackageProvider -Name *Docker*

Очистка данных и системных компонентов Docker

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

Get-HNSNetwork | Remove-HNSNetwork 

Удалите сети по умолчанию Docker в Windows Server 2016.

Get-ContainerNetwork | Remove-ContainerNetwork 

Выполните следующий командлет, чтобы удалить программные данные Docker из системы:

Remove-Item "C:\ProgramData\Docker" -Recurse 

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

К ним относится компонент «Контейнеры», который автоматически включается в любом экземпляре Windows 10 или Windows Server 2016 при установке Docker. Это также может быть компонент «Hyper-V», который автоматически включается в Windows 10 при установке Docker, однако в Windows Server 2016 он включается вручную.

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

Удаление компонентов Windows 10

  • Выберите последовательно Панель управления>Программы>Программы и компоненты>Включение или отключение компонентов Windows.
  • Найдите имя компонента, который требуется отключить — в данном случае это Контейнеры и (необязательно) Hyper-V.
  • Снимите флажок рядом с именем компонента, который нужно отключить.
  • Нажмите кнопку ОК.

Удаление компонентов Windows Server 2016

В сеансе PowerShell с повышенными привилегиями выполните следующие командлеты, чтобы отключить компоненты Контейнеры и (необязательно) Hyper-V.

Remove-WindowsFeature Containers Remove-WindowsFeature Hyper-V 

Перезагрузка системы

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

Restart-Computer -Force 

Не получается собрать образ docker

pip : Имя «pip» не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после чего повторите попытку. строка:1 знак:1 + pip install -r requirements.txt + ~~~ + CategoryInfo : ObjectNotFound: (pip:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException

Теперь проблема следующая: При команде docker build —tag=friendlyhello . .Выдает ошибку :

unable to prepare context: unable to evaluate symlinks in Dockerfile path: GetFileAttributesEx C:\docker\Dockerfile: The system cannot find the file specified.

Вопросы с меткой [wsl]

Используйте для вопросов, связанных с Windows Subsystem for Linux, вместо меток «windows», «linux» и т.п.

46 вопросов
Конкурсные
Неотвеченные

  • Конкурсные 0
  • Неотвеченные
  • Цитируемые
  • Рейтинг
  • Неотвеченные (мои метки)

Вызов .so библиотеки в C#

Написал небольшую C++ библиотеку с экспортируемым методом. Собираю ее в Dll и метод вызывается без проблем, но мне нужно, чтобы программа работала на Linux, поэтому я собираю библиотеку в Shared .

20 показов

Ошибка при установке WSL

Всем привет, при установке wsl такая ошибка, надеюсь на помощь Я пробовал устанавливать wsl по гайдам от разных сайтов, к примеру microsoft. Пересмотрел куча видео. Но все привело ни к чему.

как сделать, что бы docker в WSL создавал файлы\папки от имени пользователя системы?

docker в WSL создает файлы\папки от пользователя root docker desktop в windows 11 в WSL debian 12 файлы\папки, которые создаются внутри контейнера(логи, другие файлы) создаются от пользователя рут в .

Почему при команде sudo service apache2 start ничего не происходит?

Решил переустановить apache2 на WSL Ubuntu 20.04, зачистил его полностью, установил по инструкции. Пытаюсь теперь включить sudo service apache2 start, ничего не происходит, консоль команду просто .

36 показов

Виртуализация включена, но WSL этого не видит

Пытаюсь установить Ubuntu через wsl, выдает ошибку: не включена виртуализация (на скриншоте видно), Платформа виртуальной машины и виртуализация точно включена. Пк перезагружал.

320 показов

После установки wsl не запускается windows, что делать?

После установки wsl не запускается windows, что делать? устанавливаю с помощью wsl —install в командной строке от имени андминистратора. После перезагрузки горит просто черный экран и ничего не .

15 показов

Что прочитать, чтобы хорошо понимать как в linux взаимодействуют разные элементы среды разработки?

Неопытный программист, столкнулся с тем, что после установки на WSL 2, сборки из apache, mysql и всего, что нужно оказалось: версию php нужно устанавливать отдельно на сервере и отдельно в пакет с .

67 показов

Свежесозданный виртуальный хост на свежеустановленном apache2 в Ubuntu, WSL пишет: DNS_PROBE_FINISHED_NXDOMAIN. Почему?

Установил в Ubuntu apache2 со всем, что входит в сборку LAMP. Команда показывает, что сервер работает. При обращении на localhost приветственная страница в браузере открывалась. Создал виртуальный .

102 показа

webpack-dev-server не перезагружает страницу

Предыстория: Есть проект на react, для сборки используется webpack. Node.js стоит на wsl. Проблема: При обновлении файлов, webpack-dev-server не перезагружает страницу автоматически, приходится .

Непонятная ошибка при создании apk файла с помощью buildozer для приложения kivy

Я пытаюсь создать файл apk с помощью buildozer для своего приложения kivy, следуя инструкциям из этой статьи https://tproger.ru/translations/snake-android-python-kivy/?ysclid=lgzgatukym550789581. У .

Подключение диска к Kali Linux WSL

Хочу подключить диск к WSL Windows, но говорит, что диск занят: PS C:\Windows\system32> GET-CimInstance -query «SELECT * from Win32_DiskDrive» DeviceID Caption .

403 показа

WSL2 очень медленная загрузка сайта

Решил попробовать связку Nuxt’а и Laravel. Из-за Laravel решил установить все это себе на WSL. Запускаю локальный сервер на WSL, потом в браузере на винде перехожу на http://localhost:3000 Проблема .

67 показов

Получить список доступных дистрибутивов WSL

Пытаюсь получить список доступных для установки дистрибутивов WSL: $list_all = @(); $i = 0; wsl.exe —list —online | %< if(($_.Trim() -ne "") -and ($i -gt 8))< $list_all += $_.Split(" &.

609 показов

Как правильно указать путь к папке Windows в Linux внутри WSL?

Есть текстовый файл, в котором нужно правильно прописать путь в определенную папку на другом физическом диске. Linux (если точнее, то WSL под windows) должен открыть этот файл и в указанной папке .

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

здесь приведен скриншот из WSL где у меня возникают проблемы с входом
15 30 50 на странице

    Важное на Мете

Связанные метки

Подписаться на ленту

Лента последних активных вопросов с меткой [wsl]

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Запускаем docker compose в Windows

Docker-compose — это утилита, позволяющая запускать одновременно несколько контейнеров, используя при этом единый файл конфигурации всего стека сервисов, нужных вашему приложению. Например, такая ситуация: запускаем node.js webapp, которому нужна для работы mongodb, compose выполнит build вашего контейнера с webapp (традиционный Dockerfile) и перед его запуском запустит контейнер с mongodb внутри; так же может выполнить линк их между собой. Что крайне удобно как в разработке, так и в CI самого приложения. Так сложилось, что Windows пользователи были обделены возможностью использовать столько удобное средство, ввиду того, что официальной поддержки данной ОС все еще нет. А python версия для *nix не работает в окружении windows cmd, ввиду ограничений консоли Windows.

Для того, чтобы запустить docker-compose, мы можем использовать консольную оболочку Babun. Это, так сказать, «прокаченный» форк cygwin.

Итак, рецепт запуска docker-compose в Windows из консоли babun такой:

1. Скачиваем(~280MB!) и устанавливаем сам babun, узнать больше об этой оболочке можно на ее домашней странице babun.github.io;
2. Распаковываем архив (после установки полученную папку можно удалять);
3. Запускаем файл install.bat и ждем, пока пройдет установка;
4. После в открывшемся окне babun введем команду:

babun update 

И убедимся, что у нас самая последняя версия оболочки (далее все команды выполняются только внутри оболочки babun);
5. Если вам не нравится дефолтный shell babun (используется zsh), его можно изменить на bash. Для этого вводим:

babun shell /bin/bash 

6. Теперь нам нужно установить те самые зависимости Python, которых так не хватает docker-compose. Для этого выполним следующие команды по очереди:

pact install python-setuptools 
pact install libxml2-devel libxslt-devel libyaml-devel 
curl -skS https://bootstrap.pypa.io/get-pip.py | python 
pip install virtualenv 
curl -skS https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | python 

7. Теперь мы готовы установить сам docker-compose:

pip install -U docker-compose 

Если все прошло успешно, увидим:

 < ~ >» docker-compose --version docker-compose 1.2.0 

Если же вы получили ошибку, error python fcntl или сообщение о не найдом файле docker-compose, попробуйте найти файл docker-compose в папках /usr/local/bin, /usr/sbin и подобных, затем можно сделать симлинк на /bin/. либо добавить в системный PATH недостающий путь.

Для правильной работы docker-compose нужно иметь уже настроенное окружение консоли для работы с docker-machine или boot2docker, а так же сам клиент docker должен быть доступен в системном PATH. О том, что такое docker, docker-machine и как с ними работать отлично рассказывает официальная документация.

Для входа в окружение нашего хоста докера, запущенного в docker-machine, нужно выполнить:

eval "$(docker-machine env ИМЯ_МАШИНЫ)" 

Либо тоже самое для boot2docker:

eval "$(boot2docker shellinit)" 

Проверить правильность работы клиента docker можно так:

docker ps 

Если получаем список контейнеров или просто заголовки таблицы, значит, все ок!

docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 

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

Далее для запуска вводим команду:

docker-compose up 

Если нужно запустить в фоне, добавляем -d. Compose построит нужный образ и запустит его согласно вашему файлу docker-compose.yml.

Спасибо за внимание, надеюсь было полезно.

p.s. Я умышлено не стал говорить о варианте запуска compose как контейнера, т.к. считаю его неудобным.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *