docker安装mysql及相关配置、运行细节和常见报错解决方案

本文详细介绍了在Docker中运行MySQL容器时遇到的权限问题及解决步骤,包括如何正确挂载目录以避免sock文件缺失导致的连接错误,以及如何调整容器内目录权限以确保容器正常启动。同时,提到了--privileged参数的作用,允许容器拥有更多权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装、运行

需要特别注意-v挂载到本机的目录的权限问题,否则报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

sudo docker run --name=mysql -it -p 3306:3306 -v /home/zxl/workspace/docker/mysql/mysqld:/var/run/mysqld -v /home/zxl/workspace/docker/mysql/db:/var/lib/mysql -v /home/zxl/workspace/docker/mysql/conf.d:/etc/mysql/conf.d -v /home/zxl/workspace/docker/mysql/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d zhangxueliang2020/mysql:v5.7.26

常见报错解决方案

Ubuntu使用docker安装完mysql后登录时会遇到如下错误

root1@ubuntu:~$ mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2 "No such file or directory")
  • 上面错误提示没有mysqld.sock文件,然后在网上找了许多文章说要配置/etc/mysql/mysql.conf.d目录下的mysqld.cnf文件,然而我改了半天也没有用最后看到一篇文章才把问题解决掉的如下:
1、先创建好mysql容器
sudo docker run -p 3306:3306 --name mysql   -v /opt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
2、进入容器
sudo docker exec -it mysql /bin/bash
3、登陆容器内数据库
mysql -u root -p 设置的密码

本地宿主机通过mysql命令连接mysql Docker容器中的服务器报错 ERROR 2002 (HY000)

1、具体所错与下所示:

[user@cluster2 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

2、根据报错提示,是本地mysql连接服务器时,没有找到/var/lib/mysql/mysql.sock文件。那么从这入手,我们看到mysql容器中的服务器启动后的mysql.sock文件在哪。

我们进入mysql容器中看看:

sudo docker exec -it mysql /bin/bash
查看mysql配置文件my.cnf

root@9e313681fc3e:/# cat /etc/mysql/my.cnf
我们看到下面的一些配置:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL

Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

这里可以看到mysqld.sock的目录是在/var/run/mysqld目录下,但是这个目录,我们并没有挂载主机目录,下面我们重新运行mysql容器,挂载相应的容器,如下所示:

sudo docker run --name=mysql -it -p 3306:3306 -v /opt/data/mysql/mysqld:/var/run/mysqld -v /opt/data/mysql/db:/var/lib/mysql -v /opt/data/mysql/conf:/etc/mysql/conf.d -v /opt/data/mysql/files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d mysql

使用以上命令运行mysql容器,这里使用/opt/data/mysql中的相关目录挂载到mysql容器中,启动容器之后你会发现mysql服务器无法正常启动,报错如下:

2018-12-29T06:25:09.480604Z 0 [ERROR] [MY-010273] [Server] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock.
2018-12-29T06:25:09.480619Z 0 [ERROR] [MY-010268] [Server] Unable to setup unix socket lock file.
2018-12-29T06:25:09.480625Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-12-29T06:25:11.289786Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.13)  MySQL Community Server - GPL.
[user@cluster2 mysql]$ sudo docker logs mysql
2018-12-29T06:25:09.095301Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2018-12-29T06:25:09.095434Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.13) starting as process 1
2018-12-29T06:25:09.478963Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2018-12-29T06:25:09.480604Z 0 [ERROR] [MY-010273] [Server] Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock.
2018-12-29T06:25:09.480619Z 0 [ERROR] [MY-010268] [Server] Unable to setup unix socket lock file.
2018-12-29T06:25:09.480625Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-12-29T06:25:11.289786Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.13)  MySQL Community Server - GPL.

说是无法创建:Could not create unix socket lock file /var/run/mysqld/mysqld.sock.lock。这说明本地的/opt/data/mysql/mysqld目录,mysql容器中无权限防问。

注意:这里的/opt/data/mysql目录下的所示目录都是mysql容器启动时自动创建的,这里只有db目录的用户和组是:polkitd input,其它的就是root root,因此,我们要将其它几个目录的用户和组都改成polkitd input。命令如下:

cd /opt/data
sudo chown -R polkitd:input mysql

这样,删除mysql docker 容器。重新创建:

sudo docker rm mysql
sudo docker run --name=mysql -it -p 3306:3306 -v /opt/data/mysql/mysqld:/var/run/mysqld -v /opt/data/mysql/db:/var/lib/mysql -v /opt/data/mysql/conf:/etc/mysql/conf.d -v /opt/data/mysql/files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 --privileged=true -d mysql

这样容器中的mysql就能正常运行了。

3、本地主机连接容器的mysql时,需要查到 /var/lib/mysql/mysql.sock。我们启动mysql容器后,在/opt/data/mysql/mysqld目录下有一个mysqld.sock。我们要把这个文件链接到本地主机的var/lib/myql目录中。

sudo ln -s /opt/data/mysql/mysqld/mysqld.sock /var/lib/mysql/mysql.sock
这样在运行mysql -uroot -p输入密码就能正常连接,docker容器中的mysql服务了。

4、本地主机只需要安装mysql-community-client包就可以了。

docker --privileged=true 参数作用

大约在0.6版,privileged被引入docker。
使用该参数,container内的root拥有真正的root权限。
否则,container内的root只是外部的一个普通用户权限。
privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
甚至允许你在docker容器中启动docker容器。

$ docker help run 
...
--privileged=false         Give extended privileges to this container
...

这里以一个Mysql 例子

我们启动命令还没加 --privileged=true 参数 ,可以明确看到docker 尝试去运行容器,但是马上就关闭了。

命令

docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306  -d daocloud.io/library/mysql:5.7.6

尝试使用一些命令,提示permission denied,权限禁止

加入参数命令后

docker run --name mysql-test --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306  -d daocloud.io/library/mysql:5.7.6

成功运行命令

### 解决 `docker search` 命令查找 MySQL 遇到的错误 当执行 `docker search mysql` 出现错误提示 `Error response from daemon: Get https://index.docker.io/v1/search?q=mysql: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)` 时,这通常意味着 Docker 客户端无法连接到 Docker Hub 或者存在网络配置方面的问题。 #### 可能的原因分析 - **Docker守护进程未正常工作**:确保 Docker 服务正在运行并处于健康状态。 - **DNS解析问题**:尝试更新系统的 DNS 设置或清除本地 DNS 缓存来解决问题。 - **防火墙阻止访问外部资源**:某些情况下,企业内部网络安全策略可能会限制对外部站点(如 Docker Hub)的访问权限。 - **代理设置不当**:如果是在公司内网环境下操作,则可能是因为 HTTP(S) 代理配置不正确所引起的通信障碍[^1]。 #### 推荐的操作方法 为了恢复正常的搜索功能,可以采取以下措施: 1. 尝试重启计算机上的 Docker 服务以重置当前会话内的缓存数据其他临时性故障: ```bash systemctl restart docker ``` 2. 如果上述步骤未能生效,考虑重启整个操作系统级别的网络接口,以便刷新所有与互联网交互有关的状态信息: ```bash systemctl restart network ``` 3. 对于那些位于受控环境中工作的用户来说,确认是否有合适的代理服务器被指定给 Docker 使用。可以通过编辑 `/etc/docker/daemon.json` 文件添加必要的代理参数实现这一点。例如: ```json { "proxies": { "default": { "httpProxy": "http://proxy.example.com:80", "httpsProxy": "https://proxy.example.com:443" } } } ``` 之后记得再次重启 Docker 使新设定生效。 通过以上建议应该能够有效处理大部分由 `docker search` 所引发的相关异常状况。不过值得注意的是,在实际排查过程中还需要结合具体环境特点灵活调整应对方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学亮编程手记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值