当前位置: 首页 > 面试题库 >

从另一个容器访问Docker容器

毋修为
2023-03-14
问题内容

我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。

我可以从主机访问数据库容器,也可以从主机访问Web服务器。

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

我启动数据库容器的方式是

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

问题答案:

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

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

https://deis.com/blog/2016/connecting-docker-
containers-1/

您感兴趣的部分是两个容器之间的通信。最简单的方法是通过Web服务器容器中的名称引用数据库容器。

例:

您将数据库容器DB1和Web服务器容器WEB0命名为。容器都应该在网桥网络上,这意味着Web容器应该能够通过引用其名称连接到DB容器。

因此,如果您有用于应用程序的Web配置文件,则对于数据库主机,您将使用名称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应用将链接到数据库。但是,正如我所说的–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开关,则在html" target="_blank">调用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

最好的部分是,如果您想更改数据库或类似的内容进行单元测试,则可以在up命令中包含一个附加的.yml文件,它将覆盖具有相似名称的所有项目,我认为它是键=>值替换。

例:

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,最好根本不公开端口,如果将docker compose与–
name开关配合使用,则所有容器都将位于其自己的网络上,因此它们不会冲突。因此,您几乎会有一个容器容器。

更新:在进一步使用功能并了解其他人如何对诸如詹金斯(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”开关语句将这些设置传递到容器中。因此,容器可以与Internet通信。Docker表示代理设置应由较新版本的Docker容器吸收;但是,我还是把它们当作习惯来传递。这是即将消失的“
–link”开关的替代品。将容器连接到您创建的网络后,您仍然可以使用容器的“名称”引用其他容器中的那些容器。根据上面的示例,它将是DB1。您只需要确保所有容器都连接到同一网络,就可以了。

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

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



 类似资料:
  • 我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为

  • 问题内容: 我正在尝试为将我的应用程序容器连接到postgres容器提供一个便携式解决方案。“便携式”是指我可以给用户两个命令,每个容器一个,它们将始终协同工作。 我的本地PC上运行着一个postgres docker容器,我这样运行它, 我可以使用address从python flask应用程序访问它。 我也将python应用程序也放置在docker容器中,但无法连接到postgres容器。 地

  • 我正在尝试以下操作: 在一个带有暴露端口的容器中旋转MySQL 5.5,例如4200。 在一个带有暴露端口的容器中旋转MySQL 5.7,例如4300。 旋转golang容器以运行我的应用程序。 我的想法是我需要我的测试在不同的数据库版本上运行。 为此,我需要能够与golang容器中的每个sql容器进行对话。 我试过的: 方法1-使用--link: GO LANG应用程序容器 方法2-使用--ne

  • 我有两个Docker容器在同一个网络中运行,我希望其中一个通过spring Webclient调用另一个。我确信他们都在同一个网络中- “finishConnect(…)失败:连接被拒绝:附件加载程序秒/172.21.0.5:80;嵌套异常为io。内蒂。频道AbstractChannel$AnnotatedConnect异常:finishConnect(…)失败:连接被拒绝:附件加载程序秒/172

  • 问题内容: 目前,我在需要连接到camunda的docker容器内运行一个node.js应用程序,该容器在另一个容器中运行。 我使用以下命令启动容器 这两个应用程序现在都在运行,我可以通过在端口8000上导航到主机的IP来访问camunda,运行wget 还会返回camunda页面。使用和键入我的应用程序容器时,我无法访问camunda。相反,我得到以下错误: 当我使用将我的应用程序容器链接到ca

  • 在页面存储Python Flask微服务中,我尝试使用主机名master-db访问MySQL数据库,但该名称无法解析。