目录
这是一篇制作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端口。 |
| --privileged | privileged=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