【docker实战】02 用docker安装mysql

news2025/7/15 7:34:35

本示例采用bitnami的镜像进行安装MySQL

一、镜像搜索

先搜索一下mysql有哪些镜像

[root@localhost ~]# docker search mysql
NAME                            DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   14734     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5621      [OK]       
percona                         Percona Server is a fork of the MySQL relati…   623       [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   919       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                       105                  [OK]

bitnami是一个比较好的镜像制作机构,其文档也比较完善,所以我们用bitnami/mysql作为示例来安装mysql,点击查看官网的说明文档链接

二、拉取镜像

拉取

[root@localhost ~]# docker pull bitnami/mysql

查看镜像

[root@localhost ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
bitnami/mysql       latest    cc987bd64212   4 weeks ago     680MB

三、运行msyql容器

可以通过两种方式来运行我们的容器docker run命令行,或者docker-compose

通过docker run

官网的一个示例是这么运行

docker run \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -v /path/to/mysql-persistence:/bitnami/mysql/data \
    bitnami/mysql:latest

我们需要将宿主机的一个目录

通过docker-compose

需要提前安装好docker-compose,如果不清楚怎么安装,点击这里查看安装说明

version: '2'

networks:
  app-tier:
    driver: bridge

services:
  mysql:
    image: 'bitnami/mysql:latest'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
    networks:
      - app-tier
  myapp:
    image: 'YOUR_APPLICATION_IMAGE'
    networks:
      - app-tier

四、重要的环境变量

下面的示例中,展示了在docker run 启动容器时,通过-e参数设置了一系列的环境变量

docker run -d \
    -p 3306:3306 \
    --name mysql \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e MYSQL_ROOT_PASSWORD=yourrootpassword \
    -e MYSQL_CHARACTER_SET=utf8mb4 \
    -e MYSQL_COLLATE=utf8mb4_general_ci \
    -e MYSQL_ENABLE_SLOW_QUERY=1 \
    -e MYSQL_LONG_QUERY_TIME=5.0 \
    -e TZ=Asia/Shanghai \
    -v /path/to/persitence-data:/bitnami/mysql/data \
    -v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    bitnami/mysql:latest
-d 后台运行
-p 3306:3306: 把docker镜像内部的3306端口映射到宿主机的3306端口.
--name mysql docker实例的名字
-e ALLOW_EMPTY_PASSWORD=yes 让mysql可以使用空密码进行链接. 即可以使用没有密码的账号.
-e MYSQL_ROOT_PASSWORD=yourrootpassword 设置好新mysql 实例的root 账号密码.
-e MYSQL_CHARACTER_SET=utf8mb4 把数据库的默认字符编码修改为utf8b4 , 如果不修改,默认的设置是utf8
-e MYSQL_COLLATE=utf8mb4_general_ci 同上.
-e MYSQL_ENABLE_SLOW_QUERY=1 开启慢查询日志.
-e MYSQL_LONG_QUERY_TIME=5.0 慢查询日志的query 时间阈值. 默认值是10.0秒, 这里设置为5秒
-e TZ=Asia/Shanghai 重要: 设置 Mysql Docker实例的系统时区. 如果不设置,其默认的时区将会为UTC
-v /path/to/persitence-data:/bitnami/mysql/data 持久化配置. 把mysql的数据存储到宿主机的相关的目录.
-v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro 把镜像内部的自定义的my_custom.cnf文件映射到宿主机上.且docker内部是只读权限.
bitnami/mysql:5.7.43-debian-11-r73 最后的镜像名称.

五、修改配置文件

bitnami的mysql配置文件是在容器的
/opt/bitnami/mysql/conf/my_custom.cnf 这个位置
如何修改这个配置文件呢
第一步:宿主机上新建一个my_custom.cnf 文件
以下的启动参数基本是一个可以实际使用的命令.但是还需要配置一些其它的额外参数. 这里贴出我的配置:

[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'

一个是修改最大的包大小,这个在一些特别大的数据插入与查询时会用到. RC 隔离级别是 Confluence所要求的. 最后的 default_time_zone = ‘+08:00’ 是为中国区的程序员准备的. 这样可以写入正确的默认值.

第二步:将宿主机上的文件挂载到容器内部

docker run --name mysql \
    -p 3306:3306 \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -v /path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    -v /path/to/mysql-persistence:/bitnami/mysql/data \
    bitnami/mysql:latest

配置参数 - my_custom.cnf

六、日志

通过docker启动的,可以通过下面命令查看日志

docker logs mysql

通过docker-compose启动的,可以通过下面命令查看日志

docker-compose logs mysql

七、实操

我们给自己定下如下目标:

  • 设置好数据存储的挂载到宿主机
  • 设置好用户名和密码
  • 端口号映射到宿主机的3306
  • 自定义一个配置文件挂载到容器my_custom.cnf
  • 系统重启时,自动启动mysql容器
  • 容器被误删除时,数据还在

通过docker run 启动一个mysql容器,实现上述功能

准备工作

#拉取镜像
[root@localhost ~]# docker pull bitnami/mysql
#创建配置文件
[root@localhost ~]# mkdir -p /opt/bitnami/mysql/conf
[root@localhost ~]# cd /opt/bitnami/mysql/conf
[root@localhost conf]# touch my_custom.cnf
[root@localhost conf]# vim my_custom.cnf 
[root@localhost conf]# cat my_custom.cnf 
#配置文件如下
[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'
#创建一个挂载目录
[root@localhost conf]# mkdir -p /bitnami/mysql/data
#设置目录和文件的权限
[root@localhost data]# chmod 777 /bitnami/mysql/data/
[root@localhost data]# chmod 777 /opt/bitnami/mysql/conf/my_custom.cnf

运行容器

其中–restart=always表示,重启系统后,只要docker进程自动启动,那就可以把mysql启动起来

docker run -d \
    -p 3306:3306 \
    --name mysql \
    ##--restart=always \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e MYSQL_ROOT_PASSWORD=123456\
    -e MYSQL_CHARACTER_SET=utf8mb4 \
    -e MYSQL_COLLATE=utf8mb4_general_ci \
    -e TZ=Asia/Shanghai \
    -v /bitnami/mysql/data:/bitnami/mysql/data \
    -v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    bitnami/mysql:latest

查看一下日志,主要看看有没有报错啥的,有报错的话,根据报错信息,修改上面的启动命令,比如环境变量有没有设置错的

#先看有没有启动成功
[root@localhost data]# docker ps
CONTAINER ID   IMAGE                  COMMAND                   CREATED              STATUS              PORTS                                       NAMES
9f8eadad1226   bitnami/mysql:latest   "/opt/bitnami/script…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql
#再查看日志
[root@localhost conf]# docker logs mysql
mysql 20:54:45.86 INFO  ==> 
mysql 20:54:45.86 INFO  ==> Welcome to the Bitnami mysql container
mysql 20:54:45.86 INFO  ==> Subscribe to project updates by watching https://github.com/bitnami/containers
mysql 20:54:45.86 INFO  ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues
mysql 20:54:45.86 INFO  ==> 
mysql 20:54:45.86 INFO  ==> ** Starting MySQL setup **
mysql 20:54:45.90 INFO  ==> Validating settings in MYSQL_*/MARIADB_* env vars
mysql 20:54:45.90 WARN  ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment.
mysql 20:54:45.90 ERROR ==> root user is already created in the database and you can't use it as username for user creation.
...略...

查看一下我们的宿主机的挂载目录,是不是有了数据库的文件了
可以看到文件都有了

[root@localhost data]# pwd
/bitnami/mysql/data
[root@localhost data]# ls -al
总用量 95700
drwxrwxrwx. 7 root root     4096 1227 08:13  .
drwxr-xr-x. 3 root root       18 1227 07:53  ..
-rw-r-----. 1 1001 root       56 1227 08:12  auto.cnf
-rw-r-----. 1 1001 root     1814 1227 08:13  binlog.000001
-rw-r-----. 1 1001 root      180 1227 08:13  binlog.000002
-rw-r-----. 1 1001 root      157 1227 08:13  binlog.000003
-rw-r-----. 1 1001 root       48 1227 08:13  binlog.index
-rw-------. 1 1001 root     1680 1227 08:12  ca-key.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  ca.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  client-cert.pem
-rw-------. 1 1001 root     1680 1227 08:12  client-key.pem
-rw-r-----. 1 1001 root   196608 1227 08:13 '#ib_16384_0.dblwr'
-rw-r-----. 1 1001 root  8585216 1227 08:13 '#ib_16384_1.dblwr'
-rw-r-----. 1 1001 root     8001 1227 08:13  ib_buffer_pool
-rw-r-----. 1 1001 root 12582912 1227 08:13  ibdata1
-rw-r-----. 1 1001 root 12582912 1227 08:13  ibtmp1
drwxr-x---. 2 1001 root     4096 1227 08:13 '#innodb_redo'
drwxr-x---. 2 1001 root      187 1227 08:13 '#innodb_temp'
drwxr-x---. 2 1001 root      143 1227 08:13  mysql
-rw-r-----. 1 1001 root 30408704 1227 08:13  mysql.ibd
-rw-r-----. 1 1001 root        5 1227 08:13  mysql_upgrade_info
drwxr-x---. 2 1001 root     8192 1227 08:12  performance_schema
-rw-------. 1 1001 root     1680 1227 08:12  private_key.pem
-rw-r--r--. 1 1001 root      452 1227 08:12  public_key.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  server-cert.pem
-rw-------. 1 1001 root     1680 1227 08:12  server-key.pem
drwxr-x---. 2 1001 root       28 1227 08:13  sys
-rw-r-----. 1 1001 root 16777216 1227 08:13  undo_001
-rw-r-----. 1 1001 root 16777216 1227 08:13  undo_002

数据库操作

远程连接数据库,创建一个数据库,一个表
在这里插入图片描述
发现远程连接宿主机的3306端口连接不上,这是什么原因呢
查了一下,说的是,在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
dbeaver连接设置如下,设置好后,连接成功了
在这里插入图片描述
通过dbeaver来创建一个数据库,一个表

CREATE DATABASE `test`;
USE test;
CREATE TABLE `project` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL,
  `status` bit(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO test.project (id,name,status) VALUES(1,'项目1',1);

进入容器通过命令行查看数据

[root@localhost data]# docker exec -it mysql /bin/bash
I have no name!@9f8eadad1226:/$ mysql -uroot -p
Enter password: 
...略...
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from project;
+----+---------+----------------+
| id | name    | status         |
+----+---------+----------------+
|  1 | 项目1   | 0x01           |
+----+---------+----------------+
1 row in set (0.00 sec)

mysql容器误删演练

重点:删除容器,宿主机的挂载文件不会删除

[root@localhost data]# docker stop mysql
mysql
[root@localhost data]# docker rm mysql
mysql

再重新启动容器

docker run -d \
    -p 3306:3306 \
    --name mysql \
    --restart=always \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -e MYSQL_ROOT_PASSWORD=123456\
    -e MYSQL_CHARACTER_SET=utf8mb4 \
    -e MYSQL_COLLATE=utf8mb4_general_ci \
    -e TZ=Asia/Shanghai \
    -v /bitnami/mysql/data:/bitnami/mysql/data \
    -v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \
    bitnami/mysql:latest

这次多了–restart=always,我们等会重启系统时,mysql会自动重启(前提开启docker进程自动启动 systemctl enable docker)

新建一个容器,指定数据文件挂载点,检查数据是否还在。经过测试,数据依然还在的。

服务器重启演练

前提开启docker进程自动启动

 systemctl enable docker

重启操作系统,可以看到mysql随着系统启动,自动启起来了

到这里,我们的MySQL就安装完成了

思考

如果通过docker-compose,那这个yaml应该怎么写呢

version: '2'
services:
  mysql:
    image: 'bitnami/mysql:latest'
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=my_password
      - MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password
    ports:
      - '15672:15672'
    volumes:
      - '/path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf'
      - '/path/to/mysql-persistence:/bitnami/mysql/data'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统【设备管理】

设备管理 一、前言 学习了存储器管理后,继续学习设备管理,设备管理的主要功能有缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等,由于I/O设备不仅种类繁多,而且他们的特性和操作方式往往相差甚大,使得设…

leetcode贪心算法题总结(一)

此系列分三章来记录leetcode的有关贪心算法题解,题目我都会给出具体实现代码,如果看不懂的可以后台私信我。 本章目录 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列5.最长递增子序列6.递增的三元子序列7.最长连续递增序列8.买卖股票的最…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

数据探查系列:如何进行有意义的探索性数据分析(EDA)

如何进行有意义的探索性数据分析&#xff08;EDA&#xff09; 目录 1. 设置 1.1 导入库1.2 导入数据1.3 数据集特征1.4 数据集属性 2. 探索训练集和测试集 2.1 训练集 - 快速概览2.2 训练集 - 基本统计2.3 测试集 - 快速概览2.4 测试集 - 基本统计 3. 特征分布4. 数据不平衡检查…

【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代

目录 前言 机器视觉 缺陷检测 工业上常见缺陷检测方法 内容简介 作者简介 目录 读者对象 如何阅读本书 获取方式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 机器视觉…

深入探索MongoDB集群模式:从高可用复制集

MongoDB复制集概述 MongoDB复制集主要用于实现服务的高可用性&#xff0c;与Redis中的哨兵模式相似。它的核心作用是数据的备份和故障转移。 复制集的主要功能 数据复制&#xff1a;数据写入主节点&#xff08;Primary&#xff09;时&#xff0c;自动复制到一个或多个副本节…

Flask 日志

flask 日志 代码源码源自编程浪子flask点餐小程序代码 记录用户访问日志 和 错误日志 这段代码是一个基于Flask框架的日志服务类&#xff0c;用于 记录用户访问日志 和 错误日志。代码中定义了一个名为LogService的类&#xff0c;其中包含了两个静态方法&#xff1a;addAcc…

Spring Boot 中的虚拟线程

在本文中&#xff0c;我将讨论 Spring Boot 中的虚拟线程。 什么是虚拟线程&#xff1f; 虚拟线程作为 Java 中的一项功能引入&#xff0c;旨在简化并发性。 Virtual threads 是 轻量级的线程&#xff0c;由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且…

Linux下安装QQ

安装步骤&#xff1a; 1.进入官网&#xff1a;QQ Linux版-轻松做自己 2.选择版本&#xff1a;X86版下载dep 3安装qq 找到qq安装包位置&#xff0c;然后右击在终端打开输入安装命令&#xff0c;然后点击回车 sudo dpkg -i linuxqq_3.2.0-16736_amd64.deb 卸载qq 使用命令…

游泳耳机哪个牌子好,盘点2024最值得购买的游泳耳机

一款好的游泳耳机能让你在水中尽情畅游&#xff0c;同时享受到美妙的音乐。在选购游泳耳机时&#xff0c;防水性能、音质、舒适度和续航能力是至关重要的因素。接下来&#xff0c;我将为你介绍几款在这些方面都有出色表现的游泳耳机。 1. 南卡骨传导耳机 推荐理由&#xff1a…

软件测试/测试开发丨Pytest测试用例生命周期管理-Fixture

1、Fixture 用法 Fixture 特点及优势 1&#xff64;命令灵活&#xff1a;对于 setup,teardown,可以不起这两个名字2&#xff64;数据共享&#xff1a;在 conftest.py 配置⾥写⽅法可以实现数据共享&#xff0c;不需要 import 导⼊。可以跨⽂件共享3&#xff64;scope 的层次及…

图像处理-周期噪声

周期噪声 对于具有周期性的噪声被称为周期噪声&#xff0c;其中周期噪声在频率域会出现关于中心对称的性质&#xff0c;如下图所示 带阻滤波器 为了消除周期性噪声&#xff0c;由此设计了几种常见的滤波器&#xff0c;其中 W W W表示带阻滤波器的带宽 理想带阻滤波器 H ( u …

SNP Glue新Saas技术在云数据集成中如何提升客户价值

■ 新Glue版本可作为软件即服务(SaaS)应用程序使用 ■ SAP数据和非SAP数据源之间的云原生集成大大简化了客户的企业数据集成 ■ SNP Glue通过应对AI和大数据计划中的关键挑战来增强云数据集成的价值 德国&#xff0c;海德堡 —— 2023年11月29日&#xff0c;作为SAP环境中数…

Linux内核定时器-模块导出符号表

Linux内核定时器 定时器的当前时间如何获取&#xff1f; jiffies:内核时钟节拍数 jiffies是在板子上电这一刻开始计数&#xff0c;只要 板子不断电&#xff0c;这个值一直在增加&#xff08;64位&#xff09;。在 驱动代码中直接使用即可。 定时器加1代表走了多长时间&#xff…

javaEE -19(9000 字 JavaScript入门 - 4)

一&#xff1a; jQuery jQuery是一个快速、小巧且功能丰富的JavaScript库。它旨在简化HTML文档遍历、事件处理、动画效果以及与后端服务器的交互等操作。通过使用jQuery&#xff0c;开发者可以以更简洁、更高效的方式来编写JavaScript代码。 jQuery提供了许多易于使用的方法和…

腾讯云轻量应用服务器优缺点介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

【 C语言 】 | C程序百例

【 C语言 】 | C程序百例 时间&#xff1a;2023年12月28日13:50:43 文章目录 【 C语言 】 | C程序百例1.参考2.练习 1.参考 1.【 C语言 】 | C程序百例-CSDN博客 2.100Example: C程序百例-酷勤网&#xff08;kuqin.com&#xff09;提供.pdf (gitee.com) 3.cProgram/LinuxC - 码…

[JS设计模式] Module Pattern

随着应用程序和代码库的增长&#xff0c;保持代码的可维护性和模块化变得越来越重要。模块模式允许将代码分成更小的、可重用的部分。 除了能够将代码分割成更小的可重用部分之外&#xff0c;模块还允许将文件中的某些值保留为私有。默认情况下&#xff0c;模块内的声明范围(封…

Qt编写的exe程序上添加程序信息

1、qtcreator编写 在pro文件中添加如下信息 # 版本信息 VERSION 4.0.2.666# 图标 RC_ICONS Images/MyApp.ico# 公司名称 QMAKE_TARGET_COMPANY "Digia"# 产品名称 QMAKE_TARGET_PRODUCT "Qt Creator"# 文件说明 QMAKE_TARGET_DESCRIPTION "Qt …

Android : 画布的使用 简单应用

示例图&#xff1a; MyView.java&#xff1a; package com.example.demo;import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Vi…