使用Docker安装、运行mysql

96
吧啦啦小汤圆
0.2 2017.09.08 01:23* 字数 1350

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
访问本机的mysql

进入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.sock 文件

    这个我解决方法是启动一下本机的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 liying-mysql ##查看日志
$ docker ps #查看容器
d、查看宿主机上的mysql数据

[图片上传失败...(image-3ef976-1555520311875)]

-p 3306:3306->把容器的mysql端口3306映射到宿主机的3306端口,这样想访问mysql就可以直接访问宿主机的3306端口。
-v /opt/data/mysql:/var/lib/mysql->把宿主机/opt/data/mysql/目录映射到容器的/var/lib/mysql目录

Docker
Web note ad 1