通过docker-compose.yml
我可以运行该应用程序。现在我们要将应用程序移动到生产环境,但我们不想使用容器数据库。那么有什么方法可以使用docker-compose
?
我的docker-compose.yml看起来像:
version: '3'
services:
web-app:
build:
context: .
dockerfile: web-app/Dockerfile
ports:
- 8080:8080
links:
- app-db
app-db:
build:
context: .
dockerfile: app-db/Dockerfile
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=Optimize
ports:
- 3306:3306
而不是app-db
部分我只想连接到我本地托管的mysql
数据库。
答案 0 :(得分:23)
只需使用host.docker.internal
而不是localhost
。
答案 1 :(得分:21)
在docker网络中找到主机ip。如果您使用docker-compose.yml exit_group
,则可能是IP:version: "3"
,但确认搜索" Gateway&#34 ;你的容器(你的主人):
172.18.0.1
因此在你的docker应用程序中指向MySQL:docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.18.0.1",
"IPv6Gateway": "",
(可能在配置文件中)。考虑到只要docker网络仍然相同(通过docker-compose创建网络,并且除非你172.18.0.1:3306
除去它),IP就是固定的。
另外,检查您的MySQL是否正在侦听其所有接口。在docker-compose down
搜索my.cnf
应该是bind-address
的情况下(如果您的服务器具有公共IP,请考虑安全问题)。
作为替代方案,您可以为容器带来与主机相同的网络,以便共享localhost,因此容器将在那里找到mysql。使用网络模式作为&#34; host&#34;:
0.0.0.0
然后,将version: '3'
services:
web-app:
build:
context: .
dockerfile: web-app/Dockerfile
ports:
- 8080:8080
network_mode: "host"
指向mysql,如下所示:hibernate.properties
答案 2 :(得分:0)
sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2003,“无法连接到'127.0.0.1'上的MySQL服务器([Errno 111]连接被拒绝)”) 我试图解决上述问题,同时尝试从Dockerized flask应用程序连接localhost mysql服务器。该线程中的解决方案非常有用
答案 3 :(得分:0)
问题:
在同一场景中,我们想为服务设置开发本地计算机设置,开发人员只需制作docker-compose up -d
并在其本地计算机上使用所有最新开发版本即可。
但是,在将docker-compose中的docker-compose.yml
中配置为服务的基于tomcat的Web服务连接到**mysql-8.0**
服务时,我们开始遇到问题。因此,作为替代方法和快速修复,我们认为应将本地笔记本电脑上配置的本地mysql与Ubuntu和docker-compose结合使用。
我们的tomcat应用程序正在使用一个带有jdbc config变量的application-dev.yml
文件来连接到mysql,就像这样
url: jdbc:mysql://db:3306/abcDB?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: abcderf
Docker-compose.yml
version: '3'
services:
db:
image: mysql:8.0
container_name: db
restart: unless-stopped
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=abcd
- MYSQL_PASSWORD=abcd
- MYSQL_DATABASE=abcdDB
volumes:
- ./sql-dump:/docker-entrypoint-initdb.d
command: '--default-authentication-plugin=mysql_native_password'
frontend:
container_name: frontend
image: abc/abc:frontend-1.1.36
depends_on:
- backend
nginx:
container_name: nginx
image: nginx:1.19-alpine
links:
- "frontend"
- "backend"
volumes:
- ./proxyConf:/etc/nginx/conf.d
ports:
- "80:80"
- "443:443"
backend:
container_name: backend
image: abc/abc:server-3.1.161
restart: unless-stopped
env_file: .env
environment:
- SPRING_PROFILES_ACTIVE=devtest
- DB_HOST=db:3306
- DB_NAME=abcDB
depends_on:
- db
解决方案对我们有用:
当我们想从本地mysql连接docker-compose tomcat服务时,我们尝试了以下路由。
docker inspect <container-id-or-name> | grep Gateway
返回的IP网关ip值为`
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.18.0.1",
"IPv6Gateway": ""
如下所示在application-dev.yml
中使用了上述Ip(${DB_HOST}
的URL发布解析如下所示,但是IP更改为下一个更高的docker-compose down
后,例如:172.19.0.1 )
url: jdbc:mysql://172.18.0.1:3306/abcDB?useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
password: abcderf
修改后的 docker-compose.yml
version: '3'
services:
frontend:
container_name: frontend
image: abc/abc:frontend-1.1.36
depends_on:
- backend
nginx:
container_name: nginx
image: nginx:1.19-alpine
links:
- "frontend"
- "backend"
volumes:
- ./proxyConf:/etc/nginx/conf.d
ports:
- "80:80"
- "443:443"
backend:
container_name: backend
image: abc/abc:server-3.1.161
restart: unless-stopped
env_file: .env
environment:
- SPRING_PROFILES_ACTIVE=devtest
- DB_HOST=172.18.0.1:3306
- DB_NAME=abcDB
depends_on:
- db
并且还更新了bind-address = 0.0.0.0
中的/etc/mysql/mysql.conf.d/mysqld.cnf
,并从mysql命令行允许root
用户从任何IP连接。
以下是可用于 mysql-8.0 的唯一命令,其他命令均因错误syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';
重新启动mysql客户端
sudo service mysql restart
答案 4 :(得分:0)
本地我让 MySQL 在端口 3306 上运行,而 MySQL 容器在同一端口 3306 上运行
在连接到它之前,您必须确保 MySQL 或您在容器中使用的任何数据库服务已在本地环境中停止
就我而言,我通过 Homebrew 运行 MySQL
brew services stop mysql
答案 5 :(得分:0)
最简单的方法是使用 host.docker.internal
代替 localhost
。
MONGO_SERVER = {
'host': 'host.docker.internal',
'port': 27017,
'username': 'admin',
'password': '123456'}
答案 6 :(得分:-1)
允许使用mysqld.cnf的权限
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
保存文件并重新启动mysql服务器
sudo systemctl restart mysql.service
登录Mysql
mysql -h localhost -u root -p
GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;
找到您的IP
ip addr show
并在您的docker容器192.168.x.x中使用它
答案 7 :(得分:-2)
在docker中使用172.17.0.1。它的主机静态IP地址