Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
和虚拟机还是有区别的, 虚拟机相当于又起了一套操作系统,分配了内存和CPU,这个本身的损耗就大很多。
1.安装Docker
brew cask install docker
2. 获取mysql镜像
从docker hub的仓库中拉去mysql镜像
sudo docker pull mysql
查看镜像:
docker images
2.运行一个mysql容器
docker run -p 3306:3306 --name qmm-mysql -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=669988 -d mysql:5.6
//创建容器时,最后mysql:5.6表示mysql镜像的版本,可以写,表示指定该版本;如果不写也可以,docker会自动在本地检测有没有最新的,如果没有会自动去docker hub上去下载。
上述命令各个参数的含义:
run 运行一个docker容器
--name 后面这个是生成的容器的名字qmm-mysql
-p 3306:3306 表示这个容器中使用3306(第二个)映射到本机的端口号也为3306(第一个)
-e MYSQL_ROOT_PASSWORD=123456 初始化root用户的密码
-d 表示使用守护进程运行,即服务挂在后台
查看当前docker容器的运行状态:
docker ps : 查看运行中的容器
或者docker ps -a : 查看所有创建的容器
如果想要访问mysql ,需要在本机上装一个mysql-client。
本机装好mysql后,可以使用mysql命令访问本机的mysql服务器,密码就是上面创建容器时设置的密码为123456, 192.168.95.4 为现在我这台机器的ip, 3306为刚才所示的占用本物理机的端口(不是docker内部的端口)
mysql -h192.168.95.4 -p3306 -uroot -p123456
进入docker中mysql:
$ docker exec -it mysql bash
$ mysql -u root -p
数据数据库密码就可以进入docker中的mysql
创建容器注意事项:
- 端口映射唯一性:一个容器只能映射到本机的唯一一个端口,故如果创建了一个容器,该容器在运行中,该容器映射到本地的端口为3306, 那么就不能再创建一个容器映射在3306端口号上,因为该端口已经被分配给了第一个容器。
- 容器名字唯一性:创建的容器的名字不能与已经存在 的容器名字重复。
否则创建容器失败。
删除一个容器:
sudo docker rm 容器名字(如上容器名字就是:qmm-mysql)
重新再创建一个容器second-mysql,占用物理机的3307端口:
sudo docker run --name second-mysql -p 3307:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
现在两个容器(实例)都正常运行了,为了访问第二个容器,我们指定端口号3307登陆到这个mysql的client。
docker exec -it mysql bash // 想进入docker中,这里的mysql表示镜像的名字
mysql -h192.168.95.4 -P3307 -uroot -p123456
还可以在别人的机器上访问我本机的mysql,这个就是-h参数的作用:
比如:
mysql -h192.168.95.4 -p3306 -uroot -p123456
如果在同一个局域网下,别人是可以通过ip地址来访问我的电脑的,如果在别人的机器上这
里的-h后面写上我本机的ip地址,以及我的mysql的端口号和密码,那么他就可以访问我电脑
上的数据库mysql,前提是在一个局域网下。
在电脑上 docker 中运行 mysql 终极大法
这里默认电脑上是已经装好了docker .
今天在电脑上docker 中启动 mysql, 但是一路走了好多坑
划重点~~~
启动数据的方式有两种:
- 方法一:根据本机的mysql server 启动数据库
首先启动mysql server:
//启动服务图片
[图片上传失败...(image-47c838-1555518820643)]
启动本机的mysql 也可以使用命令行启动:
sudo /usr/local/mysql/support-files/mysql.server start
报如下错误:
[图片上传失败...(image-a78666-1555519504962)]
说缺少一个pid 文件,但是去查看/usr/local/mysql/dat
目录,目的是想看 local.err文件中的错误详情,发现根本看不到该目录,那猜测肯定是权限问题
chown -R mysql:mysql /usr/local/mysql/data
chmod -R 755 /usr/local/mysql/data
然后就有权限看到 data 目录了
然后进入/usr/local/mysql/data
去查看错误详情:cat CNmmqiu.local.err
发现其实是3306 端口占用,因为本地docker 启动了3306端口的服务,然后把docker 服务停掉,再重新启动 mysql server.
mysql server可以成功启动,不会再报没有pid 的错误了~
默认启动在3306端口,会占用本机的 3306 端口
进入mysql:
mysql -hlocalhost(这个是可选的) -uroot -p{数据库密码}
连接数据库:
如下
- 方法二:在docker 中使用mysql 镜像启动mysql 服务
首先,第一步,写一个docker-compose.yml:
version: '2'
services:
mysql-database:
image: mysql
ports:
- "3306:3306"
restart: always
environment:
MYSQL_DATABASE: 数据库名 // 这里docker 在启动的时候,会自动创建该数据库,不需要手动去创建
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: 数据库密码
然后使用 docker-compose up -d
启动mysql, 启动mysql container 是没有问题
那该怎么进去mysql, 去使用数据库呢?
先进入docker 容器中:
docker exec -it {container-id/container-name} bash
再连接mysql:
mysql -uroot -p{数据库密码}
连接数据库:
use 数据库名
// 切换到数据库
show databases;
// 展示所有的数据库
show tables;
//展示所有表
Note: 本机的mysql 和docker 中的mysql 不是共享的
期间踩了一些坑:
错误一:
-
这个我解决方法是启动一下本机的mysql server, 然后再启动 docker mysql,就可以了
错误二:
其实是因为我数据库密码输入错误了,所以报这个错,重新输入正确的密码,就可以进入mysql 了。
缺点:
以上就创建了一个mysql的docker容器,可以看到版本为5.7.21。但是这样创建的容器有两个问题,一是容器删除后,数据就丢失了,二是要访问数据库,必须进入到容器里面才可以。
a、创建宿主机数据存放目录
$ mkdir -p /opt/data/mysql
b、启动容器
$ docker run -d -v /opt/data/mysql/:/var/lib/mysql -p 3306:3306 --name liying-mysql -e MYSQL_ROOT_PASSWORD=attack docker.io/mysql
查看日志
$ docker logs mysql-container
d、查看宿主机上的mysql数据库
-p 3306:3306
->把容器的mysql端口3306映射到宿主机的3306端口,这样想访问mysql就可以直接访问宿主机的3306端口。
-v /opt/data/mysql:/var/lib/mysql
->把宿主机/opt/data/mysql/目录映射到容器的/var/lib/mysql目录