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

时间:2018-04-12 21:29:56

标签: 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地址时,唯一有效的是,我不想这样做。那么,在这些容器之间创建通信的好方法是什么?

3 个答案:

答案 0 :(得分:2)

mysql正在容器中运行,所以你应该在这里考虑两件事:

  1. 如果mysql在容器中运行,那么您需要将应用程序容器链接到mysql容器。这将允许他们交谈 彼此使用docker的inter container通信。容器使用主机名相互通信以解析其各自的内部IP地址。请参阅我的回答,稍后我将向您展示如何使用撰写文件让两个容器相互通信。

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

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

    仅使用没有撰写的docker的容器通信:

    你有容器" app"和" mysql",您希望能够访问" app"在localhost上你想要" app"能够连接到mysql。你打算怎么做? 1.您需要公开容器的端口" app"所以我们可以在localhost上访问它。 docker容器有自己的内部网络,除非你用docker暴露一些端口,否则它对你关闭。

    1. 您需要链接" mysql"容器到" app"没有暴露" mysql"通往世界其他地方的港口。
    2. 此配置应该适用于您想要实现的目标:

          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之前先运行它:

      $ docker-compose down
      

      如果有帮助,请告诉我。

答案 1 :(得分:1)

过去,我在没有在Docker Compose中明确设置主机网络部分的情况下开始工作。因为Docker images inside a Docker Compose File are put into a Docker Network with each other,你真的不应该做任何事情才能使它工作:默认情况下,你应该能够附加到Spring应用程序的容器中,并能够ping mysql和让它成功。

答案 2 :(得分:0)

数据库主机应为localhost127.0.0.1