这篇文章主要分为两个部分。
第一部分通过描述使用场景介绍为什么要使用 Docker 以及在 Docker 中使用 MariaDB 有什么优势。
接下来在第二部分中详细介绍如何安装 Docker ,使用 MariaDB 镜像以及如何挂载数据卷以及迁移数据的技巧。

为什么要使用 Docker

程序的开发过程中,尤其是涉及服务器的开发,往往部署的服务器和开发的电脑不是一样的环境,而在现实中,不同的开发者的开发环境不同,甚至同一个人,办公室的开发机,自己的 Laptop ,家里的电脑所使用的系统、环境也不一样。这就可能导致写好的程序在服务器上运行出现问题,或者在办公室未完成的程序,回到家想继续写代码,却又发现因为系统环境不一样而又出现意料之外的 Crash 。
因此,我们就有理由寻找一种能让我们专注解决问题,而从不断地配置、调试系统环境这些非问题根源的杂务中解放出来。Docker 正是能解决这一需求的一个利器。

在 Docker 中使用 MariaDB 的优势

在我的工作中,开发服务器在公司,生产服务器位于云端,他们都是基于 Ubuntu 的 Linux 系统,而我在公司的开发机是一台 WIndow10 的 WorkStation,另外还有一台 Mac 系统的 Laptop 用来移动办公以及回家使用。
在开发的过程中,服务器和开发机分别是三个不同的系统,然而又因为开发服务器属于公司的内网,因此如果在家还想继续工作的话,连接上开发服务器又不太方便。而为三个系统都安装上 MariaDB 以及其他相应的服务,配置和维护,共享数据库中的数据,都需要花费大量的时间和精力。
如果使用 Docker , 那么情况将简单很多。Docker 提供了 Window、 Linux、 MacOS 三个系统的支持,那么只需要在三个系统中都安装好 Docker 服务,然后使用 MariaDB 的 Images,通过 Docker 提供的挂载 Volume 在共享数据库,即可大量减少花费在维护、配置不同系统、服务版本不同的时间。

Docker 安装

Docker 安装可以参考 Docker 官网。Window 和 MacOS 系统均有一件安装包,Ubuntu 系统可以他通过下载安装包安装,详细可参照官网介绍。
安装完成后,由于国内网络原因,连接 Docker Hub 速度有点慢,因此可以替换国内的镜像源。
这里我使用阿里云提供的 Docker Hub 镜像加速服务,使用这个服务需要先注册一个阿里云开发者账号。详细参照以下操作文档: 阿里云Docker镜像站点
Docker 安装完成后,还可以根据需要更改 Docker Images 存放的位置,因为 Docker Images 所占的容量都比较大,因此可以自己开发机或者服务器的具体情况更改。

MariaDB 镜像使用

Docker 中提供了很多 MariaDB 的镜像,可以通过以下命令查询

docker search mariadb

一般而言,我们使用官方提供的镜像,以下为获取下载镜像,默认获取最新的版本

docker pull mariadb

接下来,我们将启动一个 MariaDB 容器

docker run --name mariadb_test -e MYSQL_ROOT_PASSWORD=my-secret=pw -d mariadb
> f5605d02f9f50d1bc813423454fb421ba17513c440487f26b41e26844d652136
docker ps -a
> CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
  f5605d02f9f5        mariadb             "docker-entrypoint..."   20 seconds ago      Up 18 seconds              3306/tcp            mariadb_test

我们可以看到,一个 ID 为 f5605d02f9f5 的 MariaDB 容器已经在运行中。
接下来,我们将进入容器,并查看数据库

docker exec -it f5605d02f9f5 bash
> root@f5605d02f9f5:/#
# 已经进入容器 f5605d02f9f5 中
root@f5605d02f9f5:/# mysql -u root -p
Enter password: my-secret-pw
> Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.8-MariaDB-10.2.8+maria~jessie mariadb.org binary distribution

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
# 以 root 身份进入 mysql client
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
# 可以看到数据库内数据库信息

这时的 MariaDB 已经可以正常使用,但是无法远程连接,因此我们需要映射端口来让我们的数据库能被远程访问。

docker run -d -P --name mariadb_connect -e MYSQL_ROOT_PASSWORD=my-secret-pw mariadb
> bf2280bb46bc3d624e6c0596c1545c39d4da249590a739401ec64635129d297b
docker ps -a
> CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
  bf2280bb46bc        mariadb             "docker-entrypoint..."   7 seconds ago       Up 5 seconds        0.0.0.0:32769->3306/tcp   mariadb_connect

我们可以看到,通过 -P 参数,Docker 会为我们自动分配一个未被使用的端口,这里是 32769,接下来,我们可以通过 Navicat 工具来测试一下是否能连接。

Navcat 连接成功截图
我们可以看到,通过在 Navicat 中正确填入主机地址、端口号、用户名及密码,然后点击 Test Conection 即可看到连接测试成功。
上面我们绑定的参数 -P 是让 Docker 随机映射一个可用的端口,如果我们要自定义映射的端口,可以用 -p hostPort:containerPort

挂载数据卷用于保存数据库数据

为了方便迁移数据库中的数据,我们可以通过挂载数据卷来实现。

# 以挂载本地 /data/Db/mariadb 为例
docker run -d --name mariadb_volume -P -v /data/Db/mariadb:/var/lib/mysql mariadb

这样,数据库中的数据将保存在我们挂载的本地文件 /data/Db/mariadb 上。我们可以迁移或者备份这个文件夹,来实现数据库迁移。
一般一个自动生成的空数据库文件,大概有 100多兆 ,而且这个文件夹中包含很多子文件,因此如果通过 SSH 或者 FTP 传输都需要比较长的时间,这里我们可以通过压缩打包来减少文件夹的容量。

# Ubuntu 压缩
cd /data/Db
tar zcvf mariadb.tar.gz mariadb
# Mac Window 直接在图形界面压缩

打包压缩后,容量会大幅度减少,在 Ubuntu 上,压缩后的文件大小大概在 2兆 左右。然后就可以将这个压缩文件传输要目标计算机,解压到恰当的路径即可使用。

# Ubuntu 解压
tar zxvf mariadb.tar.gz

有一点值得注意,如果我们在数据库中创建了新的用户,我们将这个存储数据库数据的数据卷迁移到其他地方,再重新挂载启动数据库后,这些数据库用户也是可用的。因此如果挂载有数据的数据卷时,可以不用 MYSQL_ROOT_PASSWORD 这个参数。

参考资料

Docker —— 从入门到实践
library/mariadb - Docker Hub


本文为原创内容,由同一作者于早前发表于简书,Docker使用MariaDB

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐