28/07/2022

Docker

Docker

Docker - это средство упаковки (в контейнеры), доставки и запуска (запуск осуществляется одним и тем же образом, единый интерфейс) приложения. Докер - это история про виртуализацию, но не ту какую вам предоставляют виртуальные машины, которые разворачивают полноценную ОС внутри вашей. Главная задача Докера запустить приложение.

Базовые понятия

Docker image - это сборка, говтовое к запуску приложение, но еще не запущеное.

Docker container - работающее приложение, созданное на базе имеджа.

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

Для контейнера образ является read only системой, он не может его изменить.

Image - слоеный пирог, напрмиер image Ubuntu и возьмем его за базу и поставим туда Nginx и поставим туда mongo и поставим питон.

Реестр имеджей - он находится локально там хранятся те images которые создали именно вы.
Также есть docker hub - там реестр всех имеджей, которые поддерживаются создателями докера но так же и те которые создавали другие люди.

Посмотреть images

docker images

Посмотреть запущенные контейнеры

docker ps

-a - посмотреть в том числ остановленные контейнеры -a -q - отобразить только id контейнера

Создаем свой докер образ

docker build -t hello-world .

docker build - команда для создания образа -t - тег, название образа . - путь к текущей директории (где находится приложение)

Также нужно указать как именно нужно упаковать приложение, для этого создается Dockerfile.

В Dockerfile нужно описать шаги для упаковки нашего приложения.

FROM python:3.6 

RUN mkdir -p /usr/src/app/
WORKDIR /usr/src/app/

COPY . /usr/src/app/

CMD ["python", "app.py"]
  • FROM - базовый образ, через :(двоеточие) указывается тег
  • RUN - указывает что нужно выполнить указанную команду
  • WORKDIR - начальный каталог в который нужно перейти
  • COPY - копирует содержимое из источника в целевую папкув контейнере
  • CMD - указывает какие команды нужно выполнить когда мы запустим контейнер, запускает команды через shell
  • ENTRYPOINT - аналог CMD, но команды выполняются без shell оболочки

Запуск контейнера

  • запуск контейнера
    docker run <имя образа>
docker run hello-world

Контейнер работает до тех пор пока работает приложение.

  • задаем имя контейнера при запуске
    docker run --name <имя контейнера> <имя образа>
docker run --name hello hello-world
  • запуск контейнера в фоне, чтобы можно было работать с консолью
    docker run --name <имя контейнера> -d <имя образа>
docker run --name hello -d hello-world
  • запуск контейнера с автоудалением после остановки
    docker run --name <имя контейнера> -d --rm <имя образа>
docker run --name hello -d --rm hello-world

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

Например те которые уже отработали

  • удалить один контейнер docker rm <id контейнера> docker rm <имя контейнера>
docker rm 1e0c7cd00041
  • удалить все контейнеры docker rm $(docker ps -qa)

Остановить контейнер

  • docker stop <id контейнера>
  • docker stop <имя контейнера>

Проброска портов

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

Чтобы пробросить порт нужно в Dockerfile указать EXPOSE 8080 тем самым мы указываем что мы можем этот порт пробросить.

Чтобы выполнить проброску нужно при запуске контейнера указать флаг -p и через двоеточие 2 порта (1- порт нашей машины, 2 - порт в контейнере)

docker run --name <имя контейнера> --rm -p 8080:80880 <имя образа>

docker run --name hello --rm -p 8080:80880 hello-world

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

Можно указать в Dockerfile

ENV <название переменной> <значение>

но иногда переменные нужно менять поэтому можно указывать переменные при запуске контейнера

docker run --name <имя контейнера> --rm -p 8080:80880 -e <имя переменной>=<значение> <имя образа>

docker run --name hello --rm -p 8080:80880 -e TZ=Europe/Moscow hello-world

Работа с внешними данными

  1. монтируем папку делается это при запуске контейнера через параметр -v

docker run --name <имя контейнера> --rm -p 8080:80880 -v <папка на хостовой машине(абсолютный путь)>:<папка в контейнере(абсолютный путь)> <имя образа>

docker run --name hello --rm -p 8080:80880 -v ...:... hello-world
  1. docker volume

посмотреть какие volume доступны

docker volume ls

чтобы создать volume

docker volume create <имя>

теперь при запуске можно указать

docker run --name <имя контейнера> --rm -v <имя volume>:<папка в контейнере(абсолютный путь)> <имя образа>

docker run --name hello --rm -p 8080:80880 -v ...:... hello-world

Удалить image

docker rmi <имя image>

Получить список images id

docker images -q

Удалить все images

docker rmi $(docker images -q)

Многосервисная архитектура

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

Для этого используется docker-compose - надстройка над докером.

Для его использования нужно создать docker-compose.yaml

указываем версию, volumes и описываем настройки каждого сервиса

Настройки сервиса:

build: указываем откуда взять Dockerfile либо image: mongo:latest если нужно взять готовый образ

volumes:

  • <имя volume>:<абсолютный путь к папке в контейнере>

ports: - проброска портов

  • 8080:8080

restart: always - если вдруг машина перезагрузится то докер сам перезапустит контейнеры

environment: - перечисляем переменные окружения

  • TZ=Europe/Moscow

Создаем ssh ключ

переходим из домашнего каталога в .ssh и запускаем ssh-keygen, затем выводим на экран публичный ключ

cd .ssh
ssh-keygen -t rsa
# задаем имя, например vscale
cat vscale.pub | pbcopy

создаем в папке .ssh файл config

vim config

Указываем в config настройки

host <имя хоста пожеланию> hostname <шз адрес сервера> user root IdentityFile ~/.ssh/vscale

Созряняем и выполняем команду ssh vs

Устанавливаем docker на сервере

sudo apt update
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-app-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt install docker-ce

Устанавливаем docker-compose на сервере

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s` -`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

Запуск docker-compose

docker-compose up -d

-d - чтобы контейнеры в фоне работали

Остановить docker-compose

docker-compose down -d

Работа с docker hub

Создать свой репозиторий можно с сайта hub.docker.com нажав Create Repository
либо просто запушив свои первый image

нужно в имя образа вставить идентификатор пользователя и через / имя репозитория

docker build -t artemproject/statisticmanager .
docker login
docker push artemproject/statisticmanager

Запуск postgres в docker

Чтобы запустить postgres в docker нужно:

  1. Сделать pull image
docker pull postgress
  1. Запустить инстанс докера
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres

--name - имя контейнера на локальной машине POSTGRES_PASSWORD= - здесь указывается пароль -d (detach) необходимо указывать для того чтобы терминал оставвался терминалом локального компьютера, а не терминалом БД postgres - название контейнера который мы будем запускать -p 5432:5432 - проброс портов, порт внутри контейнера будет соответсвовать порту нашего компьютера

  1. Проверяем запущенные контейнеры
docker ps -a

Для работы с БД нужно подключить Postgress JDBC - 'org.postgresql:postgresql:42.3.6' и часть фреймворка Spring для работы с БД - 'org.springframework:spring-jdbc:5.3.20'

система виртуализации для запуска приложения в ихолированной среде.

SELECT departamens.name FROM departamens LEFT JOIN users ON users.departament_id = departamens.id WHERE users.departament_id IS NULL;