从另一个容器访问docker容器

时间:2017-02-22 08:13:27

标签: docker

我基于两个不同的图像创建了两个docker容器。 db和另一个用于webserver。两个容器都在我的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

4 个答案:

答案 0 :(得分:19)

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

以下链接提供了一个很好的连接两个容器。您可以跳过附加部分,因为这对于向图像添加项目非常有用。

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

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

示例:

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

因此,如果您的应用程序有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的实例,并且在这里case,所以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

然后拨打docker-compose --name setup1 up base.yml db.yml

这将覆盖数据库。使用不同的设置。当需要从每个容器连接到这些服务时,您使用service下的名称set,在本例中为webserver和db。

我认为这可能实际上是一个更有用的设置。因为您可以在yml文件中设置所需的所有变量,并在需要启动时运行docker compose命令。所以更多的启动它并忘记它的设置。

注意:我没有使用--port命令,因为容器 - >容器通信不需要暴露端口。仅当您希望主机连接到容器或来自主机外部的应用程序时才需要它。如果公开端口,则端口对主机允许的所有通信开放。因此,在端口80上公开Web与在物理主机上启动Web服务器相同,并且如果主机允许,则允许外部连接。此外,如果您想要同时运行多个Web应用程序,无论出于何种原因,如果您尝试在该端口上进行公开,那么暴露端口80将阻止您运行其他Web应用程序。因此,对于CI / CD,最好不要公开端口,如果使用docker compose和--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"切换声明。因此容器可以与互联网通信。 Docker说代理设置应该被较新版本的docker中的容器吸收;但是,我仍然把它们作为一种习惯传递给我们。这是" - 链接"的替代品。开关即将消失。将容器连接到您创建的网络后,您仍然可以使用'名称'来引用其他容器中的容器。容器。根据上面的例子,它将是DB1。您只需确保所有容器都连接到同一网络,您就可以开始使用了。

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

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

答案 1 :(得分:6)

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

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

See here

答案 2 :(得分:4)

使用docker-compose,默认情况下,服务通过名称公开。 Docs
您也可以指定一个别名;

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"

然后使用指定的别名作为主机名访问服务,例如mongo.openconceptlab.org代表mongo

答案 3 :(得分:1)

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

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

现在,您连接了web1和web2容器。要检查此运行:

docker network inspect myNetwork
相关问题