docker - 从一个 Docker 容器连接到另一个 Docker 容器

标签 docker spring-boot docker-compose

我正在 Docker 容器内运行一个 Java 应用程序,该容器应该连接另一个容器内的 MySQL。尝试了表格中建议的多种选项,但没有任何效果。这是我的 Docker Compose 文件:

version: "3"
services:

  app:
    build:
      context: ./
      dockerfile: /src/main/docker/Dockerfile
    image: app1
    environment:
      - DB_HOST=Imrans-MacBook-Pro.local
      - DB_PORT=3306
    ports:
      - 8080:8080
    networks:
      - backend
    depends_on:
      - mysql



  mysql:
    image: mysql:5.7.20
    hostname: mysql
    environment:
      - MYSQL_USER=root
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=app1
    ports:
      - 3306:3306
    command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8 --explicit_defaults_for_timestamp
    networks:
      - backend

networks:
  backend:
    driver: bridge

其中DB_HOST=Imrans-MacBook-Pro.local是我笔记本电脑的名称。这不起作用。有人建议可以使用容器名称,因此尝试了DB_HOST= mysql,但从未成功。

当我传递笔记本电脑的IP地址时,唯一的事情有时会起作用,但这不是我想做的。那么,在这些容器之间创建通信的好方法是什么?

最佳答案

mysql 在容器中运行,因此这里应该考虑两件事:

  1. 如果 mysql 正在容器中运行,那么您需要将应用程序容器链接到 mysql 容器。这将使他们能够与 彼此使用docker的容器间通信。容器使用主机名相互通信来解析各自的内部 IP 地址。请参阅我的回答后面的部分,我将向您展示如何使用 compose 文件让两个容器相互通信。

  2. mysql 容器应使用 docker 卷来存储数据库。这将允许您将数据库和相关文件存储在主机(运行容器的服务器或计算机)的文件系统上。然后,docker 卷将作为目录安装在容器中。因此,容器现在可以读取和写入运行 docker 容器的计算机上的目录。这意味着即使容器全部被删除或删除,您仍然可以保留数据库数据。这是一篇关于 docker 卷以及将它们与 MySQL 一起使用的优秀初学者友好文章:

https://severalnines.com/blog/mysql-docker-containers-understanding-basics

仅使用 docker 而不使用 compose 进行容器通信:

您有容器“app”和“mysql”,您希望能够访问本地主机上的“app”,并且希望“app”能够连接到 mysql。你要怎么做? 1.您需要为容器“app”公开一个端口,以便我们可以在本地主机上访问它。 docker 容器有自己的内部网络,除非您使用 docker 公开某些端口,否则它对您关闭。

  • 您需要将“mysql”容器链接到“app”,而不会将“mysql”的端口暴露给世界其他地方。
  • 此配置应该适用于您想要实现的目标:

        version: "2"
        services:
    
          app:
            build:
              context: ./
              dockerfile: /src/main/docker/Dockerfile
            image: app1:latest
            links:
              - mysql
            environment:
              - DB_HOST=mysql
              # This is the hostname that app will reach the mysql container on.
              # If you do with app container:
              # docker exec -it <app container id> bash
              # # apt-get update -y && apt-get install iputils-ping -y
              #
              # Then you should be able to ping mysql container with:
              #
              # # ping -c 2 mysql
              - DB_PORT=3306
            ports:
              - 8080:8080
              # You will access "app" on localhost:8080 in your browser. If this is running on your own machine.
    
    
    
          mysql: #hostname actually gets set here so no need to set it later
            image: mysql:5.7.20
            environment:
              - MYSQL_USER=root
              - MYSQL_ALLOW_EMPTY_PASSWORD=yes
              - MYSQL_DATABASE=app1
              # Remember to use a volume if you would like this container's data to persist or if you would like
              # to restore a database backup.
            command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8 --explicit_defaults_for_timestamp
    

    现在您可以通过以下方式启动它:

    $ docker-compose up
    

    如果您之前运行过此命令,请确保在运行 docker-compose up 之前先运行此命令:

    $ docker-compose down
    

    请告诉我这是否有帮助。

    关于docker - 从一个 Docker 容器连接到另一个 Docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49806177/

    相关文章:

    spring - 如何在 JPA 中生成自定义 Id

    java - 针对未经身份验证的用户的 Spring Security 404 页面

    Java jhipster 将应用程序日志写入日志屏幕

    mysql - 如何使用 Docker compose 修复“"Table ' Performance_schema.session_variables”不存在”?

    docker - 由于 postgis 端口问题,连接到 docker 容器失败

    c++ - Visual Studio Code - 远程调试 Bazel C++ - 无法读取文件'vscode-remote ://dev- file

    docker - 从已经运行的Docker容器中保存工件

    nginx - Docker - 我如何重新启动 nginx 以应用自定义配置?

    bash - 如何在 docker 容器中生成核心文件?

    linux - 如何获取 Docker 中依赖的子镜像列表?