我用mysql数据库创建了一个rails应用程序。现在我们把它们放到Docker容器中。我使用Docker,Docker-机器,Docker-编写。
我的docker-composite.yml
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
ports:
- "3306:3306"
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
我的配置/数据库.yml
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
host: <%= ENV['DB_PORT_3306_TCP_ADDR'] %>
port: <%= ENV['DB_PORT_3306_TCP_PORT'] %>
development:
<<: *default
database: myapp_development
test:
<<: *default
database: myapp_test
production:
<<: *default
database: myapp_production
当 Boot 应用程序
$ docker-compose up
...
sidekiq_1 | Host '172.17.0.5' is not allowed to connect to this MySQL server
...
我的Web环境
$ docker-compose run web env
...
DB_PORT=tcp://172.17.0.3:3306
DB_PORT_3306_TCP=tcp://172.17.0.3:3306
DB_PORT_3306_TCP_ADDR=172.17.0.3
DB_PORT_3306_TCP_PORT=3306
DB_PORT_3306_TCP_PROTO=tcp
WEB_PORT=tcp://172.17.0.6:3000
WEB_PORT_3000_TCP=tcp://172.17.0.6:3000
WEB_PORT_3000_TCP_ADDR=172.17.0.6
WEB_PORT_3000_TCP_PORT=3000
WEB_PORT_3000_TCP_PROTO=tcp
...
我的docker-machine ip
$ docker-machine ip myapp
192.168.99.100
从浏览器访问:http://192.168.99.100:3000
,然后看到错误:
Mysql2::Error
Host '172.17.0.6' is not allowed to connect to this MySQL server
172.17.0.3
、172.17.0.5
、172.17.0.6
等。为什么他们使用不同的ip?如何连接MySQL?我无法理解config/database.yml
文件中写入的host
和port
。
4条答案
按热度按时间qnyhuwrf1#
在我的例子中,我在host中运行Rails,在docker中运行MySQL,官方镜像。
添加
host: 127.0.0.1
解决了这个问题。config/database.yml
xlpyo6sf2#
您必须将容器名称(
db
)添加到主机,示例:config/database.yml
看看这个例子:docker-to-rails-with-rbenv
5w9g7ksd3#
IP由内部DHCP服务器分配。这就是为什么他们可以改变…
我推荐阅读这篇文章http://blog.carbonfive.com/2015/03/17/docker-rails-docker-compose-together-in-your-development-workflow/,它解释了如何使用主机名(而不是IP)配置rails应用程序,以便在使用docker-compose时正确连接到数据库。
hmtdttj44#
不同方法:
通过MapDB端口:
你正在连接你的主机的端口3306到容器内的相同端口。
因此,您可以通过“localhost”上的端口连接到数据库。
所以database.yml看起来像这样:
你必须记住,数据库中的用户不是从本地主机连接的,而是从docker网络(默认172.x.x.x)连接的,所以为所有主机创建你的用户(user@
%
)永远不要使用root作为数据库用户。
如果你不想用SQL命令为Rails设置一个用户作为root,你可以在启动docker容器时通过环境变量创建一个。
请参见DockerHub-mysql。
您可以在docker-compose.yml中或在运行
docker compose up
时定义这些环境变量