基于docker安装MySQL(openEuler系统)

实验环境

操作系统docker版本MySQL版本
openEulerdocker-26.1.4.tgzMySQL8.0+

基于openEuler安装docker

​ 本篇文章,我们通过源码包的方式安装docker。操作步骤如下。

1、下载docker源码包。

[root@docker-mysql ~]#mkdir -p /opt/src && cd /opt/src		//创建安装目录
[root@docker-mysql src]#wget https://download.docker.com/linux/static/stable/x86_64/docker-26.1.4.tgz	//下载源码包

2、安装docker。

[root@docker-mysql src]# tar -xf docker-26.1.4.tgz 		//解压源码包
[root@docker-mysql src]# cp docker/* /usr/bin/		//复制进可执行程序中

3、手搓systemd配置文件,目的为使用systemctl对docker进行管理。

[root@docker-mysql src]# cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF

​ 参数解释如下:

  1. [Unit] 段 - 服务描述和依赖

Description=Docker Application Container Engine
作用:服务的描述信息
显示位置:systemctl status 时显示的服务名称
用途:方便管理员识别服务

Documentation=https://docs.docker.com
作用:指定服务文档的 URL
显示位置:systemctl status docker 时会显示
用途:快速访问官方文档

After=network-online.target firewalld.service
作用:定义服务启动顺序,确保这些服务先启动
network-online.target:网络完全就绪(有 IP 地址)
firewalld.service:防火墙服务
注意:只是启动顺序,不强制依赖(即使这些服务失败,Docker 仍会启动)

Wants=network-online.target
作用:声明弱依赖关系
区别:
Wants:目标服务启动失败不影响本服务
Requires:目标服务失败则本服务也不启动
含义:尽量在网络就绪后启动,但不是强制要求

  1. [Service] 段 - 运行行为控制

Type=notify
作用:服务启动完成后通过 sd_notify() 通知 systemd
原理:Docker 启动完成后会向 systemd 发送"我已就绪"信号
好处:systemd 能准确知道服务何时真正可用,而不是进程启动就算成功
替代值:simple(默认,进程启动就算成功)、forking(父进程退出即成功)

ExecStart=/usr/bin/dockerd
作用:启动服务时执行的命令
路径:Docker 守护进程的主程序
注意:必须是绝对路径

ExecReload=/bin/kill -s HUP $MAINPID
作用:执行 systemctl reload docker 时的操作
HUP 信号:让 Docker 重新加载配置文件(如 daemon.json)
$MAINPID:systemd 自动替换为主进程 PID
特点:不重启进程,平滑重载

LimitNOFILE=infinity
作用:打开文件数限制(ulimit -n)
infinity:不限制
重要性:Docker 需要大量文件句柄(容器镜像层、日志等)
默认值:1024(远不够用)

LimitNPROC=infinity
作用:进程数限制(ulimit -u)
infinity:不限制
重要性:每个容器都有多个进程,限制过小会阻止容器启动
默认值:通常 4096

LimitCORE=infinity
作用:核心转储文件大小限制(ulimit -c)
infinity:不限制
用途:调试时生成 core dump 文件分析崩溃原因

TimeoutStartSec=0
作用:启动超时时间
0:永不超时
原因:Docker 启动可能需要拉取镜像、初始化存储驱动,时间不确定
默认值:90秒(可能导致大型环境启动失败)

Delegate=yes
作用:将 cgroup 控制权 委托给 Docker
含义:Docker 可以自己管理容器的 cgroup 子系统
重要性:支持 docker run 的 --cpus、–memory 等资源限制
不设置:Docker 无法正确管理容器资源

KillMode=process
作用:停止服务时的杀进程策略
process:只杀主进程(dockerd),保留子进程(容器)
替代值:
control-group:杀整个 cgroup(危险,会杀掉所有容器)
mixed:先发 SIGTERM 给主进程,再杀 cgroup
重要性:防止 systemctl stop docker 时误杀运行中的容器

Restart=on-failure
作用:重启策略
on-failure:仅当退出码非 0 或信号异常时重启
其他值:
always:任何情况都重启(包括正常停止)
no:不重启
on-success:仅正常退出(0)不重启
适用场景:程序崩溃、OOM 等异常

StartLimitBurst=3
作用:限制启动失败次数
含义:在 StartLimitInterval 内允许失败 3 次
注意:此参数在 systemd 230+ 已弃用,建议改用 StartLimitBurst=3(去掉 s)

StartLimitInterval=60s
作用:统计启动失败的时间窗口
含义:60 秒内失败 3 次(StartLimitBurst)则停止尝试
效果:防止服务频繁崩溃导致系统资源耗尽
达到限制后:服务状态变为 failed,需手动 systemctl reset-failed

  1. [Install] 段 - 安装配置

WantedBy=multi-user.target
作用:服务默认启动级别
含义:系统进入多用户模式(runlevel 3)时自动启动
效果:systemctl enable docker 会创建符号链接到 /etc/systemd/system/multi-user.target.wants/
等价:传统的 chkconfig --add 和 update-rc.d

4、配置docker的镜像加速器。

[root@docker-mysql src]# cat /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.sunzishaokao.com",
    "https://docker.211678.top",
    "https://docker.1panel.live",
    "https://hub.rat.dev",
    "https://docker.m.daocloud.io",
    "https://do.nark.eu.org",
    "https://dockerpull.com",
    "https://dockerproxy.cn",
    "https://docker.awsl9527.cn",
    "https://docker.imgdb.de",
    "https://docker-0.unsee.tech",
    "https://docker.hlmirror.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

5、启动docker。

[root@docker-mysql src]# systemctl daemon-reload 	//重启systemctl守护进程
[root@docker-mysql src]# systemctl enable --now docker.service 		//启动docker服务,并设置开机自启

基于docker安装MySQL

1、拉取MySQL镜像。

[root@docker-mysql ~]# docker pull mysql

2、启动MySQL容器。

[root@docker-mysql mysql]# docker run -d -p 3306:3306 --name mysql --restart=always --privileged=true \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql

参数解释如下:

  1. -d
    后台运行容器,容器放到后台执行,SSH 终端关闭容器不会停止。

命令里出现两次 -d,属于书写失误,保留一个即可。

  1. -p 3306:3306
    端口映射:
  • 左边:宿主机物理机端口 3306
  • 右边:容器内部 MySQL 端口 3306
    外部访问服务器 3306,流量转发到容器 mysql。
  1. --name mysql
    自定义容器名称,docker psdocker logs mysqldocker exec -it mysql bash 直接用名字操作。
  2. --restart=always
    docke容器的重启策略:
  • 容器无论什么原因停止,都会自动重启;
  • docker 服务重启、服务器开机,容器自动拉起。
    其他可选:on-failure 只有异常崩溃才重启。
  1. --privileged=true
    特权模式,容器内获得接近宿主机 root 权限。

mysql 绝大多数场景不需要这个参数,生产环境不推荐开启,有安全风险,测试环境无所谓,可以直接删掉

  1. -v 宿主机路径:容器路径(volume 挂载)
  • -v /mydata/mysql/conf:/etc/mysql/conf.d
    宿主机放自定义 cnf 配置文件,挂载到 mysql 读取配置片段的目录,这个写法是正确的,不会覆盖容器主配置

  • -v /mydata/mysql/data:/var/lib/mysql
    MySQL 真实的数据文件存放位置,数据库、表全部在这里。容器删除,宿主机文件还在,数据持久化。

  • -v /mydata/mysql/logs:/var/log/mysql
    mysql 日志(错误日志、慢查询日志)持久化到宿主机。

  1. -e MYSQL_ROOT_PASSWORD=123456
    环境变量,mysql 镜像初始化必须,设置 root 账号密码。
  2. mysql
    镜像名称,不带 tag 默认拉取 mysql:latest

测试验证

​ 1、使用navicat等工具进行连接测试,如图所示。

在这里插入图片描述

​ 2、使用navicat新建查询,使用 show engines; 命令查看数据库引擎。

在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构