同福

使用mysql:5.7-debian镜像部署MySQL数据库服务

介绍

介绍

前面福哥已经带着大家学会了搭建PHP的运行环境了,今天我们来搭建一个数据库服务。福哥推荐使用MySQL数据库,它有着简单、轻便、速度快、维护容易的特点。MySQL提供了免费的社区版本,大家可以免费使用MySQL数据库开发自己的web应用。

今天福哥就带着大家使用mysql:5.7-debian基础镜像来搭建MySQL数据库环境。

环境

镜像版本
mysql:5.7-debian
操作系统CentOS 7 x86_64 2009
服务器TFCentOS7x64
IP192.168.168.68
端口3306

安装

Dockerfile

基础镜像

福哥选择的是mysql:5.7-debian这个基础镜像,这个镜像是基于debian系统的。

https://hub.docker.com/_/mysql/tags?page=1&name=5.7-debian

home/topic/2023/0404/09/a4d7382273daca6aab9a82534f8d40f5.png

现在hub.docker.com依然打不开,大家就选这个版本吧!

拉取镜像mysql:5.7-debian,添加到registry.tongfu.net:5000私有仓库里面。

docker pull mysql:5.7-debian
docker tag mysql:5.7-debian registry.tongfu.net:5000/mysql:5.7-debian
docker rmi mysql:5.7-debian
docker images | grep mysql

home/topic/2023/0727/22/4f1f7fdd5756c54ac233fc460eb86ffe.png

创建镜像目录

创建镜像目录tfmysql5并切换到tfmysql5目录下面。

mkdir /tongfu.net/data/dockerfile/tfmysql5
cd /tongfu.net/data/dockerfile/tfmysql5

home/topic/2023/0727/22/52406fb072f6c29797230f972717ba39.png

依赖镜像

第一行写上依赖镜像mysql:5.7-debian。

FROM registry.tongfu.net:5000/mysql:5.7-debian

维护者信息

这个是福哥写的维护者信息。

# for MAINTAINER
MAINTAINER Author: Andy Bogate
MAINTAINER Email: tongfu@tongfu.net
MAINTAINER Home page: https://tongfu.net
MAINTAINER Datetime: 2023/04/02
MAINTAINER Version: v1.0

配置文件

mysqld.cnf

mysqld.cnf的存放目录是/etc/mysql/mysql.conf.d/,默认的mysqld.cnf里面只有一些基本的配置项。如果我们想要设置更多的MySQL服务器参数,可以将这个文件拷贝出来进行编辑,最后再通过Dockerfile打包到镜像里面。

启动临时容器,从容器里复制mysqld.cnf出来放到镜像目录下。

docker run -tid --name ttt -h ttt -e MYSQL_ROOT_PASSWORD=abcdef registry.tongfu.net:5000/mysql:5.7-debian
docker cp ttt:/etc/mysql/mysql.conf.d/mysqld.cnf mysqld.cnf
docker rm -f ttt

home/topic/2023/0727/22/1d80040cf96b30b39b3e280d32d36d70.png

福哥设置了server-id和binlog日志相关参数,可以用来作为主节点使用;福哥还设置了环境变量,因为默认的参数性能释放比较保守;福哥针对innodb的默认参数进行了优化,提高性能。

福哥还设置了sql_mode参数,默认的sql_mode比较严格,一般的SQL会执行不了。

server-id = 202307181
log-bin = tfmysql-bin
max_binlog_size = 256M
expire_logs_days = 6

max_allowed_packet = 128M
max_connections = 100
max_connect_errors = 1000
key_buffer_size = 8M
table_open_cache = 256
open_files_limit = 65535
query_cache_size = 0
tmp_table_size = 8M
thread_cache_size = 8
read_buffer_size = 128K
sort_buffer_size = 256K
join_buffer_size = 128K

myisam_max_sort_file_size = 1G
myisam_sort_buffer_size = 8M

innodb_flush_log_at_trx_commit = 2 # 0 - no writen, 1 - writen everytimes, 2 - writen per second
innodb_log_buffer_size = 2M
innodb_buffer_pool_size = 32M
innodb_log_file_size = 16M
innodb_thread_concurrency = 4

sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

home/topic/2023/0727/23/3c593ca85c1417e25a375fcd1155a978.png在创建新的镜像的时候把mysqld.cnf配置文件拷贝进去。

# mysqld.cnf
COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf

创建镜像

使用下面的命令创建tfmysql:5.7-1.0.0镜像。

docker build -f Dockerfile \
-t registry.tongfu.net:5000/tfmysql:5.7-1.0.0 ./

home/topic/2023/0727/22/4ac0da11d3af5f2ae4926a4dd2d7db77.png

启动MySQL

MySQL数据目录

在宿主机建立一个用来存放MySQL数据的目录,它将被映射到容器的MySQL数据目录上面。

mkdir -p /tongfu.net/data/docker/data/tfmysql
chown 999.999 /tongfu.net/data/docker/data/tfmysql

启动容器

使用下面的命令基于tfmysql:5.7-1.0.0镜像启动一个容器,将3306端口映射到宿主机上面,将/var/lib/mysql这个mysql数据目录映射到前面建立的目录上面。

docker run -tid \
--name tfmysql \
-h tfmysql \
-p 3306:3306 \
-v /tongfu.net/data/docker/data/tfmysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=abcdef \
registry.tongfu.net:5000/tfmysql:5.7-1.0.0

home/topic/2023/0727/23/6ecc122cf75969be7fb96c12410920f6.png

创建数据表

在tfmysql数据库里面创建一个数据表user,设置字段userId、userName,userPwd、createDT、updateDT、lastLoginDT。

CREATE TABLE user (
    userId INT NOT NULL AUTO_INCREMENT,
    userName VARCHAR(45) NOT NULL,
    userPwd CHAR(32) NOT NULL,
    createDT DATETIME,
    updateDT DATETIME,
    lastLoginDT DATETIME,
    PRIMARY KEY (userId),
    KEY u_userName (userName)
);

home/topic/2023/0727/23/88f38ea6d8ba6f4f7547022fc637a07d.png

插入数据

在默认的窗口里面编写两条INSERT语句,向user数据表里插入两条数据。

INSERT INTO user (userName, userPwd, createDT) VALUES ('福哥', md5('abcdef'), now());
INSERT INTO user (userName, userPwd, createDT) VALUES ('鬼谷子叔叔', md5('abcdef'), now());

home/topic/2023/0727/23/20135c1236e050de0b489d9c935160ef.png

tfmysql.php

在/tongfu.net/data/docker/data/tfphp/html/目录下面建立tfmysql.php程序文件,编写连接MySQL数据库的程序,这里面会用到刚刚查到的tfmysql容器的IP地址172.17.0.3。

<?php

header("Content-Type: text/html; charset=utf-8");

try{
    // 连接数据库
    $pdo = new \PDO("mysql:host=172.17.0.3;dbname=tfmysql", "root", "abcdef", [\PDO::MYSQL_ATTR_INIT_COMMAND => "set names utf8mb4"]);
    $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);

    // 获取数据库列表
    $rs = $pdo->prepare("show databases");
    $rs->execute();
    $dbs = $rs->fetchAll(\PDO::FETCH_ASSOC);

    // 获取数据表列表
    $rs = $pdo->prepare("show tables");
    $rs->execute();
    $tables = $rs->fetchAll(\PDO::FETCH_ASSOC);

    // 获取数据表数据
    $rs = $pdo->prepare("select * from user");
    $rs->execute();
    $data = $rs->fetchAll(\PDO::FETCH_ASSOC);

    // 数据库
    echo "<table border=\"1\"><tbody>";
    echo "<tr><th>Database</th></tr>";
    foreach ($dbs as $db){
        echo "<tr><td>". $db['Database']. "</td>";
    }
    echo "</tbody></table>";

    // 数据表
    echo "<table border=\"1\"><tbody>";
    echo "<tr><th>Table</th></tr>";
    foreach ($tables as $table){
        echo "<tr><td>". $table['Tables_in_tfmysql']. "</td>";
    }
    echo "</tbody></table>";

    // 数据
    echo "<table border=\"1\"><tbody>";
    echo "<tr>";
    foreach ($data[0] as $field => $value){
        echo "<th>". $field. "</th>";
    }
    echo "</tr>";
    foreach ($data as $row){
        echo "<tr>";
        foreach ($row as $field => $value){
            echo "<td>". $value. "</td>";
        }
        echo "</tr>";
    }
    echo "</tbody></table>";
}
catch (\PDOException $e){
    echo $e->getMessage();
}

启动tfphp容器

因为福哥把TFCentOS7x64虚拟机重新启动了,所以之前启动的所有容器都停止了。现在我们要用到tfphp容器,通过下面的命令把它启动起来。

docker start tfphp

浏览器访问

打开浏览器访问http://192.168.168.68/tfmysql.php,可以看到MySQL的数据库信息。

home/topic/2023/0727/23/2384c4e39d71f665b648feb1bebb0f02.png

总结

今天福哥在TFCentOS7x64服务器上面通过Dockerfile创建了一个镜像tfmysql:5.7-1.0.0,并且通过这个新创建的镜像tfmysql:5.7-1.0.0启动了一个容器,这个镜像用来运行MySQL数据库服务。

后面福哥会教给大家使用各种编程语言去操作MySQL数据库的方法,敬请期待~