Skip to the content.

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

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

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

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

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

Задать в windows (см ссылку):

set VAR_NAME=VAR_VALUE

Задать в linux/macos

export VAR_NAME=VAR_VALUE 

или в файле .bashrc

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

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

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

Основные компоненты 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. Также в нем можем конфигурировать запуск контейнеров и взаимосвязи между контейнерами (например, пробрасывать порты, создавать volume) Из чего состоит docker-compose файл:

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: 
services:
  database: 
    image: "postgres:${POSTGRES_VERSION}"
    environment:
      DB: mydb
      USER: "${USER}"

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

docker-compose up

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

docker-compose down

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