1.数据目录权限和存在与否的问题

sudo docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

这是在基于mysql:5.7镜像创建一个名为mysql的容器时对容器进行端口映射、数据卷挂载和环境变量设置。

1.代码和解释

sudo docker run

sudo:在 Linux 系统中,用于以超级用户权限执行命令。因为 Docker
操作可能涉及到系统资源的管理和权限控制,所以部分操作需要超级用户权限。

docker run:Docker的核心命令之一,用于创建并启动一个新的容器。它会根据指定的镜像创建容器实例,并执行相应的命令。

-p 3306:3306

-p 是端口映射参数,用于将宿主机的端口与容器内的端口进行绑定,使得外部可以通过宿主机的指定端口访问容器内的服务。

3306:3306 表示将宿主机的 3306 端口映射到容器内的 3306 端口。由于 MySQL 默认使用 3306
端口提供服务,通过这种映射,你可以在宿主机上使用 localhost:3306 或者宿主机的 IP 地址加端口号来访问容器内运行的
MySQL 服务。

–name mysql

–name 参数用于为新创建的容器指定一个自定义的名称。这里将容器命名为 mysql,方便后续对该容器进行管理和操作,例如使用 docker start mysql、docker stop mysql 等命令来启动或停止该容器。

-v 数据卷挂载参数

-v 用于创建数据卷挂载,它允许将宿主机的目录或文件与容器内的目录或文件进行关联,实现数据的持久化存储和共享。

-v /mydata/mysql/log:/var/log/mysql:将宿主机的 /mydata/mysql/log 目录挂载到容器内的 /var/log/mysql 目录,这样 MySQL 产生的日志文件会被存储在宿主机的指定目录下,即使容器被删除,日志数据也不会丢失。

-v /mydata/mysql/data:/var/lib/mysql:把宿主机的 /mydata/mysql/data 目录挂载到容器内的 /var/lib/mysql 目录,该目录通常存储 MySQL 的数据文件,通过挂载可以保证数据库数据的持久化。

-v /mydata/mysql/conf:/etc/mysql:将宿主机的 /mydata/mysql/conf 目录挂载到容器内的 /etc/mysql 目录,你可以在宿主机上修改 MySQL 的配置文件,修改后重启容器即可使新配置生效。

-e MYSQL_ROOT_PASSWORD=root

-e 是环境变量设置参数,用于在容器内部设置环境变量。

MYSQL_ROOT_PASSWORD=root 表示设置 MySQL 的 root 用户密码为 root。在启动 MySQL容器时,必须设置该环境变量,否则容器将无法正常启动。

-d

-d 表示以守护进程(后台)模式运行容器。使用该参数后,容器会在后台运行,不会占用当前终端的输入输出,你可以继续在终端执行其他命令。

2.问题与解决

  1. 有一些镜像会要求启动时,要求要设置密码类似。
docker run -d --name redis -p 6379:6379 redis redis-server --requirepass your_password
  1. 挂载了目录,但是容器没有权限访问,因此需要修改文件和目录的权限模式
chmod -R 777 /mydata/mysql

但要注意这种方法会给予所有用户最高权限,存在一定的安全风险,一般不建议在生产环境中使用。

  1. 挂载目录不存在,虽然docker在挂载的时候会自动将需要的目录创建,但若是你提供的那个目录并不完整或是名称不对,他也无法找到
-v /mydata/mysql/conf:/etc/mysql

这里我是挂载到/mydata/mysql/conf,但实际上MySQL需要的是再下一级的mysql.conf.d,但是docker并没有创建这个文件夹,因此找不到下面是正确的。

-v /mydata/mysql/conf/mysql.conf.d:/etc/mysql 

喜欢的话点个关注吧,后续还会更新更多开发中遇到的问题

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。