Статьи

Запуск веб-приложения в среде связанных Docker-контейнеров

В пост- докерском веб-приложении с Puppet мы размещали веб-приложение в одном контейнере, на этот раз мы разместим веб-приложение в среде связанного контейнера докера, в которой находится наша база данных (mysql), используемая нашим веб-приложением, размещенным в другом контейнере докера. ,

Прежде чем начать, давайте кратко расскажем о контейнерах Linking Docker и о том, как они нам помогают.

Связывать или соединять контейнеры Docker?

Связывание контейнеров Docker позволяет контейнерам обнаруживать друг друга и безопасно передавать информацию между ними. Связывание устанавливает канал между контейнерами, позволяя контейнеру-получателю надежно получить доступ к контейнеру-источнику, предотвращая доступ контейнера-источника к сети.

В этом посте контейнер получателя — это контейнер Spring-application, который мы создали в этом посте, а контейнер источника — контейнер базы данных, который мы создаем сейчас.

Давайте начнем с создания контейнера базы данных и связывания его с spring-application-container, выполнив следующие шаги:

Шаг 1: Создайте каталог с любым именем для меня, это база данных-контейнер внутри докера каталогов (созданного в этом посте) , следующим образом:

1
2
3
4
$ cd docker
$ mkdir database-container
$ cd database-container
$ touch Dockerfile

Шаг 2. Скопируйте приведенный ниже контент в docker / database-container / Dockerfile :

1
2
3
4
5
6
FROM ubuntu:latest
MAINTAINER arpitaggarwal "[email protected]"
RUN apt-get install -q -y mysql-server
RUN apt-get install -q -y mysql-client
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf
EXPOSE 3306

RUN sed -i -e ”s / ^ bind-address \ s * = \ s * 127.0.0.1 / bind-address = 0.0.0.0/” /etc/mysql/my.cnf, указанный выше, должен установить MYSQL bind- обратиться к 0.0.0.0, потому что это   обычно по умолчанию слушает только 127.0.0.1 .

Шаг 3: Создайте вновь созданный контейнер базы данных следующим образом:

1
2
$ cd database-container
$ docker build --no-cache=true -t database .

указанная выше база данных ссылается на имя образа контейнера базы данных.

Шаг 4: Запустите контейнер базы данных с присвоением имени «db» и MYSQL Server, установленный как сервис внутри контейнера базы данных , следующим образом:

1
$ docker run -P -it --name db database /bin/bash

Шаг 5: Измените существующий Dockerfile -контейнер- приложения, чтобы скопировать новое приложение в контейнер, использующий базу данных, размещенную в БД-контейнера , следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
FROM ubuntu:latest
MAINTAINER arpitaggarwal "[email protected]"
RUN apt-get -y update
RUN apt-get -q -y install git
RUN sudo apt-get install -y ruby
RUN apt-get install -y ruby-dev
RUN apt-get -y update
RUN apt-get install -y make
RUN apt-get install -y build-essential
RUN apt-get install -y puppet
RUN gem install librarian-puppet
ADD Puppetfile /
RUN librarian-puppet install
RUN puppet apply --modulepath=/modules -e "include java8 class { 'tomcat':version => '7',java_home => '/usr/lib/jvm/java-8-oracle'}"
RUN apt-get remove -y make puppet build-essential ruby-dev
COPY /spring-mysql/target/spring-mysql.war /var/lib/tomcat7/webapps/
EXPOSE 8080

Шаг 6: Создайте приложение в каталоге docker , на этот раз spring-mysql клонирован из github :

1
2
3
4
$ cd docker
$ git clone https://github.com/arpitaggarwal/spring-mysql.git
$ cd spring-mysql
$ mvn clean install

Шаг 7: Затем запустите spring-application-container, связав его с базой данных-контейнером следующим образом:

1
$ docker run -p 8080:8080 -it --name webapp --link db spring-application-container /bin/bash

Флаг -link, указанный выше, создает защищенную связь между контейнером-приложением-Spring и контейнеромбазой данных и предоставляет информацию о соединении для исходного контейнера контейнеру-получателю двумя способами:

а) Переменные среды.
б) Обновление файла / etc / hosts .

Теперь мы можем использовать открытые переменные среды или записи из host для доступа к контейнеру db. Кроме того, если мы перезапустим исходный контейнер, связанные файлы контейнеров / etc / hosts будут автоматически обновлены с использованием нового IP-адреса исходного контейнера, что позволит продолжить связанное взаимодействие.

В нашем приложении мы использовали механизм ввода хоста для чтения IP-адреса исходного контейнера, используя Java InetAddress .

Шаг 8: Наше приложение попытается получить доступ к базе данных mysql с пользователем в качестве «test» и паролем в качестве «test» и использовать таблицу сотрудников для хранения сведений о сотрудниках, отправленных из приложения , поэтому давайте создадим его:

1
2
3
4
5
6
7
$ mysql --user=root mysql
$ CREATE USER 'test'@'%' IDENTIFIED BY 'test’;
$ GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
$ FLUSH PRIVILEGES;
$ CREATE DATABASE  test;
$ USE TEST;
$ CREATE TABLE employee (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age VARCHAR(30));

Шаг 9: Получите ваш IP-адрес контейнера Docker, используя docker-machine :

1
docker-machine ip your_vm_name

Затем создайте сотрудника, отправившего имя и возраст из приложения, и обновите экран, чтобы получить его из базы данных по адресу http: // container-ip-address: 8080 / spring-mysql

  • Полный исходный код размещен на github .