使用Docker安装、运行mysql

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 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目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容