Docker - это средство упаковки (в контейнеры), доставки и запуска (запуск осуществляется одним и тем же образом, единый интерфейс) приложения. Докер - это история про виртуализацию, но не ту какую вам предоставляют виртуальные машины, которые разворачивают полноценную ОС внутри вашей. Главная задача Докера запустить приложение.
Docker image - это сборка, говтовое к запуску приложение, но еще не запущеное.
Docker container - работающее приложение, созданное на базе имеджа.
На основе одного образа можно создать много одинаковых контейнеров. Например, нужно 10 реплик одного сервиса.
Для контейнера образ является read only системой, он не может его изменить.
Image - слоеный пирог, напрмиер image Ubuntu и возьмем его за базу и поставим туда Nginx и поставим туда mongo и поставим питон.
Реестр имеджей - он находится локально там хранятся те images которые создали именно вы.
Также есть docker hub - там реестр всех имеджей, которые поддерживаются создателями докера но так же и те которые создавали другие люди.
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"]
docker run hello-world
Контейнер работает до тех пор пока работает приложение.
docker run --name hello hello-world
docker run --name hello -d hello-world
docker 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-world
docker 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-world
docker 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-ce
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 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 postgress
docker 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;