【问题标题】:How to link two containers using docker-compose如何使用 docker-compose 链接两个容器
【发布时间】:2016-03-01 17:10:40
【问题描述】:

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

例如:

#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

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

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

但是,在使用 docker-compose 时,我注意到它在图像名称前添加了 docker_ 前缀,并且还弃用了 link 选项。

问题

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

【问题讨论】:

    标签: java docker docker-compose


    【解决方案1】:

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

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

    compose sn-p 定义了一个 web 容器,它必须链接到 db 和 redis 容器,它还添加了别名为 `database.xml 的 db 容器。

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

    mysql:
      image: my/mysql:latest
      ports:
      - "3306:3306"
    
    tomcat7:
      image: my/tomcat:7.0
      links:
       - mysql
    

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

    【讨论】:

    • 我认为你需要使用build: 配置,而不是image:,除非它是预先构建的
    • 真的!我假设图像将在不同的步骤中构建,因为在原始问题上没有引用它们的 docker 文件(所以看起来两者都在不同的文件夹中,但这并不清楚)。
    • docker build 默认会在构建上下文中获取Dockerfile
    • 我正在阅读docker network。这种情况是否适合使用它?
    【解决方案2】:

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

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

    这个文件也采用这个文件结构

    ├── 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
    

    【讨论】:

    • 如果将test 目录中的mysql 图像转换为test_mysql_1,那么有人将如何处理图像依赖于另一个图像的情况。例如:FROM mycustom/ubuntu。那应该在 docker compose 之外运行吗?
    • 我还没弄明白那个。就个人而言,我在运行 docker-compose up 之前构建了所有基本映像,并为各自的 image:tag 使用 image: 配置(如另一个答案中所述)
    • 这里的hostname:键/值是不必要的,你可以删除它们。
    • 是的,compose 不处理构建图像链的情况,在 compose 之外构建它是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2021-01-26
    • 2020-01-06
    • 2017-09-02
    • 2023-03-09
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多