В пост- докерском веб-приложении с 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 .
Ссылка: | Запуск веб-приложения в среде связанных Docker-контейнеров от нашего партнера JCG |