准备工作
在docker内部署任何应用,都需要先下载对应的镜像;下载镜像之前,需要先搜索镜像来确认该镜像是否存在:
docker search mysql
![](https://upload-images.jianshu.io/upload_images/19112139-3374d56dafbad363.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
从列表可以看到,docker已经有了mysql的镜像,名称是“mysql”,接下来下载镜像:
docker pull mysql
![](https://upload-images.jianshu.io/upload_images/19112139-dfc76b4e71c82231.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下载完成后,查看一下本地镜像:
![](https://upload-images.jianshu.io/upload_images/19112139-6dab9ea1ec1c8216.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如果在列表中看到mysql,镜像下载就已经成功了。
容器设置
在docker中,真正运行的是容器,镜像在我理解中是一种环境。我们在指定的镜像中运行某个容器,然后编辑和配置这个容器,从而达到想要的效果。使用以下命令运行一个mysql容器:
docker run -d -it -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql
![](https://upload-images.jianshu.io/upload_images/19112139-5145a23540ad3cf6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
解释一下
-d:代表后台运行,并返回容器的ID;
-it:是一个组合命令,可以使容器在运行时不会阻塞当前操作界面。(另一种写法是 -i -t );
-p 3306:3306:将宿主机上的端口映射到容器对应端口;
-e MYSQL_ROOT_PASSWORD=123456:设置环境变量,此处是设置root用户密码为123456;
--name mysql01:自定义容器名称为mysql01;
最后的mysql:镜像的名称。
这行命令的结果是在mysql镜像中运行了一个名为mysql01的容器,并且root用户的密码是123456。接下来看一下容器有没有正常运行:
![](https://upload-images.jianshu.io/upload_images/19112139-4dce14e277ca5ba6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看到STATUS那一栏是Up开头就代表启动成功了。
Docker下的Mysql操作
容器创建好以后,可以使用exec命令进入容器去操作:
docker exec -it mysql01 bash
进入容器以后,使用刚才设置好的账户密码登陆mysql:
![](https://upload-images.jianshu.io/upload_images/19112139-f0e804d08844ad69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
登陆成功后,就可以按照mysql的命令去操作表库了。因为mysql和dockers容器的退出指令都是exit,所以如果要回到根目录,先输入exit退出mysql,再输入exit退出容器。
客户端连接Docker容器下的Mysql
上面已经实现了docker内操作mysql,但全命令行的操作很费时,这显然不符合高效开发同学们的要求,所以现在有个简单的方法,就是使用客户端连接docker容器下的mysql。
我们知道docker是运行在虚拟机环境下的,虚拟机有单独的IP地址和端口,只要找到docker所在虚拟机的IP即可使用客户端连接到docker容器下的mysql。但是直接去连肯定会失败,为什么?两个原因:
1、因为docker容器也拥有独立的端口和IP,所以直接访问docker所在虚拟机的IP是访问不到的,因此需要将docker容器的端口映射到docker所在主机的端口上。
2、因为mysql默认不允许远程连接。
端口映射在前面已经做好了,所以现在只需要修改mysql允许所有连接即可。登陆docker容器的mysql,输入以下命令:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
成功以后,另外打开一个cmd,输入ipconfig列出所有IP:
![](https://upload-images.jianshu.io/upload_images/19112139-8db4ba7fa0a9e0d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
红框圈起来的就是虚拟机在用的IP了,使用这个IP和刚才设置的账户密码就可以用客户端连接了:
![](https://upload-images.jianshu.io/upload_images/19112139-4528ab8c258ebc10.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
(如果本机没有MySql,直接用localhost也是可以成功登陆navicat的。)
测试
通过navicat创建一个数据库docker_mysql:
![](https://upload-images.jianshu.io/upload_images/19112139-a71c2aa0d9822644.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
然后切换到docker环境,进入mysql01容器,查看所有数据库:
![](https://upload-images.jianshu.io/upload_images/19112139-d9e6285498b8e740.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
使用客户端创建的数据库在容器内也可以查到,测试成功。
需要注意的一点是,docker一但停止运行,关联的虚拟机也会被释放,所有数据都会随之消失。资料卷可以解决这个问题,但是本文篇幅有限,后面几篇文章会详述这个问题。