制作MySQL容器镜像(兼容Mac M1)

目录

选择基础镜像

在容器内安装MySQL

进入容器内部

安装必要的工具

更新yum

安装依赖工具

安装MySQL

安装后的后续配置

查找MySQL配置文件

启动MySQL Server

设置MySQL密码

设置远程登录

制作属于自己的MySQL镜像

更便捷的方式----获取制作好的结果


这是一篇制作docker镜像的博客。镜像里安装了MySQL 8.2.06,且镜像是以CentOS8.4.2105为基础制作的。镜像的制作环境为Mac M1。下面分步介绍制作方法,仅供参考。如果有出错的地方欢迎留言讨论。

选择基础镜像

选择一个合适的镜像去安装MySQL等工具至关重要。在这里我选择了CentOS8镜像作为基础镜像。喜欢Ubuntu或者其他镜像的小伙伴可以自己下载尝试。下面的命令将CentOS8镜像下载到本地:

docker pull centos:centos8.4.2105

?提示:如果下载centos镜像速度过慢,可以尝试更换镜像源。更换镜像源的方法这里不再介绍,需要的小伙伴可以自己搜索。

下载完毕,我们使用docker images可以看到刚刚下载的镜像:

$ docker images centos
REPOSITORY   TAG              IMAGE ID       CREATED         SIZE
centos       centos8.4.2105   e6a0117ec169   6 months ago    272MB

在容器内安装MySQL

进入容器内部

为了在容器内部安装MySQL,我们首先需要运行容器:

$ docker run -itd -p 10234:3306 --privileged=true --name mysql_demo  centos:centos8.4.2105 /sbin/init
4c48b7ce4425af6db96d0502d47781b664ad668b58e0675bc5c22980c3463280
$ docker exec -it 4c48b7ce4425a /bin/bash
[root@4c48b7ce4425 /]# 

docker run命令会启动一个容器。下面是对上面命令的参数解读:

选项描述
-i以交互式模式运行容器。
-t为容器重新分配一个伪输入终端。
-d后台运行容器。
-p指定端口映射。在上面的例子中,将容器运行的宿主机10234端口映射到容器内部的3306端口。
--privilegedprivileged=true,表示容器内的root用户拥有真正的root权限。
--name为启动的容器指定一个名字。在上面的例子中,为运行的容器命名为mysql_demo。

注意到我们使用的命令不是/bash/bin,而是/sbin/init,这表示容器运行时要初始化系统环境。

docker exec命令会进入到容器内部。容器id只需要从开头写出一部分即可,不需要全部写全。

看到 命令提示符变为[root@4c48b7ce4425 /]# 后,我们就进入到了容器内部中。可以使用hostname命令测试验证一下是不是在容器内部:

[root@4c48b7ce4425 /]# hostname
4c48b7ce4425

主机名变成了容器id开头的部分子字符串。说明我们已经处于容器中了。接下来的流程就好比在一台CentOS8服务器上安装MySQL一样简单。

安装必要的工具

我们下载的镜像是一个纯净的CentOS,很多基础的工具需要我们手动安装。

更新yum

首先需要更新下yum。我们要重新更新下两个yum的repo文件:

vi /etc/yum.repos.d/CentOS-Linux-BaseOS.repo

将CentOS-Linux-BaseOS.repo中的baseos section下的内容替换成如下内容:

[baseos]
name=CentOS Linux $releasever - BaseOS
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

接下来替换第二个repo文件:

vi /etc/yum.repos.d/CentOS-Linux-AppStream.repo

将CentOS-Linux-AppStream.repo中的appstream section下的内容替换成如下内容:

[appstream]
name=CentOS Linux $releasever - AppStream
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=AppStream&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/AppStream/$basearch/os/
baseurl=https://vault.centos.org/centos/$releasever/AppStream/$basearch/os/ 
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

然后更新yum:

yum update -y

安装依赖工具

这一步可以省略。不过有些工具在容器内部使用时还是很有作用:

yum install -y wget initscripts net-tools

安装MySQL

yum install -y mysql mysql-server

安装完毕后,使用下面的命令进行测试:

[root@4c48b7ce4425 /]# mysql --version
mysql  Ver 8.0.26 for Linux on aarch64 (Source distribution)

说明MySQL安装成功。

安装后的后续配置

查找MySQL配置文件

使用find命令查找MySQL的配置文件:

[root@4c48b7ce4425 /]# find / -name "my.cnf"
/etc/my.cnf

可以看到MySQL的配置文件路径是/etc/my.cnf

启动MySQL Server

使用systemd启动MySQL Server:

systemctl start mysqld.service

启动完成后可以使用下面的命令查看MySQL服务状态:

[root@4c48b7ce4425 /]# systemctl status mysqld.service
● mysqld.service - MySQL 8.0 database server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-04-03 15:58:19 UTC; 26s ago
  Process: 807 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS)
  Process: 677 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
  Process: 653 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
 Main PID: 760 (mysqld)
   Status: "Server is operational"
    Tasks: 38 (limit: 11909)
   Memory: 377.8M
   CGroup: /docker/4c48b7ce4425af6db96d0502d47781b664ad668b58e0675bc5c22980c3463280/docker/4c48b7ce4425af6db96d0502d47781b664ad668b58e0>
           └─760 /usr/libexec/mysqld --basedir=/usr

Apr 03 15:58:16 4c48b7ce4425 systemd[1]: Starting MySQL 8.0 database server...
Apr 03 15:58:19 4c48b7ce4425 systemd[1]: Started MySQL 8.0 database server.

命令显示MySQL Server的状态是Running。说明MySQL Server启动成功。

设置MySQL密码

在我们上面安装完成后的MySQL root用户是不需要密码就可以登录的,这显然不安全。接下来我们设置MySQL的登录密码:

首先登录MySQL:

mysql -u root

其次设置root用户的密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'your new password';

例如我将root用户的登录密码也设置为root:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';

设置完毕后退出:

exit

我们使用刚开始的命令再次登录,发现报错(提示需要密码)。说明刚刚的设置已经生效。

[root@4c48b7ce4425 /]# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

使用密码重新登录,MySQL登录成功。

[root@4c48b7ce4425 /]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 

设置远程登录

默认情况下MySQL Server仅允许localhost登录,因此我们还需要设置MySQL允许远程登录。

登录MySQL后,进入mysql数据库中:

use mysql;

更新用户表:

UPDATE user SET `Host` = '%' WHERE `User` = 'root' LIMIT 1;

强制刷新权限:

flush privileges;

查看修改结果,可以看到root用户对应的Host值已修改:

mysql> SELECT `Host`,`User` FROM user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
4 rows in set (0.00 sec)

这时MySQL的配置基本算是结束了。我们在其它主机(不是容器内部)做一下登录验证:

(还记得运行容器时的-p选项吗?我们将容器的3306端口映射为主机的10234端口)

$ mysql -uroot -p -h 192.168.31.180 -P 10234
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.26 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> 

在其它主机中登录该容器内的MySQL成功(这里需要提前知道运行该容器的宿主机ip,我这里是192.168.31.180)

制作属于自己的MySQL镜像

通过上面的一系列步骤,MySQL在容器内部的安装和后续配置已经完成了。下面我们通过docker commit命令将运行时的容器制作为一个新的镜像。

先查找到我们的容器:

$ docker ps -a
CONTAINER ID   IMAGE                   COMMAND        CREATED             STATUS             PORTS                                         NAMES
4c48b7ce4425   centos:centos8.4.2105   "/sbin/init"   About an hour ago   Up About an hour   0.0.0.0:10234->3306/tcp, :::10234->3306/tcp   mysql_demo

根据容器id,制作一个名为mysql_demo:v1.0的镜像:

$ docker commit 4c48b7ce4425 mysql_demo:v1.0
sha256:eee331acebae782d343a4bdabad00d5291c0a7a36861f7e12f3a8301767b6c91

使用docker images查看我们刚刚制作的镜像:

$ docker images mysql_demo
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
mysql_demo   v1.0      eee331acebae   37 seconds ago   1.11GB

更便捷的方式----获取制作好的结果

作者将上述制作好的镜像放在了DokcerHub中,可以使用docker pull将其拉取到本地:

docker pull liushuochen/kric-mysql:v0.1.0


版权声明:本文为TCatTime原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。