从另一个容器访问 docker 容器

新手上路,请多包涵

我基于两个不同的图像创建了两个 docker 容器。一个 db 和另一个用于网络服务器。两个容器都在我的 mac osx 上运行。

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

但是,如何从网络服务器访问数据库连接?

我启动 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

原文由 Vik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 567
2 个回答

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

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

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

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

例子:

您将数据库容器命名为 db1 和网络服务器容器 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

并且网络应用程序将链接到数据库。但是,正如我所说,–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}"

这会将网络命名为通用名称,除非您使用 –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 文件,它会覆盖任何具有相似名称的项目,我认为它是一个 key=>value 替换.

例子:

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 compose 命令。所以更多的开始它并忘记它的设置。

注意:我没有使用 --port 命令,因为容器->容器通信不需要公开端口。仅当您希望主机连接到容器或主机外部的应用程序时才需要它。如果您公开端口,则该端口对主机允许的所有通信都是开放的。因此,在端口 80 上公开 Web 与在物理主机上启动 Web 服务器相同,并且如果主机允许,将允许外部连接。此外,如果您想同时运行多个 Web 应用程序,无论出于何种原因,如果您也尝试在该端口上暴露,那么暴露端口 80 将阻止您运行其他 Web 应用程序。因此,对于 CI/CD,最好根本不公开端口,如果使用带有 –name 开关的 docker compose,所有容器都将位于它们自己的网络上,因此它们不会发生冲突。所以你几乎会有一个容器容器。

更新:在进一步使用功能并查看其他人如何为 Jenkins 等 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”开关语句将它们传递到容器中。所以容器可以与互联网通信。 Docker 说代理设置应该被新版本的 docker 中的容器吸收;但是,我仍然将它们作为一种习惯行为传递。这是即将消失的“–link”开关的替代品。将容器连接到您创建的网络后,您仍然可以使用容器的“名称”从其他容器中引用这些容器。根据上面的示例,这将是 db1 。你只需要确保所有容器都连接到同一个网络,你就可以开始了。

有关在 cicd 管道中使用网络的详细示例,您可以参考此链接: https ://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh

这是在 Jenkins 中运行的用于 Moodle 的大型集成测试的脚本,但这个想法/示例可以在任何地方使用。我希望这对其他人有帮助。

原文由 Caperneoignis 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 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。

原文由 MxWild 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题