Я знаю, что вы прочитали несколько статей, которые я написал о докере за этот период времени.Он не болит и не чешется, и вы до сих пор не чувствуете удобства докера.Да, я тоже так думаю, я знаю ваше чувство.
Понимать концепции на ранней стадии действительно скучно. Пожалуйста, не беспокойтесь о захватывающем начале. Когда у вас будет понимание связанных концепций докера, я дам вам серию небольших примеров в сочетании со Spring Boot, что заставит вас почувствовать, что использование Docker — это так здорово!
Режиссер, который выступит сегодня для вас, — это docker-compare из семейства Docker, в главных ролях Spring Boot, Nginx и Mysql, Классический блокбастер, которого стоит ждать с нетерпением.
Spring Boot + Nginx + Mysql — это наиболее часто используемая комбинация в реальной работе. Внешний интерфейс использует Nginx для прокси-запросов к службе Tomcat, встроенной в Spring Boot на внутреннем уровне. Mysql отвечает за взаимодействие с данными в бизнесе. docker, мы Как получить эти среды?
- 1. Установите Nginx, настройте информацию, связанную с Nginx, и перезапустите.
- 2. Установите Mysql, настройте часовой пояс набора символов и другую информацию, перезапустите и, наконец, инициализируйте скрипт.
- 3. Запустите проект Spring Boot и проведите совместные отладочные тесты в целом.
Вы можете видеть, что я написал только три строки, но на самом деле создавать эти среды довольно хлопотно, но это не конец, после периода использования его необходимо мигрировать в другую среду, что я должен сделать и нужно сделать это снова? При нормальных обстоятельствах тестовая среда, среда SIT, среда UAT, производственная среда! Нам нужно повторить сборку четыре раза. Кто-то говорит, что его не раз строили четыре раза? Ничего страшного, тогда я хочу сказать вам, слишком молод, слишком прост.
Рассмотрим следующие факторы:
Во-первых, это самый простой случай: что, если в проекте задействованы MongoDB, Redis, ES... какие-то среды столбцов? Во-вторых, если вы часто создаете среду или отлаживаете программу, вы будете знать, в чем проблема среды? Иногда это явно та же конфигурация, но она не может работать в другой среде. Итак, вы тратите много времени на поиски, только чтобы узнать, что там отсутствует параметр или запятая, или версия ядра системы несовместима, или вы не понимаете, почему! Можно только перейти на другой сервер, тогда с помощью Docker можно прекрасно избежать этих ям.
Что ж, без лишних слов, приступим!
Весенний чехол для ботинок
Прежде всего, давайте подготовим небольшую сцену Spring Boot с использованием Mysql.Сделаем такой пример, используем Spring Boot для создания веб-приложения, предоставим метод подсчета количества посещений по IP-адресу и сохраним статистические данные в Mysql. для каждого запроса и отображать его на странице.
информация о конфигурации
Пакет зависимостей
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
В основном добавьте поддержку Spring Boot Web, используйте Jpa для работы с базой данных, добавьте пакет драйверов Myql и т. д.
конфигурационный файл
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true
Настраивается информация о ссылке базы данных, а также схема таблицы обновлений Jpa, диалект и необходимость отображения Sql
основной код
Код ядра очень прост, каждый раз, когда приходит запрос, оценивается, засчитан ли он, если нет новых данных, если есть статистические данные, обновить данные.
@RestController
public class VisitorController {
@Autowired
private VisitorRepository repository;
@RequestMapping("/")
public String index(HttpServletRequest request) {
String ip=request.getRemoteAddr();
Visitor visitor=repository.findByIp(ip);
if(visitor==null){
visitor=new Visitor();
visitor.setIp(ip);
visitor.setTimes(1);
}else {
visitor.setTimes(visitor.getTimes()+1);
}
repository.save(visitor);
return "I have been seen ip "+visitor.getIp()+" "+visitor.getTimes()+" times.";
}
}
Код класса сущностей и уровня репозитория относительно прост, поэтому я не буду публиковать его здесь.Если вам интересно, вы можете загрузить исходный код для просмотра.
После того, как вышеуказанный контент будет завершен, запустите проект и посетите:http://localhost:8080/
Мы можем видеть этот возвращаемый результат:
I have been seen ip 0:0:0:0:0:0:0:1 1 times.
Второй визит станет
I have been seen ip 0:0:0:0:0:0:0:1 2 times.
Несколько посещений были наложены друг на друга, указывая на то, что разработка демонстрационного проекта завершена.
Докеризованное преобразование
Сначала преобразуем директорию в такую структуру
Начнем с самого внешнего слоя:
-
docker-compose.yaml
: основной файл docker-compose, описывающий, как собрать весь сервис. -
nginx
: конфигурация nginx -
app
: Адрес проекта Spring Boot
Если нам нужна специальная настройка для Mysql, мы также можем создать папку mysql на самом внешнем уровне и настроить ее в этом каталоге.
docker-compose.yaml
Подробный файл
version: '3'
services:
nginx:
container_name: v-nginx
image: nginx:1.13
restart: always
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
mysql:
container_name: v-mysql
image: mysql/mysql-server:5.7
environment:
MYSQL_DATABASE: test
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
ports:
- "3306:3306"
restart: always
app:
restart: always
build: ./app
working_dir: /app
volumes:
- ./app:/app
- ~/.m2:/root/.m2
expose:
- "8080"
depends_on:
- nginx
- mysql
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
-
version: '3'
: указывает, что для сборки файла docker-compose.yaml используется синтаксис третьего поколения. -
services
: используется для указания сервисов, которые необходимо запустить.Мы видим, что в этом файле есть три сервиса: nginx, mysql и app. -
container_name
: имя контейнера -
environment
: информация в этом узле будет передана в контейнер как переменные среды.В этом примере служба mysql настроена с базой данных, паролем и информацией о разрешениях. -
ports
: указывает порт, открытый для внешнего мира -
restart: always
Указывает, что если служба не запустится, она продолжит попытки. -
volumes
: загрузить файл конфигурации в локальный каталог по целевому адресу контейнера. -
depends_on
: Зависимые службы можно настроить, указав, что их нужно запускать первыми.depends_on
После следующих служб запустите эту службу. -
command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker
: означает запуск проекта с помощью этой команды,-Dspring-boot.run.profiles=docker
указать использованиеapplication-docker.properties
информация о конфигурации файла для запуска.
Интерпретация файла Nginx
Nginx имеет файл app.conf в каталоге, который в основном настраивает информацию о переадресации службы.
server {
listen 80;
charset utf-8;
access_log off;
location / {
proxy_pass http://app:8080;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
access_log off;
expires 30d;
alias /app/static;
}
}
Этот фрагмент содержимого относительно прост: настройте переадресацию запросов и перенаправьте запросы с порта 80 на порт 8080 приложения-службы. вproxy_pass http://app:8080
Информация о конфигурации этого блока должна быть объяснена.app
вместоlocalhost
, так как они не находятся в контейнере, доступ к службам в наборе составной связи должен осуществляться с использованием имени службы.
Преобразование проекта Spring Boot
существуетapp
каталог иpom.xm
Добавить файл на том же уровнеDockerfile
файл, содержимое файла следующее:
FROM maven:3.5-jdk-8
Есть только одно предложение, в зависимости от базового изображенияmaven3.5
иjdk 1.8
. Так какdocker-compose.yaml
Файл задает команду запуска проекта, и здесь нет необходимости добавлять команду запуска.
в проектеresources
Создано в каталогеapplication-dev.properties
иapplication-docker.properties
документ
-
application-dev.properties
Информация о конфигурации в соответствии с приведенным выше -
application-docker.properties
Внесите небольшие изменения в информацию о конфигурации в базе данных и измените информацию о подключении к базе данных,jdbc:mysql://localhost:3306/test
изменить наjdbc:mysql://mysql:3306/test
.
Таким образом, вся наша конфигурация выполнена.
развертывать
Копируем проект на сервер для тестирования.Сначала на сервер нужно установить среду Docker и Docker Compos.Если вы этого не знаете, то можете проверить мои предыдущие две статьи:
- Docker (1): руководство по началу работы с Docker
- Docker (4): Docker Compose of the Docker Three Musketeers
Скопируйте проект на сервер и войдите в каталогcd dockercompose-springboot-mysql-nginx
Запустите службу:docker-compose up
[root@VM_73_217_centos dockercompose-springboot-mysql-nginx]# docker-compose up
Creating network "dockercomposespringbootmysqlnginx_default" with the default driver
Creating v-nginx ... done
Creating v-mysql ... done
Creating dockercomposespringbootmysqlnginx_app_1 ... done
Attaching to v-nginx, v-mysql, dockercomposespringbootmysqlnginx_app_1
v-mysql | [Entrypoint] MySQL Docker Image 5.7.21-1.1.4
v-mysql | [Entrypoint] Initializing database
app_1 | [INFO] Scanning for projects...
...
app_1 | 2018-03-26 02:54:55.658 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
app_1 | 2018-03-26 02:54:55.660 INFO 1 --- [ main] com.neo.ComposeApplication : Started ComposeApplication in 14.869 seconds (JVM running for 30.202)
см. информациюTomcat started on port(s): 8080
Указывает, что служба успешно запущена. также можно использоватьdocker-compose up -d
начать в фоновом режиме
адрес сервера доступа;http://58.87.69.230/
,возвращение:I have been seen ip 172.19.0.2 1 times.
Указывает, что вся служба успешно запущена
использоватьdocker-compose ps
Просмотреть все контейнеры в настоящее время в проекте
[root@VM_73_217_centos dockercompose-springboot-mysql-nginx]# docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------
dockercomposespringbootmysqlnginx_app_1 /usr/local/bin/mvn-entrypo ... Up 8080/tcp
v-mysql /entrypoint.sh mysqld Up (healthy) 0.0.0.0:3306->3306/tcp, 33060/tcp
v-nginx nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
Вы можете увидеть статус, команды, порты и другую информацию о сервисах в проекте.
закрыть службуdocker-compose down
[root@VM_73_217_centos dockercompose-springboot-mysql-nginx]# docker-compose down
Stopping dockercomposespringbootmysqlnginx_app_1 ... done
Stopping visitor-nginx ... done
Stopping visitor-mysql ... done
Removing dockercomposespringbootmysqlnginx_app_1 ... done
Removing visitor-nginx ... done
Removing visitor-mysql ... done
docker-compose заказ
При использовании docker-compose для запуска часто возникает исключение соединения Mysql отчета о проекте.После отслеживания в течение дня я наконец нашел проблему. docker-compose, хотя это можно сделать черезdepends_on
Чтобы определить порядок запуска службы, но невозможно определить, была ли запущена служба, поэтому будет такое явление, запуск службы Mysql относительно медленный, когда проект Spring Boot был запущен, но Mysql не был инициализируется, поэтому при подключении проекта к базе данных Mysql При подключении к базе данных возникает исключение.
Есть два решения этой проблемы:
1. Достаточная отказоустойчивость и механизмы повторных попыток, такие как подключение к базе данных, при сбое первоначального подключения потребитель службы может продолжать повторять попытки до тех пор, пока служба не будет подключена. То есть определить в сервисе:restart: always
2. Синхронное ожидание, использованиеwait-for-it.sh
или другойshell
Сценарий блокирует запуск текущей службы до тех пор, пока не будут загружены зависимые службы. Эту схему можно попробовать позже.
Суммировать
Нет ничего плохого без сравнения.Перед использованием Docker, если нам нужно построить такую среду, нам нужно установить Nginx, Mysql, а затем выполнить ряд настроек и отладок, и побеспокоиться о различных проблемах среды; после использования Docker просто две команды Завершите онлайн и оффлайн сервис.
docker-compose up
docker-compose down
На самом деле оптимизаций для развертывания, эксплуатации и обслуживания контейнерной технологии еще много, это только начало, только после использования Swarm вы по-настоящему почувствуете его удобство и мощь.