Как соединить образы докеров ASP.NET Core (сначала код) и SQL-сервер

Я работаю над проектом на nopCommerce и пытаюсь запустить его с помощью изображений докеров. Есть два изображения, одно для nopCommerce, а второе для сервера MSSQL. Вот шаг, который я выполнил,

1) Создайте образ докера и запустите его на порту 8080.

C:\Users\Admin>docker run -d -p 8080:80 --name mystore nop420
ca626cc5ed4e3759a03e9645dcd374016a5d8f278ffede8e1345f851f9a82c7d

Проект работает на порту 8080

2) Вытащил образ MSSQL(Express) Linux из Docker Hub.

3) Запустил его с помощью команды

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -e 'MSSQL_PID=Express' -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest-ubuntu 

4) docker exec -it unruffled_tharp "bash"

5) /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'yourStrong(!)Password'

6) Создал БД

7) Попытался подключить образ MSSQL с помощью расширения VSCode, все работает

введите здесь описание изображения

8) Передал ту же строку подключения на страницу установки nopCommerce.

Data Source=localhost;Initial Catalog=nop420;User ID=sa;Password=yourStrong(!)Password

Но выдает ошибку

Setup failed: An error occurred while creating the database: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)

Я пробовал использовать IP вместо localhost, добавляя порт 1433 и почти все с разных форумов, хотя ошибка остается той же.

Изменить: Вот проверка сети

$ docker network inspect 6cb
[
    {
        "Name": "mynetwork",
        "Id": "6cb7171b74ee08a55d4ab8c9a26518bfb0a21ee5d8894300a7151453925f550d",
        "Created": "2019-07-16T01:13:46.4791178Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ca626cc5ed4e3759a03e9645dcd374016a5d8f278ffede8e1345f851f9a82c7d": {
                "Name": "mystore",
                "EndpointID": "dbe46ebc4208bbce5d29c55c40bc0a0809ff3196da5ce7360c6e1a6771fcb7be",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "ca7b383ff3d5118aa15183728084e355619eb28b47d6e60c885a9e5c5af795ba": {
                "Name": "nostalgic_northcutt",
                "EndpointID": "6ec4ae69ba2586ce432471e82dcecc94e598e9f9c18f59ef2b557a317adf4736",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

person Divyang Desai    schedule 15.07.2019    source источник


Ответы (1)


Обычно это происходит потому, что Docker создает собственную внутреннюю сеть для контейнеров, и поэтому два контейнера по умолчанию не видят друг друга. Итак, у вас есть два варианта:

  1. Создайте сеть докеров и подключите два контейнера к этой сети.

Создайте новую сеть:

docker network create <networkName>

Чтобы подключить контейнер к определенной сети, выполните следующие действия:

– Подключиться к сети при запуске контейнера с помощью docker run и флага —network. Что-то вроде этого (обратите внимание на сетевой флаг)

docker run -dit --name <containerName> --network <networkName> <imageName>

– Подключить уже созданный контейнер к сети с помощью

docker network connect <networkName> <containerName>
  1. Используйте docker-compose для настройки обоих образов (это мой предпочтительный вариант). Docker compose автоматически создает сеть и настраивает контейнеры для работы в этой сети.

После того, как вы настроили сеть, вы сможете получить доступ от контейнера к контейнеру, используя containerName:PortNumber

Если контейнеры по-прежнему не могут общаться друг с другом:

– Убедитесь, что они оба действительно находятся в одной сети: запустив docker network inspect

– Проверить, доступен ли другой станок (изнутри контейнера)

ping <dockerContainerName>
ping <dockerContainerIPaddress>

– Проверьте, открыт ли соответствующий порт

nmap -p <portnumber> <dockerContainerIPaddress>
person camba1    schedule 15.07.2019
comment
Спасибо! Я попробую. - person Divyang Desai; 15.07.2019
comment
Создал сеть, но проблема осталась, добавил проверку сети к вопросу. - person Divyang Desai; 16.07.2019
comment
Как вы сейчас пытаетесь соединиться между контейнерами, это должно быть continerName:portNumber. Можете ли вы пропинговать один контейнер изнутри другого контейнера? - person camba1; 16.07.2019
comment
Да, я использую тот же containername:portnumber, но он выдает ошибку Ошибка установки: база данных не существует или у вас нет прав для подключения к ней - person Divyang Desai; 16.07.2019
comment
это странно. Вы можете пропинговать контейнер db из контейнера приложения? Оба контейнера теперь находятся в одной сети и должны иметь возможность общаться друг с другом. - person camba1; 16.07.2019
comment
Я думаю, мне нужно попробовать с docker compose сейчас - person Divyang Desai; 17.07.2019
comment
Да, docker compose имеет больше смысла и является простым способом одновременного запуска нескольких образов! - person Divyang Desai; 18.07.2019
comment
Хотя я не знаю, почему отдельные лица в одной сети не работают. - person Divyang Desai; 18.07.2019