群晖、NAS、PVE、飞牛、二手品牌机、垃圾佬

每一位热爱生活的垃圾佬都值得敬畏

四、docker安装最新版mysql8.0.29服务器

四、docker安装最新版mysql8.0.29服务器 我们的目的是创建一个开箱即用的最新版mysql8服务器 […]

四、docker安装最新版mysql8.0.29服务器

我们的目的是创建一个开箱即用的最新版mysql8服务器系统,然后可以在任何地方远程连接它,这样就可以把docker出的这台mysql8当做数据库服务器使用了。前面两个容器ubuntu和centos的创建我们都直接使用命令docker run进行创建的,这种方式创建的容器,因为没有增加volume进行存储,每次重启容器,里面安装的软件或者日志信息都会丢失。

尝试使用dockerfile来创建容器,这种创建容器的方式,可以在里面写命令,只要dockerfile编写完成,后面可以一键运行,而不用担心里面写的apt install的软件没有了。我们还设置挂载volume,重启mysql容器后里面更改过的数据库数据都还在,不会因为重启容器而重新进行初始化造成数据的丢失。

1、拉取mysql8镜像并启动

最简单的一种方式:

#拉取最新镜像
docker pull mysql:latest

#执行mysql
docker run -it --name mysql8  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  mysql:latest

在Navicat等软件中,输入宿主机的IP地址加上3306即可连接,这里是192.168.31.226:3306

2、使用dockfile创建mysql

根据上面这个基础镜像,这个基础镜像是基于Debian的,我们写了一个dockerfile文件。

# 基础景象
FROM mysql:latest    
# 镜像制作信息                 
LABEL maintainer="JingLisen" 
# 安装更新系统并安装一些常用的软件
RUN apt-get update && apt-get install -y --no-install-recommends \                           # 安装openssl
    openssl \     
    #安装vim
    vim \
    #安装ssh
    openssh-server \
    #安装net-tools
    net-tools \
    #安装ufw
    ufw

# 开放端口                                                           
EXPOSE 3306 

输入下面命令执行:

#执行mysql镜像
docker run -itd --name mysql8  -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456  mysql8

#进入容器
docker exec -it mysql8 /bin/bash

#查看3306端口
netstat -nltp | grep 3306

在Navicat等软件中,输入宿主机的IP地址端口使用3306即可连接。

3、增加一个22端口

增加一个启动脚本setup.sh,该脚本和Dockerfile在同一目录下。启动脚本里设置允许root用户登录和设置ssh开机自启动。

# 基础景象
FROM mysql:latest    
# 镜像制作信息                 
LABEL maintainer="JingLisen" 
# 安装更新系统并安装一些常用的软件
RUN apt-get update && apt-get install -y --no-install-recommends \                           # 安装openssl
    openssl \     
    #安装vim
    vim \
    #安装ssh
    openssh-server \
    net-tools \
    ufw

#把setup.sh文件拷贝到容器中,并赋予可执行权限
COPY ./setup.sh /
RUN chmod a+x /setup.sh

#使用root用户
USER root

# 开放端口                                                           
EXPOSE 3306 22

#执行setup.sh这个脚本
RUN /bin/bash -c "source /setup.sh"

setup.sh文件内容是设置允许root用户登录和设置ssh开机自启动。#!/bin/bash 特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行。

#!/bin/bash
#设置允许root用户登录
echo PermitRootLogin yes >> /etc/ssh/sshd_config;

#设置ssh开机自启动
echo service ssh start >> /root/.bashrc;

输入下面命令执行:

#执行mysql镜像
docker run -itd --name mysql8  -p 3306:3306 -p 3070:22 -e MYSQL_ROOT_PASSWORD=123456  mysql8

#进入容器
docker exec -it mysql8 /bin/bash

#查看3306端口
netstat -nltp | grep 3306

#查看22端口
netstat -nltp | grep 22

在宿主机开放3070端口,使用ufw allow 3070。在容器里开放22端口,查看PermitRootLogin的值是否改为yes。理论上我们可以直接ssh登陆的。

#将PermitRootLogin的值改为yes,/搜索即可,超级简单
vim /etc/ssh/sshd_config

#开启22端口
ufw allow 22

#重启ssh服务
service ssh restart

#修改root密码,输入命令passwd,然后输入密码就行了
passwd

我的宿主机IP为192.168.31.226,可以用别的电脑进行ssh登陆。

 ssh -p 3070 root@192.168.31.226

这就相当于我们这台docker出来的mysql8既可以通过3306进行数据库的连接,也可以通过22端口进行远程访问啦。

4、设置初始化sql脚本,可以有多个

mysql8的官方镜像中,有一个/docker-entrypoint-initdb.d 目录,这个目录就是用于初始化脚本的执行的。容器启动会检查/var/lib/mysql 目录下是否有数据,如果没有数据才会执行/docker-entrypoint-initdb.d 目录下的脚本。脚本的执行顺序时安装字母的排序来执行的。因为我们没有映射卷到本地磁盘(主要看docker run命令是否增加了-v参数,并映射了/var/lib/mysql),所以这个目录肯定没有数据,也就是说sql脚本肯定会执行的,请小伙伴按照我写的命令进行操作哈。后面会有增加参数-v来展示。sql脚本和Dockerfile在同一目录下,并且sql脚本的文件名可以随便起,而且可以写多个sql脚本,只要都是以sql后缀结尾的文件就行。

在dockerfile中增加sql脚本的拷贝操作:

# 基础景象
FROM mysql:latest    
# 镜像制作信息                 
LABEL maintainer="JingLisen" 
# 安装更新系统
RUN apt-get update && apt-get install -y --no-install-recommends \                           # 安装openssl
    openssl \     
    #安装vim
    vim \
    #安装ssh
    openssh-server \
    net-tools \
    ufw

#把setup.sh文件拷贝到容器中,并赋予可执行权限
COPY ./setup.sh /
RUN chmod a+x /setup.sh

#初始化mysql脚本,可以写多个
COPY ./*.sql /docker-entrypoint-initdb.d/

#使用root用户
USER root

# 开放端口                                                           
EXPOSE 3306 22

#执行setup.sh这个脚本
RUN /bin/bash -c "source /setup.sh"

mysqlSetup.sql脚本为:

SET NAMES utf8;
CREATE DATABASE If Not Exists hep Character Set utf8;

USE hep;
-- ----------------------------
-- Table structure for hep_cs_university
-- ----------------------------
DROP TABLE IF EXISTS `hep_cs_university`;
CREATE TABLE `hep_cs_university` (
  `hep_cs_university_id` int(11) NOT NULL COMMENT '主键',
  `hep_cs_university_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学校名称',
  `hep_cs_university_college` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学院名称',
  `hep_cs_university_exam_basic` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '计算机考研公共基础课',
  `hep_cs_university_exam_cs` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '计算机考研专业课',
  `hep_cs_university_exam_interview` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '计算机考研复试内容',
  `hep_cs_university_major_direction` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '计算机主修研究方向',
  `hep_cs_university_coefficient_difficulty` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '考研难度系数',
  `hep_cs_university_academic_professional` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '学硕还是专硕',
  `hep_cs_university_study_period` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '研究生学习年限(2年、3年还是2.5年)',
  `hep_cs_university_rank` int(11) DEFAULT NULL COMMENT '大学综合排名',
  `hep_cs_university_cs_rank` int(11) DEFAULT NULL COMMENT '大学计算机专业排名',
  PRIMARY KEY (`hep_cs_university_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学校信息';

-- ----------------------------
-- Records of hep_cs_university
-- ----------------------------
BEGIN;
INSERT INTO `hep_cs_university` VALUES (1, '北京大学', '北京大学信息科学技术学院', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '801 计算机专业基础\n8\n0\n1\n计\n算\n机\n专\n业\n基\n础', '复试内容: 1. 上机考试;2.面试', '081201 计算机系统结构;081202 计算机软件与理论; 081203 计算机应用技术', '难度系数: 五颗星', NULL, '3', NULL, NULL);
INSERT INTO `hep_cs_university` VALUES (2, '北京大学', '北京大学深圳研究生院', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '801 计算机专业基础\n8\n0\n1\n计\n算\n机\n专\n业\n基\n础', '复试内容: 1. 上机考试;2.面试', '081203 计算机应用技术', '难度系数: 五颗星', NULL, '3', NULL, NULL);
INSERT INTO `hep_cs_university` VALUES (3, '北京大学', '北京大学软件与微电子学院', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '869 计算机基础综合(软件工程) / 622 计算机应用基础(计算机技术)', '复试内容: 1. 上机考试;2.面试', '085400 电子信息', '难度系数: 四颗星', NULL, '3', NULL, NULL);
INSERT INTO `hep_cs_university` VALUES (4, '清华大学', '清华大学计算机科学与技术系', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '912 计算机专业基础综合', '01计算机系统结构:复试时专业综合考试内容:计算机系统结构,编译原理; 02计算机软件与理论:复试时专业综合考试内容:编译原理,数据库原理; 03计算机应用技术:复试时专业综合考试内容:人工智能,多媒体技术', '081200 计算机科学与技术', '难度系数: 五颗星', NULL, '3', NULL, NULL);
INSERT INTO `hep_cs_university` VALUES (5, '清华大学', '清华大学软件学院', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '912 计算机专业基础综合', '复试时专业综合考试内容:编译原理、数据库原理', '083500 软件工程', '难度系数: 五颗星', NULL, '3', NULL, NULL);
INSERT INTO `hep_cs_university` VALUES (6, '清华大学', '清华大学深圳国际研究生院', '① 101 思想政治理论  ② 201 英语一  ③ 301 数学一\n1\n0\n1\n思\n想\n政\n治\n理\n论', '912 计算机专业基础综合', '复试地点:校本部(北京)。复试时专业综合考试内容:计算机系统结构、软件工程(二选一)。', '085400 电子信息', '难度系数: 五颗星', NULL, '3', NULL, NULL);
COMMIT;

输入下面命令执行:

#执行mysql镜像
docker run -itd --name mysql8  -p 3306:3306 -p 3070:22 -e MYSQL_ROOT_PASSWORD=123456  mysql8

#进入容器
docker exec -it mysql8 /bin/bash

#查看3306端口
netstat -nltp | grep 3306

#查看22端口
netstat -nltp | grep 22

用Navicat连接一下,可以看到初始化的数据。

docker-009.png

5、加载一个volume卷进行数据存储,保证数据操作不丢失

我们在宿主机有一个目录/home/jason/Desktop/mysql8/data,把这个目录挂载映射到容器的/var/lib/mysql目录,增加一个参数-v /home/jason/Desktop/mysql8/data:/var/lib/mysql 。这样子重启容器数据是不会丢失的,只要/home/jason/Desktop/mysql8/data这个宿主机目录的数据没有丢失,重启mysql容器原来的数据都还在。

#执行mysql镜像
docker run -itd --name mysql8 -v /home/jason/Desktop/mysql8/data:/var/lib/mysql  -p 3306:3306 -p 3070:22 -e MYSQL_ROOT_PASSWORD=123456  mysql8

#进入容器
docker exec -it mysql8 /bin/bash

看一下我们有操作过的数据,重启mysql容器之后,原有的数据都还在没有丢失。这才有点像模像样地当做mysql服务器使用了。

docker-009.png

docker-011.png

6、远程连接设置

想要远程登陆到容器,必须把家里的这台机器暴露到互联网中。访问路径是:互联网任何地方的网络→家庭宽带光猫→家庭路由器→家庭交换机(如果有的话)→局域网宿主机→容器。

首先家里的宽带必须桥接,必须申请公网IP,光猫的管理权交给路由器,路由器开放特定机器的特定端口号。通过小米路由器设置,把家里的docker宿主机的3306端口号暴露到互联网,暴露的端口号为6033。

docker-012.png

我家的公网IP现在是58.246.143.76,可以通过百度IP进行查看,现在就可以通过这个IP进行登录到mysql8容器了。网络的流程为:公网IP58.246.143.76:6033宿主机192.168.31.226容器:3306。这个运营商分配的公网IP是经常变化的,所以我进行了DDNS解析,也就不怕公网IP随时变化了,公共域名同样可以登录。

docker-012.png

大功告成,enjoy it。

7、说明

其他可能用到的docker命令:

#查看日志docker logs -f ContainerID或名称
docker logs -f mysql8

#执行脚本setup.sh
CMD["/bin/bash","/setup.sh"]

#执行脚本setup.sh
ENTRYPOINT ./setup.sh

#查看mysql运行状态
service mysql status

#退出容器,在命令行输入exit
exit

#关闭容器, docker stop + 容器ID
docker stop mysql8

# 查询所有的容器,包括没有运行的
docker ps -a

#查看所有运行中的容器
docker ps

#开启容器docker start + 容器ID或者容器名
docker start mysql8

#进入容器 docker attach + 容器的ID或者容器的名称
docker attach mysql8

#强制删除容器docker rm -f + 容器名
docker rm -f mysql8

发表回复