我在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地址时,唯一有效的是,我不想这样做。那么,在这些容器之间创建通信的好方法是什么?
答案 0 :(得分:2)
mysql正在容器中运行,所以你应该在这里考虑两件事:
如果mysql在容器中运行,那么您需要将应用程序容器链接到mysql容器。这将允许他们交谈 彼此使用docker的inter container通信。容器使用主机名相互通信以解析其各自的内部IP地址。请参阅我的回答,稍后我将向您展示如何使用撰写文件让两个容器相互通信。
mysql容器应该使用docker卷来存储数据库。这将允许您将数据库和相关文件存储在主机(运行容器的服务器或计算机)的文件系统上。然后,docker卷将作为目录安装在容器中。因此,容器现在可以读取和写入运行docker容器的机器上的目录。这意味着即使容器全部被删除或删除,您仍然会保留数据库数据。这是一篇关于docker卷的初学友好文章,并将它们与MySQL一起使用:
https://severalnines.com/blog/mysql-docker-containers-understanding-basics
你有容器" app"和" mysql",您希望能够访问" app"在localhost上你想要" app"能够连接到mysql。你打算怎么做? 1.您需要公开容器的端口" app"所以我们可以在localhost上访问它。 docker容器有自己的内部网络,除非你用docker暴露一些端口,否则它对你关闭。
此配置应该适用于您想要实现的目标:
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)
数据库主机应为localhost
或127.0.0.1