我基于两个不同的映像创建了两个docker容器,一个是db,另一个是webserver,两个容器都运行在我的mac osx上。
我可以从主机访问数据库容器,同样的方法可以从主机访问Web服务器。
但是,我如何从webserver访问db连接呢?
我启动数据库容器的方法是
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
我将wls容器启动为
docker run --name oracle-wls -p 7001:7001 wls-image:latest
我可以通过连接到来访问主机上的数据库
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
我可以访问主机上的wls
http://localhost:7001/console
8条答案
按热度按时间2exbekwf1#
如果您有两个或多个正在运行的容器,请完成以下步骤:
现在,您可以从web1连接到web2容器,或者相反。
使用可通过运行以下命令找到的内部网络IP地址:
注意,网桥连接的容器只能访问内部IP地址和端口。
例如,假设web1容器以以下内容开始:
docker run -p 80:8888 web1
(意味着其服务器在内部端口8888上运行),并且检查myNetwork
显示web1的IP是172.0.0.2,您可以使用curl 172.0.0.2:8888
从web2连接到web1)。fkvaft9z2#
最简单的方法是使用--link,但是较新版本的Docker正在远离这个开关,事实上这个开关很快就会被删除。
下面的链接也提供了一个很好的连接两个容器的方法。你可以跳过附加部分,因为这只是一个有用的如何向图像添加项目。
https://web.archive.org/web/20160310072132/https://deis.com/blog/2016/connecting-docker-containers-1/
您感兴趣的部分是两个容器之间的通信。最简单的方法是通过名称从Web服务器容器引用DB容器。
示例:
您将数据库容器命名为
db1
,将Web服务器容器命名为web0
。这两个容器都应该位于桥接网络上,这意味着Web容器应该能够通过引用DB容器的名称连接到DB容器。因此,如果您的应用有一个Web配置文件,那么对于DB主机,您将使用名称
db1
。如果你使用的是旧版本的docker,那么你应该使用--link。
示例:
步骤1:
docker run --name db1 oracle/database:12.1.0.2-ee
然后当您启动Web应用程序时。使用:
步骤2:
docker run --name web0 --link db1 webapp/webapp:3.0
而且Web应用程序将链接到DB。不过,正如我所说,--Link开关很快就会被删除。
我会用docker compose来代替,它会为你建立一个网络。你将需要到下载docker compose为你的系统. www.example.comhttps://docs.docker.com/compose/install/#prerequisites
示例设置如下所示:
文件名为
base.yml
这将为网络命名一个通用名称,除非使用--name开关,否则我记不清该名称是什么。
即
docker-compose --name setup1 up base.yml
注意:如果你使用--name开关,你将需要在调用docker compose时使用它,所以
docker-compose --name setup1 down
这是为了让你可以有多个webserver和db的示例,在这种情况下,docker compose知道你想对哪个示例运行命令;这样你就可以同时运行多个测试。如果你在同一台服务器上并行运行测试,这对CI/CD来说非常好。Docker compose也具有与docker相同的命令,因此
docker-compose --name setup1 exec webserver do_some_command
最好的部分是,如果你想改变数据库或类似的东西,为单元测试,你可以包括一个额外的. yml文件,以向上命令,它将覆盖任何项目与类似的名称,我认为这是一个键=〉值替换。
示例:
db.yml
然后调用
docker-compose --name setup1 up base.yml db.yml
这将用不同的设置覆盖db.当需要从每个容器连接到这些服务时,您使用在service下设置的名称,在本例中为webserver和db。
我认为这实际上可能是一个更有用的设置在您的情况下。因为你可以设置所有的变量,你需要在yml文件和只是运行命令docker组成当你需要他们启动。所以一个更多的启动它,忘记它的设置。
注:我没有使用
--port
命令,因为container-〉container通信不需要暴露端口,只有当您希望主机连接到容器或主机外部的应用程序时才需要暴露端口。则端口对主机允许的所有通信开放。因此,在端口80上公开Web与在物理主机上启动Web服务器是一样的,如果主机允许,将允许外部连接。此外,如果您希望同时运行多个Web应用,无论出于何种原因,那么暴露端口80将阻止您运行额外的web应用程序,如果您尝试暴露在该端口上。因此,对于CI/CD,最好根本不暴露端口,并且如果使用带有--name开关的Docker Composer,则所有container将位于它们自己的网络上,这样它们就不会冲突。因此,您将几乎拥有一个container的container。更新:在进一步使用功能并查看其他人如何为Jenkins等CICD程序做这件事之后。网络也是一个可行的解决方案。
示例:
上面的命令将创建一个"test_network",你也可以将它附加到其他容器上,这可以通过
--network
开关操作符来实现。示例:
当然,如果你有代理网络设置,你仍然应该使用"-e"或"--env-file"开关语句将它们传递到容器中,这样容器就可以与互联网通信。然而,我仍然习惯性地传递它们。这是"--link"开关的替代。一旦容器连接到您创建的网络,您仍然可以使用容器的"name"从其他容器引用这些容器。根据上面的示例,这将是
db1
。您只需要确保所有容器连接到同一网络,你就可以走了。有关在cicd管道中使用网络的详细示例,您可以参考以下链接:https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
这是在Jenkins中运行的脚本,用于Moodle的大量集成测试,但这个想法/示例可以在任何地方使用。我希望这对其他人有所帮助。
46scxncf3#
您必须通过主机的ip访问数据库,或者如果您想通过localhost:1521访问数据库,则运行webserver,如-
See here
lvjbypge4#
使用
docker-compose
时,服务在默认情况下按名称相互公开。您还可以指定一个别名,如;
然后使用指定的别名作为主机名访问服务,例如在本例中,
mongo.openconceptlab.org
代表mongo
。w1e3prcc5#
环境:Windows 10,Docker桌面版本4.5.1。
使用hostname
host.docker.internal
从container内部访问主机上运行的服务。参见:www.example.comhttps://docs.docker.com/desktop/windows/networking/#use-cases-and-workarounds
我在一个容器中运行PostgreSQL,在另一个容器中运行我的应用程序。我将应用程序数据库连接配置为使用
host.docker.internal
作为主机名,它就能正常工作。cunj1qz16#
我们在这里创建两个容器PostgreSQL server和pgadmin(用于访问PHPMyAdmin、SQL studio、workbench等服务器)。
暴露端口
1.数据库---〉5436
1.程序管理员---〉5050
在pgadmin主机名中添加服务器localhost后,将显示连接错误。因为Docker容器pgadmin将localhost作为其系统,所以我们需要PostgreSQL IP来解决此问题。
此命令获取连接的容器IP地址和其他详细信息。
现在你可以看到网络检查中显示的IP地址。选择Postgres容器IP。你可以通过这个IP访问其他暴露的端口。这里只暴露了postgres 5432。现在设置hostname作为容器IP,它就可以工作了。
mrfwxfqh7#
您可以使用默认的Docker网络。如果您不想通过任何Docker网络,您可以执行以下操作:
将IP地址复制到Mac Docker首选项中的资源〉网络的Docker子网中:Docker preferences screenshot
正如您可以从屏幕截图链接中看到的,IP地址为
您只需将容器配置文件中的“localhost”替换为“192.168.65.1“(即IP地址选择+1)。
您可以启动您的容器,并且应该为本地开发/测试进行设置。
要了解更多细节,你可以看到我的文章:Connect Docker containers the easy way
eoigrqb68#
在我的例子中,应用程序中的主机连接通过桥提供的IP从另一个容器连接到另一个容器,但没有工作。
但它与容器的名称一起工作(见我的屏幕截图)。
因此,您可以将IP替换为容器的名称。