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