Docker - это средство упаковки (в контейнеры), доставки и запуска (запуск осуществляется одним и тем же образом, единый интерфейс) приложения. Докер - это история про виртуализацию, но не ту какую вам предоставляют виртуальные машины, которые разворачивают полноценную ОС внутри вашей. Главная задача Докера запустить приложение.
Docker image - это сборка, говтовое к запуску приложение, но еще не запущеное.
Docker container - работающее приложение, созданное на базе имеджа.
На основе одного образа можно создать много одинаковых контейнеров. Например, нужно 10 реплик одного сервиса.
Для контейнера образ является read only системой, он не может его изменить.
Image - слоеный пирог, напрмиер image Ubuntu и возьмем его за базу и поставим туда Nginx и поставим туда mongo и поставим питон.
Реестр имеджей - он находится локально там хранятся те images которые создали именно вы.
Также есть docker hub - там реестр всех имеджей, которые поддерживаются создателями докера но так же и те которые создавали другие люди.
docker imagesdocker 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"]docker run hello-worldКонтейнер работает до тех пор пока работает приложение.
docker run --name hello hello-worlddocker run --name hello -d hello-worlddocker run --name hello -d --rm hello-worldНапример те которые уже отработали
docker rm 1e0c7cd00041Контейнер собирается в полностью изолированном окружении и если явно не пробросить порты то приложение будет не видно.
Чтобы пробросить порт нужно в 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-worlddocker run --name <имя контейнера> --rm -p 8080:80880 -v <папка на хостовой машине(абсолютный путь)>:<папка в контейнере(абсолютный путь)> <имя образа>
docker run --name hello --rm -p 8080:80880 -v ...:... hello-worldпосмотреть какие volume доступны
docker volume lsчтобы создать volume
docker volume create <имя>теперь при запуске можно указать
docker run --name <имя контейнера> --rm -v <имя volume>:<папка в контейнере(абсолютный путь)> <имя образа>
docker run --name hello --rm -p 8080:80880 -v ...:... hello-worlddocker rmi <имя image>
docker images -q
docker rmi $(docker images -q)
Для каждого сервиса имеется свой Dockerfile. Если через docker run выполнять настройке переменных когда есть много сервисов это не совсем удобно.
Для этого используется docker-compose - надстройка над докером.
Для его использования нужно создать docker-compose.yaml
указываем версию, volumes и описываем настройки каждого сервиса
Настройки сервиса:
build: указываем откуда взять Dockerfile либо image: mongo:latest если нужно взять готовый образ
volumes:
ports: - проброска портов
restart: always - если вдруг машина перезагрузится то докер сам перезапустит контейнеры
environment: - перечисляем переменные окружения
переходим из домашнего каталога в .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
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-cesudo 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 --versiondocker-compose up -d
-d - чтобы контейнеры в фоне работали
docker-compose down -d
Создать свой репозиторий можно с сайта hub.docker.com нажав Create Repository
либо просто запушив свои первый image
нужно в имя образа вставить идентификатор пользователя и через / имя репозитория
docker build -t artemproject/statisticmanager .
docker login
docker push artemproject/statisticmanagerЧтобы запустить postgres в docker нужно:
docker pull postgressdocker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres--name - имя контейнера на локальной машине POSTGRES_PASSWORD= - здесь указывается пароль -d (detach) необходимо указывать для того чтобы терминал оставвался терминалом локального компьютера, а не терминалом БД postgres - название контейнера который мы будем запускать -p 5432:5432 - проброс портов, порт внутри контейнера будет соответсвовать порту нашего компьютера
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;