Как запустить sqlplus с моего ноутбука и подключиться к Dockerized oracle, запущенному с docker -compose? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь настроить автоматические интеграционные тесты для базы данных Oracle и планирую использовать https://www.testcontainers.org/ для запуска контейнеров в моем docker -compose.yml.

Мне удалось запустить Dockerized Oracle на моем ноутбуке, используя следующие инструкции: https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/12212-oradb-wlsstore

Шаги:

# see https://docs.oracle.com/cd/E37670_01/E75728/html/oracle-registry-server.html
docker login container-registry.oracle.com  # supply your oracle credentials as described above

docker network create -d bridge SampleNET

cat > env.txt <<EOF
DB_SID=InfraDB
DB_PDB=InfraPDB1
DB_DOMAIN=us.oracle.com
DB_BUNDLE=basic
EOF

docker run -d --name InfraDB --network=SampleNET -p 1521:1521 -p 5500:5500 --env-file env.txt -it --shm-size="8g"  store/oracle/database-enterprise:12.2.0.1

Через минуту когда я запускаю команду "sudo docker ps -a", я вижу, что БД работает и исправна.

CONTAINER ID        IMAGE                                       COMMAND                  
6a276a311b2e        store/oracle/database-enterprise:12.2.0.1   "/bin/sh -c '/bin/ba…"   

CREATED             STATUS                        PORTS                             
2 minutes ago       Up 2 minutes (healthy)        0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   

NAMES
InfraDB

И теперь я могу запустить sqlplus (из командной строки на моем ноутбуке, а не * Контейнер 1066 *):

sqlplus sys/Oradoc_db1@localhost:1521/InfraDB.us.oracle.com AS SYSDBA

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> 

Теперь моя цель - создать файл компоновки Docker, который позволит мне сделать то же самое, что было достигнуто с помощью вызова командной строки Dockerized Oracle. Вот файл docker -compose.yml, который я пробовал:

version: '2'
services:
  database:
    image: store/oracle/database-enterprise:12.2.0.1
    ports:
      - 1521:1521
      - 8080:8080
      - 5500:5500
    environment:
      - DB_SID:InfraDB
      - DB_PDB:InfraPDB1
      - DB_DOMAIN:us.oracle.com
      - DB_BUNDLE:basic
networks:
  default:
    external:
      name: SampleNET

Итак, с помощью этого файла docker compose я могу запустить оболочку в контейнере, где работает моя Oracle DB, и запустить sqlplus:

container=`sudo docker ps -a | grep oracle | sed -e's/\s.*//'`

sudo docker exec -t -i $container bash

# SESSION INSIDE DOCKER CONTAINER:
[oracle@8f26f224db03 /]$ sqlplus sys/Oradoc_db1  AS SYSDBA

                        SQL*Plus: Release 12.2.0.1.0 Production on Tue Mar 3 02:44:03 2020
                        Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Теперь вопрос на миллион долларов:

Каков синтаксис команды sqlplus, которую я хотел бы указать для подключения FROM MY LAPTOP (т. Е. Не запускать оболочку в контейнере, на котором выполняется Сервер БД)?

Вот несколько вариантов, которые я пробовал (примечание: я пробовал использовать localhost, 127.0.0.1 и фактический IP-адрес моего ноутбука):

sqlplus sys/Oradoc_db1@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=InfraDB)))'

sqlplus sys/Oradoc_db1@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=InfraDB.us.oracle.com)))'

Диагностика c Примечание:

Я бегу Docker на Ма c. После запуска Docker -ized Oracle я вижу прослушиватели на портах, которые перенаправляет конфигурация docker compose, как показано ниже:

sudo lsof -i -P | grep -i "listen" | egrep "1521|8080|5500"

com.docke 6295 christopher.bedford   33u  IPv6 0xfffffffffffffff      0t0    TCP *:1521 (LISTEN)
com.docke 6295 christopher.bedford   34u  IPv6 0xfffffffffffffff      0t0    TCP *:5500 (LISTEN)
com.docke 6295 christopher.bedford   38u  IPv6 0xfffffffffffffff      0t0    TCP *:8080 (LISTEN)

Проблема решена

Вот краткое изложение того, что я сделал для решения проблемы благодаря предложению моего друга Мэтта (Чангос Муэртос ниже).

1). создание мостовой сети 'Sampl eNET' не требуется.

2). похоже, что указание переменных окружения встроенным, как это (ниже) не работает

  environment:
  - DB_SID:InfraDB
  - DB_PDB:InfraPDB1
  - DB_DOMAIN:us.oracle.com
  - DB_BUNDLE:basic

3). Вместо этого лучше определить эти параметры среды в файле, на который ссылается опция конфигурации 'env_file', как показано ниже. Этот файл находится в /tmp/docker-compose.yml

version: '2'
services:
  database:
    image: store/oracle/database-enterprise:12.2.0.1
    ports:
      - 1521:1521
      - 8080:8080
      - 5500:5500
    env_file:
      - e2.txt

. Содержимое файла env находится в том же каталоге (/tmp/e2.txt) и имеет следующее содержимое:

DB_SID=InfraDB
DB_PDB=InfraPDB1
DB_DOMAIN=us.oracle.com
DB_BUNDLE=basic

Для запуска я делаю

   docker-compose -f /tmp/docker-compose.yml up

, а затем я могу подключиться (с моего ноутбука, как это было первоначальной целью) через:

    sqlplus sys/Oradoc_db1@0.0.0.0:1521/InfraDB.us.oracle.com as SYSDBA

1 Ответ

0 голосов
/ 03 марта 2020

Это зависит от нескольких вещей, таких как тип сети и правильность переадресации порта. Затем проверьте это на хосте (в linux 'netstat -tlpn'), он покажет вам, прослушивает ли он порт, и если да, то какой интерфейс и протокол. Инструмент может отличаться в зависимости от операционной системы хоста.

Как только вы увидите, что он прослушивает tcp (не только tcp6), и на хосте открыт брандмауэр, вы можете объединить эту информацию для создания строки подключения.

...