Использование Docker и Testcontainers для тестирования интеграции баз данных - PullRequest
0 голосов
/ 16 апреля 2019

После небольшого исследования я пришел к выводу, что контейнеры Docker могут быть пригодны для тестирования интеграции баз данных с использованием тестовых контейнеров , поскольку для этого потребуется только контейнер Docker, на котором выполняется образ базы данных, воспроизводящий базу данных. схема, по которой будут выполняться тесты. Этот экземпляр может быть запущен локально на компьютере каждого разработчика, или, что еще лучше, один и тот же экземпляр может совместно использоваться несколькими разработчиками: можно настроить автоматический тест для запуска экземпляра базы данных из того же образа в Docker для каждого метода тестирования, если это необходимо, используя аннотация @Rule.

При попытке установить Docker для Windows 7, чтобы поиграть с ним, я продолжал получать следующую ошибку, которая, похоже, связана с VirtualBox:

docker Error creating machine: Error in driver during machine creation: Unable to start the VM: VBoxManage.exe startvm default --type headless failed:

Result code: E_FAIL (0x80004005)
Component: MachineWrap
Interface: IMachine

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

1 Ответ

1 голос
/ 16 апреля 2019

Чтобы обойти проблему, описанную в вопросе, я выполнил следующие шаги:

1.Установите Плеер для рабочих станций VMware

2.Запустите виртуальную машину Linux Ubuntu

Используя iso-файл с веб-сайт Ubuntu , запустите устройство Ubuntu на проигрывателе VMware

3.Установите Docker на Ubuntu VM

$ sudo apt-get install docker.io

4.Действия после установки

4.1.Создайте группу Docker и добавьте своего пользователя

$ sudo groupadd docker

$ sudo usermod -aG docker $ USER

4.2.Выйдите из системы и войдите в систему

, чтобы вновь оценить членство в вашей группе

4.3.Убедитесь, что вы можете запускать команды docker без sudo

$ docker run hello-world

5.Загрузить образ базы данных

В этом примере это Oracle 11g:

$ docker pull wnameless / oracle-xe-11g

6.Запустите образ базы данных

(если вы планируете подключиться к экземпляру базы данных Oracle из testcontainers, этот шаг не требуется)

$ docker run -d -p 49161: 1521 wnameless /oracle-xe-11g

Для получения дополнительной информации / опций см. Докер-хаб :

7.Подключение к базе данных

Использование со следующими настройками:

имя хоста: localhost

порт: 49161

sid: xe

имя службы: xe

имя пользователя: система

пароль: oracle

Для подключения с хост-компьютера используйте IP-адрес виртуальной машины вместо localhost,Запустите ifconfig на гостевой виртуальной машине Ubuntu, чтобы получить IP-адрес

8.Сконфигурируйте удаленный доступ к Docker

Сконфигурируйте, где демон Docker прослушивает соединения (требуется только в том случае, если к Docker требуется удаленный доступ, т.е. не из гостевой системы Ubuntu), так как по умолчанию демон Docker прослушивает сокеты Unix (локальные соединения)

8.1.Создать конфигурационный файл

Создать /etc/systemd/system/docker.service.d/override.conf файл с содержимым для замены по умолчанию (ExecStart=/usr/bin/dockerd -H fd://):

# /etc/systemd/system/docker.service.d/override.conf

[Служба]

ExecStart =

ExecStart = / usr / bin / dockerd -H fd: // -H tcp: //0.0.0.0: 2376

Чтобы создать этот файл, вы можете запустить следующую команду unix:

printf "# /etc/systemd/system/docker.service.d/override.conf \n [Service] \ nExecStart = \ nExecStart = / usr / bin / dockerd -H fd: // -H tcp: //0.0.0.0: 2376 "> /etc/systemd/system/docker.service.d/override.конф

8.2.Перезапустите Docker

После сохранения этого файла перезагрузите конфигурацию, выполнив:

systemctl daemon-reload

Затем перезапустите Docker, запустив:

Перезапуск systemctl docker.service

8.3.Проверьте ваш демон Docker

После перезапуска службы Docker вы можете увидеть номер порта в выводе:

systemctl status docker.service

(Вы должны увидеть что-то вроде: /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376)

или

sudo netstat -tunlp |grep dock

(Вы должны увидеть что-то вроде: tcp6 0 0 :::2376 :::* LISTEN 121686/dockerd)

8.4.Полезные ресурсы

Как включить удаленный API для dockerd

Как определить порт демона Docker

Настроить, где демон docker прослушивает соединения

9.Задать переменную среды Docker Host

Этот шаг необходим только в том случае, если вы планируете удаленно подключиться к контейнеру базы данных с помощью API-интерфейса testcontainers (например, из теста Junit) из ОС, на которой установлена ​​виртуальная машина Ubuntu (Docker dameon работает наUbuntu VM)

Определить переменную среды: DOCKER_HOST = tcp://<Ubuntu machine's IP address>:2376.Обратите внимание, что имя хоста - это виртуальная машина Ubuntu.Если эта переменная среды не определена, API-интерфейс testcontainers (OracleContainer oracleContainer = new OracleContainer ("wnameless / oracle-xe-11g");) ожидает, что демон Docker будет работать на локальном хосте (см. Фрагмент кода ниже)

10.Использование контейнера базы данных из тестового класса

Используя API-интерфейс testcontainer, тест Junit может запустить экземпляр базы данных из образа Docker на виртуальной машине Ubuntu, выполнить запросы к нему и, в конце концов, закрыть его

Тестовый класс Junit

package com.xxx.yyy.repository;

import static org.junit.Assert.assertEquals;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.time.LocalDateTime;
import java.util.concurrent.TimeoutException;

import org.junit.ClassRule;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.testcontainers.containers.OracleContainer;

@TestInstance(Lifecycle.PER_CLASS)
public class MyRepositoryIT {

    @ClassRule
    public OracleContainer oracleContainer;

    @BeforeAll
    public void setup() throws TimeoutException {
        String dockerHost = System.getenv("DOCKER_HOST");
        System.out.println("dockerHost: @" + dockerHost + "@");

        System.out.println("Starting Oracle Container... (" + LocalDateTime.now() + ")");
        oracleContainer = new OracleContainer("wnameless/oracle-xe-11g");
        oracleContainer.start();
        System.out.println("Oracle Container started. (" + LocalDateTime.now() + ")");

    }

    @AfterAll
    public void tearDown() {
        System.out.println("Stopping Oracle Container... (" + LocalDateTime.now() + ")");
        oracleContainer.stop();
        System.out.println("Oracle Container stopped. (" + LocalDateTime.now() + ")");
    }

    @Test
    public void whenSelectQueryExecuted_thenResulstsReturned() throws Exception {

        String jdbcUrl = oracleContainer.getJdbcUrl();
        String username = oracleContainer.getUsername();
        String password = oracleContainer.getPassword();
        Connection conn = DriverManager.getConnection(jdbcUrl, username, password);
        ResultSet resultSet = conn.createStatement().executeQuery("SELECT 1 FROM DUAL");
        resultSet.next();
        int result = resultSet.getInt(1);

        assertEquals(1, result);

    }

}

Зависимости Maven

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xxx.yyy</groupId>
    <artifactId>docker-testcontainers</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
        <spring.version>5.1.3.RELEASE</spring.version>
        <testcontainers.version>1.10.2</testcontainers.version>
        <junit-engine.version>5.3.2</junit-engine.version>
        <junit-launcher.version>1.3.2</junit-launcher.version>
        <maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>testcontainers</artifactId>
            <version>${testcontainers.version}</version>
        </dependency>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>oracle-xe</artifactId>
            <version>${testcontainers.version}</version>
        </dependency>
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>12.1.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit-engine.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>${junit-launcher.version}</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

Разные заметки

Полезные команды Docker

  • Список изображений: docker images
  • Список всех контейнеров: docker ps -a
  • Запуск контейнера: docker start [container id]
  • Список запущенных контейнеров: docker ps
  • Просмотр журналов запущенного контейнера: docker logs [container id]

Ссылки

Установка Docker в Ubuntu

Дополнительная информация о Post-шаги установки

Использование образа Oracle в Docker

Тестирование базы данных с помощью TestContainers

О образе Oracle 12c

Я пробовал образ Oracle 12c (sath89/oracle-12c из: https://hub.docker.com/r/sath89/oracle-12c)

$ docker run -d -p 8080: 8080 -p 1521: 1521 --name oracle-db-12c sath89 / oracle-12c

, но запуск тестовых контейнеров кажется настолько медленным, что в итоге происходит следующее исключение (примерно через 4 минуты) thrown:

java.sql.SQLRecoverableException: ORA-01033: инициализация или завершение ORACLE.

Если образ 12c запускается с самого хоста докера (т.е.Ubuntu), он запускается успешно.

...