使用Docker搭建MySQL服务 - sablier - 博客园
一、安装镜像
二、建立镜像
2.1 拉取官方镜像
(我们这里选择5.7,如果不写后面的版本号则会自动拉取最新版)
docker pull mysql:5.7 # 拉取 mysql 5.7
docker pull mysql # 拉取最新版mysql镜像
问题处理:
我执行docker pull mysql:5.7,报错
no matching manifest for linux/arm64/v8 in the manifest list entries
原因:
Mac m1的芯片,想用docker拉取mysql5.7的镜像,会报这个错误
解决办法:
docker pull --platform linux/x86_64 mysql:5.7
2.2 查看是否拉取成功
sudo docker images
2.3 通过刚刚拉取的image来启动容器
模板:
sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- –name:容器名,此处命名为
mysql
- -e:配置信息,此处配置mysql的root用户的登陆密码
- -p:端口映射,此处映射 主机3306端口 到 容器的3306端口
- -d:后台运行容器,保证在退出终端后容器继续运行
实际操作:
1、我要启动两个2个docker容器,所以--name 容器名称,一个为mysql1,一个为mysql2
2、本地3306端口,已经被我本地的mysql占用了,不能再映射到我本地的3306地步端口,所以一个映射到3307 和3308
启动mysql1 容器:
sudo docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
报错:
此时有2个报错:
a、WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
b、Bind for 0.0.0.0:3307 failed: port is already allocated.
a问题是因为cpu的问题,可以忽略
b问题是因为我本地3307端口被占用了
杀死占用3307程序的端口(3307被我docker一个容器占用了)
查看当前正在运行的容器
docker ps
找到端口3307的容器,CONTAINER ID
关掉这个容器
docker stop 7f568f7868ce
再次检查 当前运行的容器
docker ps
再次运行
sudo docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
报错:
docker: Error response from daemon: Conflict. The container name "/mysql1" is already in use by container "78dc9c67150d428c1a397f3561b32ca664d8268f4ec9c0386397c5abc66d4184". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'
原因,我们第一次执行运行容器命令时,虽然运行失败了,但是依然生成了容器名为为mysql1的容器。当我们再次运行时,容器名称mysql1就重复了。
解决办法:
删掉历史的容器mysql1
查看所有的容器(正在运行的+历史的)
docker ps -a
删除掉名为mysql1的容器(CONTAINER ID: 78dc9c67150d)
docker rm 78dc9c67150d
再次启动mysql1的容器
sudo docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
启动成功
查看当前运行的容器
docker ps
然后我们启动名为mysql2的容器,端口号为3308
sudo docker run -p 3308:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
查看当前正在运行的容器
docker ps
- 可以看到容器ID,容器的源镜像,启动命令,创建时间,状态,端口映射信息,容器名字
三、mysql数据持久化
为什么要做数据持久化:
因为我们在mysql容器内修改数据是不会被保存的,我们将数据库容器的目录映射到本机,将数据保存到本机上,这样在容器里做的数据修改,就会被保存了。
如果不做数据持久化,则每次启动mysql 里面的数据都是初始数据。
如果不需要做数据持久化,这个操作可以省略。
命令模版:
duso docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
- -v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
我的命令:
docker run --name mysql3 -d -p 3309:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
解析:
--name mysql3 # 对容器的命名
-d #后台运行
-p 3309:3306 #对外暴露端口号3310
-v /home/mysql/conf:/etc/mysql/conf.d #配置文件挂载到当前宿主机的/home/mysql/conf
-v /home/mysql/data:/var/lib/mysql #数据挂载到当前宿主机的 /home/mysql/data
-e MYSQL_ROOT_PASSWORD=123456 #设置mysql的root用户的密码是:123456
执行我的命令后报错:
docker: Error response from daemon: Mounts denied:
The path /home/mysql/data is not shared from the host and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> Resources -> File Sharing.
See https://docs.docker.com/desktop/mac for more info.
翻译:
docker:来自daemon的错误响应:mount被拒绝:
路径/home/mysql/data不是由主机共享的,Docker也不知道。
你可以配置共享路径从Docker ->首选项…—>资源—>文件共享。
更多信息请参见https://docs.docker.com/desktop/mac。
原因:
我映射到的本级目录应该没有设置共享权限
解决办法:
Preferences... -> Resources -> File Sharing.
我添加了/home
然后Apply&Restart
再次启动容器就好了。
docker run --name mysql4 -d -p 3309:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
查看当前运行的docker
docker ps
四、连接mysql
4.1进入docker本地连接mysql客户端
1、进入名为mysql4的docker容器
sudo docker exec -it mysql4 bash
注意:这里的mysql4是容器的名字,不是数据库的名字
2、连接mysql
mysql -uroot -p123456
这里的mysql是数据库mysql的名字,不是容器的名字
这就链接成功了
五、校验是否数据持久化成功
在mysql内创建一个库
create database hello;
关掉 容器mysql4
docker stop mysql4
查看容器mysql4的容器id containerId
docker ps -a
再次启动容器mysql4
docker start $containerId
docker start 99d4aff8d5a3
查看容器mysql4启动成功
docker ps
进入容器
sudo docker exec -it mysql4 bash
链接数据库
mysql -uroot -p123456
查看数据库里所有的库,hello库是否存在
show databases;
hello库存在,证明数据持久化成功
六、客户端操作&介绍
上面都是命令行的操作,这里介绍一下客户端操作
docker操作界面,入口
Dashboard
1是我们的容器列表,这里可以执行删除、启动、暂停容器等操作
2 就是image的列表,具体可以看我上一章关于image的介绍
一、mac 安装及使用docker_喵酱-CSDN博客
3好像是数据挂载、做持久化之类的(我也不是很清楚)
设置界面、入口
Preferences
这里可以设置国内镜像