Я работаю над Vagrant и пытаюсь создать трехуровневое веб-приложение, я устанавливаю 3 Centos на Vagrant, используя тот же бродячий файл.
У каждого Centos есть докер, у 1 Centos есть база данных, у 2 Centos есть сервер php apache, у 3 Centos есть php apache и код на стороне клиента для отображения результата.
Все три синхронизируются и работают нормально, но когда я создал док-контейнер для первой базы данных MYSQL, я смог подключить его локально на той же виртуальной машине, но не могу подключиться через вторую виртуальную машину с apache и PHP.
Может кто-нибудь помочь мне?
Также я должен протестировать это трехуровневое веб-приложение на Docker compose.
Как мне это сделать? Должен ли я запускать все 3 на разных виртуальных машинах?






В этой конфигурации, как вы ее описали, большая часть конфигурации идентична той, которую вы настроили бы без Docker. (И в этом нет ничего плохого!) Обязательно:
Для каждой контейнерной службы запустите ее с опцией -p, чтобы опубликовать некоторый порт из пространства Docker; например, служба MySQL, которую вы бы запустили с docker run -p 3306:3306 ... mysql:5.7.
Для подключения между службами подключитесь к IP-адресу виртуальной машины, на которой размещена служба, и опубликованному номеру порта (первый номер после параметра -p). (Система обнаружения служб, такая как Консул, может помочь вспомнить, какая служба находится на какой виртуальной машине.)
Вы не можете использовать Docker Compose с этой настройкой, помимо того, что это, возможно, более удобный способ записи параметров запуска каждой отдельной службы.
Если для вас важно использовать Docker Compose или другой собственный инструментарий Docker, вам придется запустить его не более чем на одной виртуальной машине. (Если у вас есть хост Linux, вам вообще не нужна виртуальная машина; MacOS и некоторые установки Windows имеют настольные приложения, которые могут довольно хорошо скрыть виртуальную машину.) Поскольку контейнер Docker имеет некоторое сходство с виртуальной машиной (например, изолированная файловая система). ) более ориентированные на разработчиков настройки, как правило, полностью избегают виртуальных машин и, похоже, не часто задействуют Vagrant. То, что вы описываете здесь, является совершенно хорошей архитектурой развертывания, но это то, что вы настроили бы со стеком Packer/Ansible с Docker в качестве детали реализации, а не с Docker в первую очередь.
также я использовал эту команду docker run -d -p 3306:3306 --name dmysql -e MYSQL_ROOT_HOST=% MYSQL_ROOT_PASSWORD=vagrant my-mysql здесь my-mysql - это мой образ mysql-сервера, который строится с базой данных и скриптом для таблиц , я могу получить доступ к этой таблице в контейнере на том же CentOS, но не могу подключиться к ней удаленно из 2-го Centos
все еще я не могу подключиться к базе данных, я пробовал оба IP-адреса, 192.168.10.87 это IP-адрес Centos, я не могу подключиться к mariadb, используя это, но 172.17.0.2 это IP-адрес докера для сервера mysql, оба эти IP-адреса не подключают меня к mysql док-контейнер
IP-адреса docker inspect часто бесполезны, и вам, вероятно, никогда не следует их искать. В вашем примере одна виртуальная машина не может получить доступ к внутренним IP-адресам Docker на другой виртуальной машине (и, вероятно, даже использует те же IP-адреса для своих собственных контейнеров).
Хорошо, Дэвид Мейз, я даже не могу пропинговать этот IP-адрес докера, поэтому я знаю, что он не работает.
хорошо, спасибо, все готово, я использовал свой IP-адрес Centos для подключения, моя ошибка заключалась в том, что я забыл указать порт в Dockerfile,
это задание для меня, поэтому я должен сделать это таким образом.