Skip to the content.

Технологии программирования

Назад к списку лекций

Docker. Переменные окружения.

Переменные окружения

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

Зачем нужны переменные окружения? Они упрощают разработку и администрирование систем, так как позволяют быстро и удобно изменять настройки без изменения кода. Это особенно полезно при разработке бэкенд-приложений, где часто требуется настройка различных параметров, таких как пути к файлам, порты, адреса серверов и другие.

В Windows операционные системы задаются с помощью интерфейса «Свойства системы». Вы можете открыть его, нажав правой кнопкой мыши на значок «Мой компьютер» и выбрав «Свойства». В открывшемся окне перейдите на вкладку «Дополнительно» и нажмите кнопку «Параметры» в разделе «Быстродействие». Здесь вы можете задать параметры производительности системы, включая использование виртуальной памяти и кэширование. (см ссылку):

Задать в windows shell

set VAR_NAME=VAR_VALUE

Задать в linux/macos

export VAR_NAME=VAR_VALUE 

или в файле .bashrc

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

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

В linux пользовательские и системные переменные окружения можно задать в специальных файлах конфигурации:

Почитать подробнее можно тут

class Temp {
    public static void main(String[] args) {
        Map<String, String> env = System.getenv();
    }
}

Основные компоненты Docker

Как устроен образ Docker

Базовый образ — главный элемент контейнеризации в Docker. В нем содержатся процессы и зависимости, необходимые для нормальной работы приложения.

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

Как развернуть образ

docker run image_name: tag_name

Dockerfile

Пример докер-файла:

FROM python:3.7.2-alpine3.8
LABEL maintainer="jeffmshale@gmail.com"
ENV ADMIN="jeff"
RUN apk update && apk upgrade && apk add bash
COPY ./myUserService.jar ./app
CMD ["java", ".app/myUserService.jar"]

Обычно сборка и деплой автоматизируют в таких системах, как teamcity или jenkins

Чуть более сложный вариант:

FROM python:3.7.2-alpine3.8
LABEL maintainer="jeffmshale@gmail.com"
# Устанавливаем зависимости
RUN apk add --update git
# Задаём текущую рабочую директорию
WORKDIR /usr/src/my_app_directory
# Копируем код из локального контекста в рабочую директорию образа
COPY . .
# Задаём значение по умолчанию для переменной
ARG my_var=my_default_value
# Настраиваем команду, которая должна быть запущена в контейнере во время его выполнения
ENTRYPOINT ["python", "./app/my_script.py", "my_var"]
# Открываем порты
EXPOSE 8000
# Создаём том для хранения данных
VOLUME /my_volume

Пример, который мы билдили на лекции:

# базовый образ
FROM ubuntu:20.04

# установка желаемых пакетов и зависимостей
RUN apt-get update
RUN apt-get install -y wget && echo "We installed wget!"

# создание каталога /mytest
WORKDIR /mytest

# создание файла testfile
RUN touch testfile

# ls и echo будут выполняться при запуске контейнера
CMD ls && echo "Show me mytest"

Создадим образ по нашему докерфайлу:

docker build -f </путь/до/Dockerfile> -t <имя_создаваемого_образа> </путь/до/контекста>

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

docker ps -a

Запустить наш образ

docker run <our image> <command>

Мы можем сохранить образ, чтобы передать его:

sudo docker save --output <имя_файла_образа> <ID_исходного_образа>

Удалить неиспользуемые контейнеры, сети и образы:

docker system prune

Больше информации можно прочитать туть

Docker-compose

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

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

Файл docker-compose.yml состоит из нескольких ключевых разделов, каждый из которых отвечает за определенную часть вашего многоконтейнерного приложения:

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

version: "3.7"
services:
  ...
volumes:
  ...
networks:
  ...

Пример такого файла:

services:
  network-example-service:
    image: karthequian/helloworld:latest
    ports:
      - "80:80"
    ...
  my-custom-app:
    image: myapp:latest
    ports:
      - "8080:3000"
    ...
  my-custom-app-replica:
    image: myapp:latest
    ports:
      - "8081:3000"
    ...
volumes:
  my-named-global-volume: 

Пример docker-compose файла для запуска базы данных:

services:
  database: 
    image: "postgres:${POSTGRES_VERSION}"
    environment:
      DB: mydb
      USER: "${USER}"

Как запустить?

docker-compose up

Как свернуть?

docker-compose down

Больше про docker-compose можно почитать тут или тут