我正在尝试在docker容器中安装mysql,尝试从github的各种图像,似乎他们都设法成功安装mysql但是当我尝试运行mysql时它给出了一个错误:
ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器
系统规格:
我到目前为止尝试的包:
请记住,您需要连接到正在运行的docker容器。所以你可能想用tcp而不是unix socket。检查docker ps
命令的输出并查找正在运行的mysql容器。如果你找到一个然后使用这样的mysql命令:mysql -h 127.0.0.1 -P <mysql_port>
(你将在docker ps
输出中找到端口)。如果你在docker ps
输出中找不到任何正在运行的mysql容器,那么试试docker images
找到mysql图像名称并尝试这样运行它:docker run -d -p 3306:3306 tutum/mysql
其中“tutum / mysql”是在docker images
中找到的图像名称。
我遇到了同样的问题,事实上,我安装后忘了运行服务。
启动mysql服务器:
/etc/init.d/mysql start
不知道我是如何实现这一点的,但是,我已经能够通过输入来达到MYSQL
$ mysql -u root -h
mywebsite:
image: benftwc/pldev-webserver
volumes:
- ./mywebsite.fr/:/var/www/
working_dir: /var/www/
ports:
- "8009:8009"
command: php -S 0.0.0.0:8009
links:
- database
database:
image: library/mysql
environment:
MYSQL_ROOT_PASSWORD: root
ports:
- "3310:3306
root@422f4d1f454a:/# mysql -u root -h 127.0.0.1 -p3310
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
root@422f4d1f454a:/# mysql -u root -h database -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g...........
如果您没有在主机上安装MySQL,则必须在容器中执行它(https://docs.docker.com/engine/reference/commandline/exec/#/examples提供有关docker run vs docker exec的说明)。
考虑到您的容器正在运行,您可以使用
docker exec yourcontainername mysql -u root -p
来访问客户端。
此外,如果您正在使用Docker Compose,并且您已声明了名为database的mysql数据库服务,则可以使用:
docker-compose exec database mysql -u root -p
我可能会迟到一点回答,现在世界可能已经知道了。
所有你必须打开docker容器的端口来访问它。例如,在运行容器时:
docker run --name mysql_container -e MYSQL_ROOT_PASSWORD = root -d
-p 3306:3306
mysql / mysql-server:5.7
这将允许从主机访问容器的mysql。稍后您可以连接到它。
docker exec -it mysql_container mysql -u root -p
看看你的database.yml
文件中有什么。如果您已经拥有普通的Rails应用程序并且只是使用Docker将其包装起来,那么您应该更改(在database.yml
内部):
socket: /var/run/mysqld/mysqld.sock #just comment it out
至
host: db
其中db
是docker-compose.yml
的db-service名称。这是我的docker-compose.yml
:
version: '3'
services:
web:
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
您在控制台(在app文件夹中)以docker-compose up
启动应用程序。然后等待1分钟(让你的mysql服务完全加载),直到一些新的日志停止出现在控制台中。通常最后一行应该是这样的
db_1 | 2017-12-24T12:25:20.397174Z 0 [注意]非本机分区表的列表结尾
然后(在新的终端窗口中)申请:
docker-compose run web rake db:create
然后
docker-compose run web rake db:migrate
完成工作后,停止加载的图像
docker-compose stop
不要在这里使用docker-compose down
,因为如果你这样做,你将删除你的数据库内容。
下次要恢复工作申请时:
docker-compose start
剩下的事情就像这里解释的那样:https://docs.docker.com/compose/rails/
在这个问题之后几个月,我已经掌握了我的Docker技能。我应该使用Docker容器名称。
使用dokerized-nginx作为桥接器来暴露容器的ip +端口。
在WEB配置中,我现在使用mysql://USERNAME:PASSWORD@docker_container_name/DB_NAME
通过docker访问Mysql socket(也可以使用docker-compose,使用compose-name而不是容器1)
我今天遇到了同样的问题,尝试用这个命令运行你的容器。
docker run --name mariadbtest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypass -d mariadb/server:10.3
对我来说,这只是重启docker守护进程的问题。