我基于两个不同的图像创建了两个docker容器.db和另一个用于webserver.两个容器都在我的mac osx上运行.
我可以从主机访问数据库容器,同样可以从主机访问网络服务器.
但是,我如何从网络服务器访问数据库连接?
我启动db容器的方式是
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
Run Code Online (Sandbox Code Playgroud)
我开始使用容器作为
docker run --name oracle-wls -p 7001:7001 wls-image:latest
Run Code Online (Sandbox Code Playgroud)
我可以通过连接访问主机上的数据库
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
Run Code Online (Sandbox Code Playgroud)
我可以在主机上访问wls
http://localhost:7001/console
Run Code Online (Sandbox Code Playgroud)
MxW*_*ild 84
这很简单。如果您有两个或更多正在运行的容器,请完成以下步骤:
docker network create myNetwork
docker network connect myNetwork web1
docker network connect myNetwork web2
Run Code Online (Sandbox Code Playgroud)
现在您从 web1 连接到 web2 容器或相反。
使用可以通过运行找到的内部网络 IP 地址:
docker network inspect myNetwork
Run Code Online (Sandbox Code Playgroud)
请注意,通过网桥连接的容器只能访问内部 IP 地址和端口。
例如,假设 web1 容器的启动是:(docker run -p 80:8888 web1
意味着它的服务器在内部运行在端口 8888 上),并且检查myNetwork
显示 web1 的 IP 是 172.0.0.2,您可以使用从 web2 连接到 web1 curl 172.0.0.2:8888
)。
Cap*_*nis 26
最简单的方法是使用--link,但是较新版本的docker正在远离它,实际上很快就会删除该开关.
在连接两个容器时,下面的链接提供了一个很好的.您可以跳过附加部分,因为这对于向图像添加项目非常有用.
https://deis.com/blog/2016/connecting-docker-containers-1/
您感兴趣的部分是两个容器之间的通信.最简单的方法是从Web服务器容器中按名称引用数据库容器.
例:
您将db容器DB1和Web服务器容器WEB0命名为.容器应该都在桥接网络上,这意味着Web容器应该能够通过引用它的名称连接到DB容器.
因此,如果您的应用程序有Web配置文件,那么对于DB主机,您将使用名称DB1.
如果你使用旧版本的docker,那么你应该使用--link.
例:
步骤1: docker run --name db1 oracle/database:12.1.0.2-ee
然后当你启动网络应用程序.使用:
第2步: docker run --name web0 --link db1 webapp/webapp:3.0
并且Web应用程序将链接到DB.但是,正如我所说--link开关将很快被删除.
我会使用docker compose,它将为你构建一个网络.然而; 你需要为你的系统下载docker compose.https://docs.docker.com/compose/install/#prerequisites
一个示例设置是这样的:
文件名是 base.yml
version: "2"
services:
webserver:
image: "moodlehq/moodle-php-apache:7.1
depends_on:
- db
volumes:
- "/var/www/html:/var/www/html"
- "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
environment:
MOODLE_DOCKER_DBTYPE: pgsql
MOODLE_DOCKER_DBNAME: moodle
MOODLE_DOCKER_DBUSER: moodle
MOODLE_DOCKER_DBPASS: "m@0dl3ing"
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
db:
image: postgres:9
environment:
POSTGRES_USER: moodle
POSTGRES_PASSWORD: "m@0dl3ing"
POSTGRES_DB: moodle
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
Run Code Online (Sandbox Code Playgroud)
这会将网络命名为通用名称,我不记得我的名字是什么,除非你使用--name开关.
IE 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
最好的部分是,如果你想更改db或类似的单元测试,你可以在up命令中包含一个额外的.yml文件,它将覆盖任何具有相似名称的项目,我认为它是一个键=>值替换.
例:
db.yml
version: "2"
services:
webserver:
environment:
MOODLE_DOCKER_DBTYPE: oci
MOODLE_DOCKER_DBNAME: XE
db:
image: moodlehq/moodle-db-oracle
Run Code Online (Sandbox Code Playgroud)
然后打电话 docker-compose --name setup1 up base.yml db.yml
这将覆盖db.使用不同的设置.当需要从每个容器连接到这些服务时,您使用service下的名称set,在本例中为webserver和db.
我认为这可能实际上是一个更有用的设置.因为您可以在yml文件中设置所需的所有变量,并在需要启动时运行docker compose命令.所以更多的启动它并忘记它的设置.
注意:我没有使用该--port
命令,因为容器 - >容器通信不需要暴露端口.仅当您希望主机连接到容器或来自主机外部的应用程序时才需要它.如果公开端口,则端口对主机允许的所有通信开放.因此,在端口80上公开Web与在物理主机上启动Web服务器相同,并且如果主机允许,则允许外部连接.此外,如果您想要同时运行多个Web应用程序,无论出于何种原因,如果您尝试在该端口上进行公开,那么暴露端口80将阻止您运行其他Web应用程序.因此,对于CI/CD,最好不要公开端口,如果使用docker compose和--name开关,所有容器都将在他们自己的网络上,因此它们不会发生冲突.所以你几乎有一个容器容器.
Kar*_*nga 19
使用docker-compose
,服务默认通过名称相互公开。文档。
您还可以指定一个别名;
version: '2.1'
services:
mongo:
image: mongo:3.2.11
redis:
image: redis:3.2.10
api:
image: some-image
depends_on:
- mongo
- solr
links:
- "mongo:mongo.openconceptlab.org"
- "solr:solr.openconceptlab.org"
- "some-service:some-alias"
Run Code Online (Sandbox Code Playgroud)
然后使用指定的别名作为主机名称,例如访问服务mongo.openconceptlab.org
对于mongo
在这种情况下。
Sho*_*orn 17
环境:Windows 10,Docker Desktop 版本 4.5.1。
使用主机名host.docker.internal
从容器内部访问主机上运行的服务。
请参阅:https ://docs.docker.com/desktop/windows/networking/#use-cases-and-workarounds
我在一个容器中运行 PostgreSQL,在另一个容器中运行我的应用程序。我将应用程序数据库连接配置为用作host.docker.internal
主机名,它就可以工作。
笔记:
host.docker.internal
,您正在访问“主机”,因此您想要使用发布容器的端口host.docker.internal
主机名不起作用。在 Linux 上,您需要添加--add-host=host.docker.internal:host-gateway
到run
尝试解析host.docker.internal
.您必须通过主机的ip访问db,或者如果您想通过localhost:1521访问它,那么运行webserver就像 -
docker run --net=host --name oracle-wls wls-image:latest
Run Code Online (Sandbox Code Playgroud)
考虑示例 我们在这里创建两个容器 PostgreSQL 服务器和pgadmin(用于访问 PHPMyAdmin、SQL studio、workbench 等服务器)。
暴露端口
在 pgadmin 主机名中添加服务器作为localhost后,它将显示连接错误。因为 Docker 容器 pgadmin 将 localhost 作为其系统,所以我们需要 PostgreSQL IP 来解决问题。
docker network create con
docker network connect con app1
docker network connect con app2
Run Code Online (Sandbox Code Playgroud)
此命令获取连接的容器 IP 地址和其他详细信息。
docker network inspect con
Run Code Online (Sandbox Code Playgroud)
现在您可以看到网络检查中显示的 IP 地址。选择 Postgres 容器 IP。您可以通过该IP访问其他暴露的端口。这里只暴露了postgre 5432。现在将hostname设置为容器ip即可工作。
归档时间: |
|
查看次数: |
30397 次 |
最近记录: |