Skip to content

Commit 23233a9

Browse files
committed
feat: 添加docker部署MySQL。
1 parent 65712e3 commit 23233a9

File tree

5 files changed

+1015
-874
lines changed

5 files changed

+1015
-874
lines changed

README.md

+22-17
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,28 @@ MariaDB,是 MySQL server 的一个由社区开发的分支,MariaDB大部分
6262
- [查看安装目录](chapter2/2.2.md#查看安装目录)
6363
- [MariaDB切换MySQL](chapter2/2.2.md#mariadb切换mysql)
6464
- [卸载 MySQL 软件](chapter2/2.2.md#卸载-mysql-软件)
65-
- 2.3 [启动数据库设置初始密码](chapter2/2.3.md)
66-
- [命令行启动关闭重启MySQL服务](chapter2/2.3.md#命令行启动关闭重启mysql服务)
67-
- [图像界面启动关闭重启MySQL服务](chapter2/2.3.md#图像界面启动关闭重启mysql服务)
68-
- [查看初始密码](chapter2/2.3.md#查看初始密码)
69-
- [设置初始化密码](chapter2/2.3.md#设置初始化密码)
70-
- [启动报错处理](chapter2/2.3.md#启动报错处理)
71-
- 2.4 [MySQL工具](chapter2/2.4.md)
72-
- [命令行使用程序](chapter2/2.4.md#命令行使用程序)
73-
- [MySQL Workbench客户端](chapter2/2.4.md#mysql-workbench客户端)
74-
- [常用图形管理工具](chapter2/2.4.md#常用图形管理工具)
75-
- [MyCli替代MySQL的mysql命令行工具](chapter2/2.4.md#mycli替代mysql的mysql命令行工具)
76-
- 2.5 [MySQL配置修改](chapter2/2.5.md)
77-
- [MySQL安装目录说明](chapter2/2.5.md#mysql安装目录说明)
78-
- [配置文件的位置](chapter2/2.5.md#配置文件的位置)
79-
- [Windows系统配置文件读取](chapter2/2.5.md#windows系统配置文件读取)
80-
- [Linux系统配置文件读取](chapter2/2.5.md#linux系统配置文件读取)
81-
- [配置文件内容](chapter2/2.5.md#配置文件内容)
65+
- 2.3 [Docker 安装 MySQL](chapter2/2.3.md)
66+
- [快速启动一个 MySQL 服务器实例](chapter2/2.3.md#快速启动一个-mysql-服务器实例)
67+
- [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器)
68+
- [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件)
69+
- [使用 stack 部署 MySQL](#使用-stack-部署-mysql)
70+
- 2.3 [启动数据库设置初始密码](chapter2/2.4.md)
71+
- [命令行启动关闭重启MySQL服务](chapter2/2.4.md#命令行启动关闭重启mysql服务)
72+
- [图像界面启动关闭重启MySQL服务](chapter2/2.4.md#图像界面启动关闭重启mysql服务)
73+
- [查看初始密码](chapter2/2.4.md#查看初始密码)
74+
- [设置初始化密码](chapter2/2.4.md#设置初始化密码)
75+
- [启动报错处理](chapter2/2.4.md#启动报错处理)
76+
- 2.4 [MySQL工具](chapter2/2.5.md)
77+
- [命令行使用程序](chapter2/2.5.md#命令行使用程序)
78+
- [MySQL Workbench客户端](chapter2/2.5.md#mysql-workbench客户端)
79+
- [常用图形管理工具](chapter2/2.5.md#常用图形管理工具)
80+
- [MyCli替代MySQL的mysql命令行工具](chapter2/2.5.md#mycli替代mysql的mysql命令行工具)
81+
- 2.5 [MySQL配置修改](chapter2/2.6.md)
82+
- [MySQL安装目录说明](chapter2/2.6.md#mysql安装目录说明)
83+
- [配置文件的位置](chapter2/2.6.md#配置文件的位置)
84+
- [Windows系统配置文件读取](chapter2/2.6.md#windows系统配置文件读取)
85+
- [Linux系统配置文件读取](chapter2/2.6.md#linux系统配置文件读取)
86+
- [配置文件内容](chapter2/2.6.md#配置文件内容)
8287

8388
#### 第3章 数据库的基本操作
8489

chapter2/2.3.md

+85-205
Original file line numberDiff line numberDiff line change
@@ -1,259 +1,139 @@
1-
2-
启动数据库设置初始密码
1+
Docker 安装 MySQL
32
===
43

5-
这一小节介绍在Mac OS、Linux、Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控。安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上`service`命令不存在。
4+
通过 Docker 搭建 MySQL 数据库环境,同时能同时启动多个 MySQL 版本。在安装前,最好上 [docker](https://hub.docker.com/_/mysql) 官网上看一下 MySQL 的版本,更具具体需求版本安装 MySQL,假设你已经搭建好 Docker 环境下面介绍如何创建一个 MySQL 服务器实例。
5+
<!-- TOC -->
66

7-
## 命令行启动关闭重启MySQL服务
7+
- [快速启动一个 MySQL 服务器实例](#快速启动一个-mysql-服务器实例)
8+
- [通过命令行访问 MySQL 容器](#通过命令行访问-mysql-容器)
9+
- [使用 MySQL 自定义配置文件](#使用-mysql-自定义配置文件)
10+
- [使用 stack 部署 MySQL](#使用-stack-部署-mysql)
11+
- [参考资料](#参考资料)
812

9-
在命令行终端启动 MySQL 非常方便,下面大概介绍几个平台通过命令启动服务的方法。
13+
<!-- /TOC -->
14+
## 快速启动一个 MySQL 服务器实例
1015

11-
### 查看服务是否启动
16+
下面,我们通过通过 [docker](https://hub.docker.com/_/mysql) 镜像,或者 [MySQL](https://hub.docker.com/r/mysql/mysql-server) 官方镜像,进行快速启动一个实例。
1217

1318
```bash
14-
# 还可以这么查看,MySQL服务器是否启动
15-
ps -ef | grep mysqld
16-
17-
# 查看服务运行的状态
18-
service mysqld status
19+
# Docker 官方镜像
20+
$ docker image pull library/mysql:8.0.18
21+
# MySQL 官方镜像
22+
$ docker image pull mysql/mysql-server:8.0.18
1923
```
2024

21-
### Mac OS X 下命令操作
22-
23-
在 Mac 系统下操作起来就非常方便了。安装完之后就可以在终端上运行全局命令 mysql.server 命令,假设这个命令没有,你在系统的MySQL安装目录中找到 mysql.server 命令,运行它是一样的效果。
25+
上面命令中 `docker image pull` 是抓取 `image` 镜像的命令。`library/mysql:8.0.18` 是指定镜像仓库的位置和相对应的 `tag` 版本。由于 `Docker` 官方提供的 image 文件,都放在 [`library`](https://hub.docker.com/r/library/) 组里面,所以它的是默认组,可以省略。因此,上面的 Docker 命令可以写成下面这样。
2426

2527
```bash
26-
mysqld start
27-
mysql.server start # 1. 启动
28-
mysql.server stop # 2. 停止
29-
mysql.server restart # 3. 重启
28+
# Docker 官方镜像拉取,简写
29+
$ docker image pull mysql:8.0.18
3030
```
3131

32-
当你安装过 MySQL 并没有找到 mysql.server 命令,那这时你需要找到安装目录中的 mysql.server 命令工具了,如 `sudo /usr/local/mysql/support-files/mysql.server start`
33-
34-
### Linux 下命令操作
35-
36-
Linux生态系统中对服务的操作有点区别。其实在 Mac 系统下也可以直接 `mysqld start` 来启动服务。
37-
38-
1. 启动:`service mysqld start`
39-
2. 停止:`service mysqld stop`
40-
3. 重启:`service mysqld restart`
41-
3. 查看状态:`service mysqld status`
42-
4. 查看状态:`systemctl status mysqld.service`
43-
44-
systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器,在 Linux 系统中可以通过它来启动 mysql 服务。
45-
46-
启动过程中有可能会报错,错误处理,通过 **systemctl status mysqld.service****journalctl -xe** 命令查看服务启动失败的原因。
32+
拉取镜像成功以后,就可以在本机看到这个 `image` 文件了。
4733

4834
```bash
49-
systemctl status mysqld.service
50-
51-
● mysqld.service - SYSV: MySQL database server.
52-
Loaded: loaded (/etc/rc.d/init.d/mysqld)
53-
Active: failed (Result: exit-code) since 三 2016-11-02 22:14:36 EDT; 11s ago
54-
Docs: man:systemd-sysv-generator(8)
55-
Process: 14940 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=1/FAILURE)
56-
57-
11月 02 22:14:34 localhost.localdomain systemd[1]: Starting SYSV: MySQL database server....
58-
11月 02 22:14:35 localhost.localdomain mysqld[14940]: MySQL Daemon failed to start.
59-
11月 02 22:14:35 localhost.localdomain mysqld[14940]: Starting mysqld: [FAILED]
60-
11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service: control process exited, code=exited status=1
61-
11月 02 22:14:36 localhost.localdomain systemd[1]: Failed to start SYSV: MySQL database server..
62-
11月 02 22:14:36 localhost.localdomain systemd[1]: Unit mysqld.service entered failed state.
63-
11月 02 22:14:36 localhost.localdomain systemd[1]: mysqld.service failed.
35+
$ docker image ls
6436
```
6537

66-
```bash
67-
# 查看配置文件 my.cnf 的位置
68-
whereis my.cnf
69-
# 输出: my: /etc/my.cnf
70-
71-
# 编辑
72-
vi /etc/my.cnf
73-
```
74-
75-
里面有个 log_error=/var/log/mysqld.log 的配置,通过命令 **tail -25 /var/log/mysqld.log** 查看 MySQL 错误日志
38+
现在,运行这个 image 文件。
7639

7740
```bash
78-
2016-01-20T10:00:19.935771Z 0 [ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 2 - No such file or directory)
79-
2016-01-20T10:00:19.935795Z 0 [ERROR] Can't start server: can't create PID file: No such file or directory
80-
160120 18:00:20 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
41+
# Docker 官方镜像
42+
$ docker run --name mysqlname \
43+
-p 3308:3306 \
44+
-e MYSQL_ROOT_PASSWORD=my123456 \
45+
-v /etc/localtime:/etc/localtime:ro \
46+
--rm \
47+
-d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
48+
# MySQL 官方镜像
49+
$ docker run -d --name mysqlname mysql/mysql-server:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_col
8150
```
8251

83-
上面日志错误说,MySQL服务在启动的时候,不能创建pid文件。前去看一下 mysqld 文件是否存在,不存在创建 mysqld 目录。
84-
85-
```bash
86-
# 创建 mysqld 目录
87-
mkdir -p /var/run/mysqld/
88-
89-
# 启动MySQL
90-
/etc/init.d/mysqld start
91-
92-
# 输出下面内容
93-
# Starting mysqld (via systemctl): Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
94-
# [FAILED]
95-
```
52+
上面命令的各个参数含义如下:
9653

97-
创建 mysqld 目录还是启动报错,按照下面命令尝试解决问题
54+
- `--name mysqlname` 容器的名字叫做 `mysqlname`
55+
- `-p 3308:3306` 容器 MySQL 默认端口 `3306` 射到本机的 `3308` 端口。
56+
- `-d` 在后台运行容器并打印容器ID。
57+
- `--rm` 停止运行后,自动删除容器文件。
58+
- `-e MYSQL_ROOT_PASSWORD=my123456` 设置环境变量 `MYSQL_ROOT_PASSWORD` 值为 `my123456` 来设置 `root` 密码,[更多环境变量参考](https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html)
59+
- `--character-set-server=utf8mb4 --collation-server=utf8mb4_col` 该命令以默认字符集 `utf8mb4` 和数据库默认排序规则 `utf8mb4` 启动 `MySQL` 服务,可以将许多配置选项作为标志传递给 mysqld。这将使您可以灵活地自定义容器,而无需 `cnf` 配置文件,配置 `MySQL Server` 的另一种方法是准备一个配置文件,并将其安装在容器内服务器配置文件的位置。有关详细信息,请参见[持久数据和配置更改](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html#docker-persisting-data-configuration)
60+
- `-v /etc/localtime:/etc/localtime:ro` 是让容器的时钟与宿主机时钟同步,避免时区的问题,`ro``read only` 的意思,就是只读。
9861

99-
```shell
100-
ls -ld /var/run/mysqld/
101-
102-
# mysqld 文件夹如果不存在通过命令创建
103-
104-
mkdir /var/run/mysqld
105-
106-
# 会输出下面内容
107-
# drwxr-xr-x. 2 mysql mysql 60 11月 2 22:15 /var/run/mysqld/
108-
chown mysql.mysql /var/run/mysqld/
109-
/etc/init.d/mysqld start
110-
```
111-
112-
通过查看目录 /var/run/mysqld/ 的属主和属组还是root,mysql并不能在其中创建文件,后修改该目录的属主和属组,启动OK。
113-
114-
创建脚本`cat start-mysql.sh`,这个问题每次都会出现,因为Centos7上MySQL5.7.12系统不兼容启动失败, 每次开机后手动执行,或放在定时调度里。
115-
116-
```shell
117-
#!/bin/bash
118-
119-
mkdir -p /var/run/mysqld/
120-
chown mysql.mysql /var/run/mysqld/
121-
122-
/etc/init.d/mysqld start
123-
```
124-
125-
### Windows 下命令操作
126-
127-
Windows平台操作起来有点不顺手,个人感觉 Windows 的DOS太难用了,下面简单的介绍一下操作过程。先找到 MySQL 的安装位置,如我的电脑的安装位置是:C:\Program Files\MySQL\MySQL Server 5.7,我就执行这样的操作:开始->运行->输入“cmd”开启命令行,然后输入“C:”。通过命令进入到 MySQL Server 5.7 的 bin 目录下,输入 MySQL 命令行的服务启用命令,如下:
62+
可以通过 `容器id`/`容器名称` 查看 MySQL 日志
12863

12964
```bash
130-
# net start [mysql服务名]
131-
132-
# 启动 mysql 服务
133-
net start mysql
134-
135-
# 停止 mysql 服务
136-
net stop mysql
65+
$ docker logs mysqlname
13766
```
13867

139-
有很多情况可能导致无法启动 MySQL,常见解决方法如下:
140-
141-
1. 在 CMD 命令中断运行这条命令 C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin-u root -p shutdown 来关闭MYSQL,如果有密码根据提示输入密码即可。
142-
2. 在 CMD 命令中断,执行net start mysql启动 MySQL,参考上面方法来启动 MySQL 服务。
143-
144-
145-
## 图像界面启动关闭重启MySQL服务
146-
147-
### Mac OS X 下操作
68+
## 通过命令行访问 MySQL 容器
14869

149-
在 Mac 系统下如果你官方下载安装就可以在`系统偏好设置` > `MySQL` 里面点击 `Stop MySQL Server` 按钮进行启动关闭。
150-
151-
![MySQL](../img/2.3.1.png)
152-
153-
通过 [XAMMPP](https://www.apachefriends.org/zh_cn/index.html) 安装的 MySQL ,这个软件安装之后会自动安装 Apache + MySQL + PHP 对于初学者特别方便,新版本是默认安装`Apache + MariaDB + PHP + Perl`。
154-
155-
### Windows 下操作
156-
157-
Windows 系统下启动关闭重启MySQL服务。
158-
159-
## 查看初始密码
160-
161-
默认情况下MySQL是有个初始密码,知道了初始密码才能改密码。
162-
163-
```bash
164-
[root@localhost home]# grep 'temporary password' /var/log/mysqld.log
165-
166-
2017-07-17T13:40:11.842835Z 1 [Note] A temporary password is generated for root@localhost: b&iu(sf;>ws
167-
```
168-
169-
## 设置初始化密码
170-
171-
启动后我们需要简单配置一下 mysql ,默认安装以后 mysql 的 root 用户是没有密码的,对于生产环境来说,这肯定是不行的,另外还有一些安全相关的设置,可以使用下面这行命令去配置一下,它是一个向导,问你一些问题,你要给出答案,比如是否要设置 root 用户的密码, 密码是什么等等。
70+
可以通过[容器名字]或者[容器 ID]进入 MySQL 容器
17271

17372
```bash
174-
mysql_secure_installation
175-
176-
Enter current password for root (enter for none):
177-
# 解释:输入当前 root 用户密码,默认为空,直接回车。
178-
179-
Set root password? [Y/n] y
180-
# 解释:要设置 root 密码吗?输入 y 表示愿意。
181-
182-
Remove anonymous users? [Y/n] y
183-
# 解释:要移除掉匿名用户吗?输入 y 表示愿意。
184-
185-
Disallow root login remotely? [Y/n] y
186-
# 解释:不想让 root 远程登陆吗?输入 y 表示愿意。
187-
188-
Remove test database and access to it? [Y/n] y
189-
# 解释:要去掉 test 数据库吗?输入 y 表示愿意。
190-
191-
Reload privilege tables now? [Y/n] y
192-
# 解释:想要重新加载权限吗?输入 y 表示愿意。
193-
73+
$ docker exec -it mysqlname bash
19474
```
19575

76+
## 使用 MySQL 自定义配置文件
19677

197-
你安装成功后,可以查看一下 MySQL 版本,`mysql --version`,如果版本并非你所使用的版本,你可以参考这里进行升级数据库操作[Centos6下升级MySQL数据库](../chapter17/1.2.md)。
198-
199-
## 启动报错处理
78+
MySQL 的默认配置可以在 `/etc/mysql/my.cnf` 中找到,该目录可以包含附加目录,例如 `/etc/mysql/conf.d``/etc/mysql/mysql.conf.d`。 请检查 MySQL 镜像本身中的相关文件和目录,以获取更多详细信息。
20079

201-
下面是我尝试在Mac上启动MySQL报错
202-
203-
**启动失败**
80+
如果 `/my/custom/config-file.cnf` 是自定义配置文件的路径和名称,则可以像这样启动 MySQL 容器(请注意,此命令仅使用自定义配置文件的目录路径):
20481

20582
```bash
206-
sudo /usr/local/mysql/support-files/mysql.server start
207-
Password:
208-
Starting MySQL
209-
. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.pid
83+
$ docker run --name mysqlname \
84+
--rm \
85+
-p 3306:3306 \
86+
-e MYSQL_ROOT_PASSWORD=my123456 \
87+
-v /my/custom:/etc/mysql/conf.d \
88+
-v /etc/localtime:/etc/localtime:ro \
89+
-d mysql:8.0.18 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
21090
```
21191

212-
通过日志查看报错信息
213-
214-
```bash
215-
# 编辑配置文件
216-
sudo vim /etc/my.cnf
217-
218-
# 在配置文件最后添加一行错误日志输入的配置
219-
log_error = /usr/local/mysql/data/error.log
220-
```
92+
上面命令将启动一个新的容器 `mysqlname`,其中 MySQL 实例使用 `/etc/mysql/my.cnf``/etc/mysql/conf.d/config-file.cnf` 中的组合启动设置,其中后者的设置优先。
22193

222-
上面添加完成之后,重新启动再查看日志
94+
配置修改,可以通过【容器名字】或者【容器 ID】来重启 MySQL,可让配置生效。
22395

22496
```bash
225-
sudo /usr/local/mysql/support-files/mysql.server start
226-
tail -100 /usr/local/mysql/data/error.log
97+
docker restart mysqlname
22798
```
22899

229-
### 日志显示错误一
230-
231-
```bash
232-
2017-01-19T03:48:24.695505Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1 error: 35
233-
2017-01-19T03:48:24.695540Z 0 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
234-
```
100+
## 使用 stack 部署 MySQL
235101

236-
日志显示 mysqld 进程使用相同的InnoDB data 文件或日志文件,通过 `ps -ef | grep mysql | grep -v grep` 查看是否有该进程,发现果然有,这时候你需要杀掉该进程,我在我本地是杀不掉的,于是我尝试使用 mysqld 启动MySQL,启动成功。
102+
MySQL 的实例 `stack.yml`,下面实例使用 `root`/`example` 作为 `用户`/`密码` 凭据,`default_authentication_plugin=mysql_native_password` 这个是因 `MySQL 8` 的安全机制升级而需要修改的配置,不配置的话将无法登录管理:
237103

238-
```bash
239-
sudo /usr/local/mysql/bin/mysqld restart
240-
```
104+
```yml
105+
version: '3.1'
106+
services:
241107

242-
### 日志显示错误二
108+
db:
109+
image: mysql:8.0.18
110+
command: --default-authentication-plugin=mysql_native_password
111+
restart: always
112+
ports:
113+
- "3306:3306"
114+
volumes:
115+
# - /my/custom:/etc/mysql/conf.d
116+
- /etc/localtime:/etc/localtime:ro
117+
environment:
118+
MYSQL_ROOT_PASSWORD: example
243119

120+
adminer:
121+
image: adminer
122+
restart: always
123+
ports:
124+
- 8080:8080
244125
```
245-
[ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
246-
```
247-
248-
上面的错误信息说的是 `ibdata1` 文件不可写。`ibdata1` 是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件`ibdata1`中,(此原因会造成这个文件越来越大)。所以大概能猜测是 mysql 用户的权限不够了。所以再给 `ibdata1` 目录分配一下权限即可。
249126
250-
这个时候需要查看一下mysql 安装目录权限。使用 chown 改变了整个 mysql 目录的权限,这是一个非常不好的习惯
127+
通过下面命令运行 `stack`,等待它初始化,然后可以访问 `http://swarm-ip:8080`,`http://localhost:8080`, 或者 `http://host-ip:8080`,web 界面来管理 MySQL,有 web 管理工具是因为,在这个 stack 中我们除了添加了 `db` 的 `mysql` 容器,还添加了个添加了个额外的 `adminer` 容器,对外暴露了 `8080` 端口
251128

252129
```bash
253-
cd /usr/local/mysql
254-
sudo chown -R _mysql:_mysql *
130+
$ docker stack deploy -c stack.yml mysql
131+
# 或者使用 docker-compose,方便开发模式下调试。
132+
$ docker-compose -f stack.yml up
255133
```
256134

257-
这里需要注意的是,Mac OS系统下,mysql 的用户组和用户名都是 `_mysql`,Linux 是 `mysql`。然后再重启 MySQL 你就完事大吉了。
135+
## 参考资料
258136

259-
上面调试定位错误的方法非常有用。我通过这个方法多次解决各种问题。
137+
- [Docker 官方镜像地址](https://hub.docker.com/_/mysql)
138+
- [Docker 官方 Github 文档地址](https://github.com/docker-library/docs/tree/master/mysql)
139+
- [MySQL 官方资料:使用 Docker 在 Linux 上部署 MySQL](https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-more-topics.html)

0 commit comments

Comments
 (0)