基于docker安装MySQL(openEuler系统)

基于docker安装MySQL(openEuler系统)

实验环境

操作系统 docker版本 MySQL版本
openEuler docker-26.1.4.tgz MySQL8.0+

基于openEuler安装docker

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

1、下载docker源码包。

shell 复制代码
[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。

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

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

shell 复制代码
[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的镜像加速器。

shell 复制代码
[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。

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

基于docker安装MySQL

1、拉取MySQL镜像。

shell 复制代码
[root@docker-mysql ~]# docker pull mysql

2、启动MySQL容器。

shell 复制代码
[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; 命令查看数据库引擎。

相关推荐
一直C2 小时前
Linux网络编程|HTTP协议详解(报文、请求方法、状态码)
linux·http·wireshark·vim·visual studio
爱吃火鸡面呀3 小时前
MySQL DQL 子查询详解:从标量、列、行到表子查询的完整实战
大数据·数据库·mysql
Brilliantwxx4 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
欧米欧5 小时前
Linux基础指令上
linux·运维·服务器
ARM|X86+FPGA工业主板厂家6 小时前
基于嵌入式 GPU 的智能服务机器人
linux·运维·arm开发·fpga开发·机器人
sulikey6 小时前
Linux 粘滞位(Sticky Bit)完全指南:为什么共享目录需要“防删除“?
linux·服务器
devilnumber6 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle
mengge.cloud6 小时前
网络技术基础小白教程
linux·服务器·网络·云计算
—Miss. Z—6 小时前
计算机等级考试三级数据库技术—选择题
数据库·mysql