java 如何使用 docker-compose 链接两个容器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35729083/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 00:31:15  来源:igfitidea点击:

How to link two containers using docker-compose

javadockerdocker-compose

提问by Omnipresent

At the moment I have two containers which I build from an image and then link the two:

目前我有两个容器,我从一个图像构建,然后将两者链接起来:

For example:

例如:

#mysql
docker build -t my/mysql docker-mysql
docker run -p 3306:3306 --name mysql -d my/mysql:latest

#webapp
docker build -t my/tomcat:7.0 tomcat/7.0
docker run -d --link mysql --name tomcat7 my/tomcat:7.0

Since I'm linking the webappcontainer with mysqlcontainer, the webappcontainer gets a MYSQL_PORT_3306_TCP_ADDRenvironment variable created. I use this environment variable to then connect to the mysql database in my jdbcstring.

由于我将webapp容器与mysql容器链接,因此webapp容器会MYSQL_PORT_3306_TCP_ADDR创建一个环境变量。我使用这个环境变量然后连接到我的jdbc字符串中的 mysql 数据库。

All of this works fine but now I'd like to use docker-composeso that everything can be built and ran from one command.

所有这些都工作正常,但现在我想使用它,docker-compose以便可以从一个命令构建和运行所有内容。

However, while playing with docker-compose I'm noticing that it prefixes docker_to the image name and furthermore deprecates the linkoption.

但是,在使用 docker-compose 时,我注意到它docker_作为图像名称的前缀,并且进一步弃用了该link选项。

Question

问题

How would the above build/run commands translate to docker-compose yml file such that the webapp container can connect to the mysql container for jdbc.

上面的构建/运行命令如何转换为 docker-compose yml 文件,以便 webapp 容器可以连接到 jdbc 的 mysql 容器。

回答by Augusto

You need to add an aliasattribute in the compose yml. The following is taken from the docs the docsand is a very short example

您需要alias在 compose yml 中添加一个属性。以下内容取自 docs the docs,是一个非常简短的示例

web:
  links:
   - db
   - db:database
   - redis

That compose snippet defines a webcontainer which has to be linked to the db and redis containers and it also adds the dbcontainer with the alias `database.

该 compose 代码段定义了一个web容器,该容器必须链接到 db 和 redis 容器,并且它还添加db了别名为“database”的容器。

In you case, I think the yml for the tomcat container would look something like this

在你的情况下,我认为 tomcat 容器的 yml 看起来像这样

mysql:
  image: my/mysql:latest
  ports:
  - "3306:3306"

tomcat7:
  image: my/tomcat:7.0
  links:
   - mysql

Bear in mind that the tomcat container is not exposing any ports!

请记住,tomcat 容器不会暴露任何端口!

回答by OneCricketeer

Here is a rough translation to a docker-compose.

这是对 docker-compose 的粗略翻译。

Note that docker-compose tags it's own images, so say you made a mysqlimage in a directory named test, then the container name would turn into test_mysql_1. The 1 is appended on the end because you can scale up multiple containers using docker-compose.

请注意,docker-compose 标记了它自己的图像,因此假设您mysql在名为 的目录中制作了一个图像test,那么容器名称将变为test_mysql_1. 将 1 附加到末尾是因为您可以使用 docker-compose 扩展多个容器。

This file also assumes this file-structure

此文件也采用此文件结构

├── docker-mysql
│?? └── Dockerfile
├── tomcat
│?? └── 7.0
│    ?? └── Dockerfile
└── docker-compose.yml


version: '2'
services:
    mysql:
        build:
            context: "./docker-mysql"
        hostname: mysql
        ports:
            - "3306:3306"
    webapp:
        build:
            context: "./tomcat/7.0"
        hostname: tomcat7
        links:
            - mysql