从另一个容器访问一个码头容器

我根据两个不同的图像创建了两个码头容器。一个是 db,另一个是 webserver。两个集装箱都在我的 mac osx 上运行。

我可以访问数据库容器从主机和同样的方式可以访问网络服务器从主机。

但是,如何从 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
216786 次浏览

您必须通过主机的 ip 访问数据库,或者如果您想通过 localhost: 1521访问数据库,那么运行 webserver 就像-

docker run --net=host --name oracle-wls wls-image:latest

看这里

最简单的方法是使用—— link,但是新版本的 docker 正在远离这一点,事实上这个开关很快就会被移除。

下面的链接提供了一个很好的如何连接两个容器。您可以跳过附加部分,因为这只是一个有用的如何添加项目到图像。

Https://web.archive.org/web/20160310072132/https://deis.com/blog/2016/connecting-docker-containers-1/

您感兴趣的部分是两个容器之间的通信。最简单的方法是从 webserver 容器中按名称引用 DB 容器。

例如:

您将 db 容器命名为 db1,将 webserver 容器命名为 web0。这两个容器都应该位于网桥网络上,这意味着 Web 容器应该能够通过引用数据库容器的名称来连接到数据库容器。

因此,如果你有一个网络配置文件为您的应用程序,然后为数据库主机,你将使用名称 db1

如果您使用的是旧版本的 docker,那么您应该使用—— link。

例如:

第一步: docker run --name db1 oracle/database:12.1.0.2-ee

然后当你启动 web 应用程序时,使用:

第二步: docker run --name web0 --link db1 webapp/webapp:3.0

网络应用程序会链接到数据库。但是,正如我所说的—— link 开关将很快被移除。

我会用 docker Comose 代替,它会为你建立一个网络。但是,您需要为您的系统下载 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}"

这会给网络起一个通用的名字,我一下子想不起来这个名字是什么,除非你使用—— name 开关。

IE docker-compose --name setup1 up base.yml

注意: 如果你使用—— name 开关,你需要在调用 docker compose 的时候使用它,所以 docker-compose --name setup1 down是这样你可以有多个 webserver 和 db 的实例,在这种情况下,docker compose 知道你想对哪个实例运行命令,也可以同时运行多个实例。非常适合 CI/CD,如果您在同一台服务器上并行运行测试。

Docker Comose 也具有与 Docker 相同的命令,因此 docker-compose --name setup1 exec webserver do_some_command

最好的部分是,如果你想改变数据库或类似的东西为单元测试,你可以包括一个额外的。将 yml 文件转换为 up 命令,它将覆盖任何具有相似名称的项,我认为它是键 = > 值替换。

例如:

db.yml

version: "2"
services:
webserver:
environment:
MOODLE_DOCKER_DBTYPE: oci
MOODLE_DOCKER_DBNAME: XE
db:
image: moodlehq/moodle-db-oracle

那就打电话给 docker-compose --name setup1 up base.yml db.yml

这会覆盖数据库。用不同的方法。当需要从每个容器连接到这些服务时,使用服务下的名称集,在本例中为 webserver 和 db。

我觉得这对你的案子更有帮助。因为您可以在 yml 文件中设置所有需要的变量,只需运行 docker 命令即可在需要它们启动时组合。所以一个更多的开始和忘记它设置。

注意: 我没有使用 --port命令,因为容器-> 容器通信不需要暴露端口。仅当您希望主机从主机外部连接到容器或应用程序时,才需要它。如果您公开该端口,那么该端口将向主机允许的所有通信打开。所以在端口80上暴露 web 与在物理主机上启动 webserver 是一样的,如果主机允许的话,它将允许外部连接。另外,如果你想同时运行多个 web 应用,不管出于什么原因,那么如果你也尝试在端口上暴露,那么暴露80端口将阻止你运行额外的 web 应用。因此,对于 CI/CD,最好不要公开端口,如果使用 docker 和—— name 开关组合,则所有容器都位于它们自己的网络上,因此它们不会发生冲突。所以你会有一个集装箱。

更新: 进一步使用功能后,看看其他人是如何为 CICD 程序做到这一点,如詹金斯。网络也是一个可行的解决方案。

例如:

docker network create test_network

上面的命令将创建一个“ test _ network”,您也可以附加其他容器。这是与 --network开关操作员很容易。

例如:

docker run \
--detach \
--name db1 \
--network test_network \
-e MYSQL_ROOT_PASSWORD="${DBPASS}" \
-e MYSQL_DATABASE="${DBNAME}" \
-e MYSQL_USER="${DBUSER}" \
-e MYSQL_PASSWORD="${DBPASS}" \
--tmpfs /var/lib/mysql:rw \
mysql:5

当然,如果您有代理网络设置,您仍然应该使用“-e”或“—— env-file”switch 语句将这些设置传递到容器中。这样容器就可以与互联网进行通信。Docker 说代理设置应该被新版本的 Docker 中的容器吸收; 但是,我仍然习惯性地把它们传递进来。这是“—— link”开关的替代品。一旦容器连接到您创建的网络,您仍然可以使用容器的“名称”从其他容器引用这些容器。根据上面的例子,应该是 db1。您只需要确保所有容器都连接到同一个网络,然后就可以开始了。

有关在 cicd 管道中使用网络的详细示例,请参阅以下连结: Https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh

这是詹金斯在 Moodle 进行大型集成测试时运行的脚本,但是这个想法/示例可以在任何地方使用。我希望这能帮到其他人。

通过使用 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"

然后使用指定的别名作为主机名访问服务,例如在本例中 mongomongo.openconceptlab.org

很简单。 如果您有两个或更多运行中的容器,请完成下列步骤:

docker network create myNetwork
docker network connect myNetwork web1
docker network connect myNetwork web2

现在您可以从 web1连接到 web2容器,或者反过来连接。

使用内部网络 IP 地址,你可以通过运行:

docker network inspect myNetwork

请注意,通过网桥连接的容器只能访问内部 IP 地址和端口。

例如,假设 web1容器以: docker run -p 80:8888 web1(意味着它的服务器在内部端口8888上运行)启动,检查 myNetwork显示 web1的 IP 是172.0.0.2,您可以使用 curl 172.0.0.2:8888从 web2连接到 web1)。

可以使用默认的 Docker 网络。如果你不想通过任何码头网络,你可以这样做:

在参考资料 > 网络中的 Docker 子网中复制 IP 地址在 Mac 中的 Docker 首选项中: 码头首选项截图

正如你可以看到从屏幕截图链接的 IP 地址是

192.168.65.0

您只需要将容器配置文件中的“ localhost”替换为“192.168.65.1”(即 IP 地址选择 + 1)。

您可以启动容器,并且应该为本地开发/测试设置容器。

有关更多细节,请参阅我的文章: 以简单的方式连接 Docker 容器

考虑例子 我们在这里创建两个容器 PostgreSQL 服务器Pgadmin(用于访问 PHPMyAdmin、 SQL Studio 和 workbench 等服务器)。

enter image description here

暴露的港口

  1. PostgreSql ——-> 5436
  2. Pgadmin-> 5050

在 pgadmin 主机名中添加一个服务器作为 本地主机. 之后,将显示一个连接错误。因为 Docker 容器 pgadmin 将本地主机作为它们的系统,所以我们需要 PostgreSQL IP 来解决这个问题。

enter image description here

docker network create con
docker network connect con app1
docker network connect con app2

enter image description here

此命令获取连接的容器 IP 地址和其他详细信息。

docker network inspect con

enter image description here

现在您可以在网络检查中看到显示的 IP 地址。选择 Postgres 容器 IP。您可以通过此 IP 访问其他公开端口。在这里,Postgre 5432只是暴露在。现在将 hostname 设置为容器 ip,它就可以工作了。

环境: Windows 10,Docker 桌面版本4.5.1。

使用主机名 host.docker.internal从容器内访问在主机上运行的服务。

见: https://docs.docker.com/desktop/windows/networking/#use-cases-and-workarounds

我在一个容器中运行 PostgreSQL,在另一个容器中运行我的应用程序。 我将应用程序数据库连接配置为使用 host.docker.internal作为主机名,这样就可以工作了。

在我的例子中,应用程序中通过网桥提供的 IP 从另一个容器连接到容器的主机连接不起作用。

但是它与容器的名称一起工作(见我的屏幕截图)。

因此,您可以用容器的名称替换 IP。

enter image description here