Docker: истекло время ожидания соединения при подключении к Oracle контейнеру базы данных из Apache контейнера - PullRequest
0 голосов
/ 22 марта 2020

В настоящее время у меня возникает странная проблема: когда я пытаюсь подключиться к контейнеру базы данных Oracle из контейнера Apache, я получаю «TNS: Произошло время ожидания соединения» из метода oci_error. Мой PHP код выглядит следующим образом:

<?php

        $objConnect = oci_connect('SYSTEM', 'xxxxxxxxxx', 'x.x.x.x/xxxxx');
        if($objConnect)
        {
                echo "from Docker Oracle Server Connected" . PHP_EOL;
        }
        else
        {
                echo "Cannot connect to Oracle Server" . PHP_EOL;
                var_dump( oci_error() );
        }

?>

Мой docker код для запуска Oracle База данных:

docker run --name orcl_12c_r_1 -p 1521:1521 -p 5500:5500 -e ORACLE_SID=xxxxx oracle/database:12.1.0.2-se2

И я поднял Apache с этим docker -compose.yml:

version: '3'
services:

  oraclelinuxphp:
    build:
      context: ./oraclelinuxphp
      dockerfile: Dockerfile # install httpd and PHP here.
    ports:
      - "8080:80"
    volumes:
      - ./web:/var/www/html

Однако эта проблема была решена , когда я добавил хост network_mode к docker -compose.yml:

version: '3'
services:

  oraclelinuxphp:
    build:
      context: ./oraclelinuxphp
      dockerfile: Dockerfile # install httpd and PHP here.
    ports:
      - "8080:80"
    volumes:
      - ./web:/var/www/html
    network_mode: "host"

Я все еще ладья ie, когда дело доходит до Docker, и отсюда, я полагаю, я что-то упускаю в Docker. Я мог без проблем подключиться к базе данных Oracle в контейнере на сервере из приложения Oracle SQL Developer на моем рабочем столе. Кроме того, я также попробовал не-1045 * маршрут, и не-1046 * PHP также мог подключиться к этой Oracle базе данных.

Так что я считаю, что это Docker проблема. Что мне здесь не хватает? Как сделать так, чтобы в этом случае контейнер Apache мог подключаться к контейнеру базы данных Oracle?

Примечание: я использую:

1 Ответ

1 голос
/ 23 марта 2020

При использовании docker -compose и docker run возникает некоторая удобная магия c. Сеть будет установлена ​​неявным образом.

Пример:

cat > docker-compose.yml <<EOF
version: '3'
services:
  c1:
    image: alpine
    container_name: c1
    command: "sleep 1000"
  c2:
    image: alpine
    container_name: c2
    command: "sleep 1000"
EOF

# fire up the containers and detach
docker-compose up -d

Эти контейнеры смогут общаться друг с другом, так как сеть по умолчанию установлена. ( имя_папки_default )

docker network ls -fname=demo1
NETWORK ID          NAME                DRIVER              SCOPE
e3777f15f5aa        demo1_default       bridge              local

# c1 can talk to c2
docker-compose exec c1 sh -c 'ping -c1 c2'
PING c2 (172.30.0.2): 56 data bytes
64 bytes from 172.30.0.2: seq=0 ttl=64 time=3.741 ms

# c2 can talk to c1
docker-compose exec c2 sh -c 'ping -c1 c1'
PING c1 (172.30.0.3): 56 data bytes
64 bytes from 172.30.0.3: seq=0 ttl=64 time=0.798 ms

Теперь ваш сценарий состоит в том, что ваш контейнер базы данных не подключен к сети, созданной docker -compose. Например:

docker run --rm -it --name c3 alpine sh -c 'ping -c1 c1'
ping: bad address 'c1'

Вы можете определить сеть для своей команды запуска (это будет работать):

docker run --rm --net demo1_default -it --name c3 alpine sh -c 'ping -c1 c1'
PING c1 (172.30.0.3): 56 data bytes
64 bytes from 172.30.0.3: seq=0 ttl=64 time=0.571 ms

# make sure c3 keeps running while we try to contact it.
docker run --rm --net demo1_default -d -it --name c3 alpine sh -c 'sleep 1000'

# yes it works! 
docker-compose exec c1 sh -c 'ping -c1 c3'
PING c3 (172.30.0.4): 56 data bytes
64 bytes from 172.30.0.4: seq=0 ttl=64 time=0.314 ms

Чтобы связать все мои различные компоненты вместе, я всегда определяю их в docker - составьте, где я явно назову сеть следующим образом:

cat > docker-compose.yml <<EOF
version: '3'
services:
  c1:
    image: alpine
    container_name: c1
    command: "sleep 1000"
    networks:
      - mynet
  c2:
    image: alpine
    container_name: c2
    command: "sleep 1000"
    networks:
      - mynet
networks:
  mynet:
EOF

docker run только для ad-ho c императивных вещей. Я бы включил службу базы данных в файл docker -compose.yml или в отдельный файл, например docker-compose -f mydb.yml up -d, где определено имя сети. Оттуда ваши контейнеры смогут общаться с базой данных.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...