Spring Boot 2.0 (5): Docker Compose + Spring Boot + Nginx + Mysql Практика

Spring Boot MySQL Docker Nginx

Я знаю, что вы прочитали несколько статей, которые я написал о докере за этот период времени.Он не болит и не чешется, и вы до сих пор не чувствуете удобства докера.Да, я тоже так думаю, я знаю ваше чувство.

Понимать концепции на ранней стадии действительно скучно. Пожалуйста, не беспокойтесь о захватывающем начале. Когда у вас будет понимание связанных концепций докера, я дам вам серию небольших примеров в сочетании со 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.Если вы этого не знаете, то можете проверить мои предыдущие две статьи:

Скопируйте проект на сервер и войдите в каталог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 вы по-настоящему почувствуете его удобство и мощь.

Пример кода — гитхаб

Образец кода — Облако кода

Ссылаться на

Docker Compose with Spring Boot, MySQL and NGINX