Михаил
Павлов
ОС
Технологии
CI / CD
Деплой
"соберу у себя на компе"
скопировать jar-файл на сервер
ОС
Технологии
CI / CD
Деплой
"соберу у себя на компе"
скопировать jar-файл на сервер,
скопировать артефакты клиента
скопировать jar-файл на сервер
ОС
Технологии
CI / CD
Деплой
скопировать jar-файл на сервер,
скопировать артефакты клиента
скопировать jar-файл на сервер 1,
скопировать jar-файл на сервер 2,
скопировать артефакты клиента
ОС
Технологии
CI / CD
Деплой
скопировать jar-файл на сервер 1,
скопировать jar-файл на сервер 2,
скопировать артефакты клиента,
собрать мобильное приложение,
выложить мобильное приложение в google play
скопировать jar-файл на сервер 1,
скопировать jar-файл на сервер 2,
скопировать артефакты клиента,
Эмуляция одной ОС (целевая) внутри другой (хост)
+ изоляция целевой ОС от ОС хоста
* внутри целевой ОС для программ она выглядит как обычный компьютер со стандартыми ресурсами
** Эмулируется железо, при этом целевая ОС - полновесная
Что это значит?
Docker
Virtual Machine
В терминах ООП:
Для разных платформ способы установки разные, подробнее тут
Проверить, что докер работает можно командой:
$ docker run hello-world
В результате команды, кроме прочего, будет такой текст:
Hello from Docker!
This message shows that your installation appears to be working correctly.
Сам Docker можно запустить на:
Контейнеры Docker есть для Linux и Windows
* Но Docker - надстройка над ОС-хостом, поэтому поставить на Linux контейнер с Windows не получится
* Некоторые компании поднимают свои ресурсы с образами
** У нас тоже есть свое хранилище с образами
- И это всё?
- Да!
Команда для скачивания образа через консоль
$ docker run --name my-app openjdk:12
Несколько ключевых моментов:
* И запушить его в общее хранилище
Dockerfile - это пошаговый рецепт сборки образа (image)
Каждый слой последовательно меняет то, что получилось на прошлом слое
class Main {
public static void main(String []args) {
System.out.println("Docker is alive!");
}
}
Содержимое Main.java:
FROM openjdk:12
COPY app /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]
Берем за основу существующий образ
Копируем наше java-приложение внутрь контейнера
Устанавливаем рабочую директорию для дальнейших действий внутри образа
Компилируем наше java-приложение
Запускаем наше
java-приложение
(CMD выполнится при старте контейнера)
$ docker build -t <имя образа> .
$ docker run --name <имя контейнера> <имя образа>
* По умолчанию докер ждет имя файла как Dockerfile. Чтобы указать файл с другим именем, нужно использовать атрибут -f <имя файла>
FROM openjdk:12
COPY app /usr/src/myapp
WORKDIR /usr/src/myapp
ARG MY_ARG
RUN echo $MY_ARG
RUN javac Main.java
CMD ["java", "Main"]
$ docker build -t my-container --build-arg MY_ARG=10 .
$ docker ps
Очень полезная команда (документация)
Некоторые атрибуты:
* На самом деле Compose - это "синтаксический сахар" для удобства работы.
Всё, что делает Compose, можно сделать и командами docker, но не так удобно
*Для Docker Desktop (Win, Mac) он включен сразу
Для Linux нужно установить отдельно
version: "3.1"
services:
backend:
image: myimage
Версия формата compose-файла
Список сервисов, в этом блоке перечисляются наши контейнеры
Уникальное, в рамках файла, имя нашего сервиса, на него можно ссылаться при описании других сервисов
Имя образа, по которому будет запущен сервис
create | создает сервисы |
start | запускает сервисы |
stop | останавливает сервисы |
up | create + start |
down | останавливает и удаляет сервисы и пр. |
restart | stop + start |
build | собирает или пересобирает сервисы |
ps | выводит список контейнеров |
Внимание!
Опасная команда
Обычно лучше использовать stop
$ docker-compose up -d
Пример вызова:
* "- d" удобный атрибут, который запускает контейнер без блокировки терминала
version: "3.1"
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: mydb
ports:
- 5577:5432
Указываем переменные среды, которые нужны базе данных
Берем из готового образа, а не из Dockerfile
Указываем, какие порты должны быть проксированы "наружу" контейнера
*Слева порты хоста,
справа - сервиса
filebeat-logstash:
image: prima/filebeat:5.6
volumes:
- ./filebeat-logstash.yml:/filebeat.yml
- ./ssl:/etc/filebeat/ssl
Для получения данных с хост-машины есть специальный блок - volumes
* Как и с портами, слева идет папка или файл с хост машины, справа, после двоеточия, идет путь в контейнере
version: "3.1"
services:
backend:
image: myimage
depends_on:
- db
links:
- db
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: mydb
ports:
- 5577:5432
version: "3.1"
services:
backend:
image: myimage
version: "3.1"
services:
db:
image: postgres
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: 1234
POSTGRES_DB: mydb
ports:
- 5577:5432
version: '2'
services:
db:
image: de1m0s/postgres-compose:1.1
container_name: CTT-T01-db
restart: unless-stopped
environment:
POSTGRES_DB: tomcat_db
ports:
- "55555:5432"
web-server:
image: dh.sis-it.pro/tomcat:8.5.35-jre8
restart: unless-stopped
container_name: CTT-T01-web
environment:
TOMCAT_DB_NAME: tomcat_db
TOMCAT_DB_HOST: db
TOMCAT_DB_JNDI_NAME: jdbc/contractor
TOMCAT_EXTERNAL_FOLDER: /var/external-files/
MaxMetaspaceSize : 1024m
JAVA_XMX: -Xmx2g
ports:
- "9999:8080"
links:
- db
volumes:
- /etc/timezone:/etc/timezone:ro
- ./ssl/:/usr/local/tomcat/ssl
nginx-conf:
image: nginx
restart: unless-stopped
container_name: CTT-T01-nginx
volumes:
- ./ctt.conf:/etc/nginx/conf.d/ctt.template
ports:
- "8888:80"
environment:
NGINX_PROXY_HOST: web-server
NGINX_PROXY_PORT: 7775
remote_addr: $$remote_addr
http_host: $$http_host
proxy_add_x_forwarded_for: $$proxy_add_x_forwarded_for
links:
- web-server
webdav:
image: ionelmc/webdav
container_name: CTT-T01-webdav
restart: unless-stopped
environment:
UID: 0
volumes:
- /var/external-files/webdavfiles-ctt-t01:/media
- ./webdav-entrypoint.sh:/entrypoint.sh
ports:
- "7777:8080"
Базовое:
Для тех, кому хочется больше:
Dockerfile | Image | |||
---|---|---|---|---|
build | ||||
create | ||||
start | ||||
stop | ||||
run |
Container
Stopped
Container
Running
Но это уже совсем другая история