Чтобы обойти проблему, описанную в вопросе, я выполнил следующие шаги:
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), он запускается успешно.