【docker实战】02 用docker安装mysql

本示例采用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'

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章

项目需求 ●目前大棚主要通过人为手动控温度、控水、控光照、控风,希望通过物联网技术在保障产量的前提下,提高作业效率,降低大棚总和管理成本。 ●释放部分劳动力,让农户有精力管理更多大棚,进而增加农户收入。 ●…

Azure 学习总结

文章目录 1. Azure Function1.1 Azure Function 概念1.2 Azure Function 实现原理1.3 Azure Function 本地调试1.4 Azure Function 云部署 2. Azure API Managment 概念 以及使用2.1 Azure API 概念2.2 Azure API 基本使用 3. Service Bus 应用场景及相关特性3.1 Service Bus 基…

golang并发安全-sync.map

sync.map解决的问题 golang 原生map是存在并发读写的问题,在并发读写时候会抛出异常 func main() {mT : make(map[int]int)g1 : []int{1, 2, 3, 4, 5, 6}g2 : []int{4, 5, 6, 7, 8, 9}go func() {for i : range g1 {mT[i] i}}()go func() {for i : range g2 {mT[…

Flink1.17实战教程(第七篇:Flink SQL)

系列文章目录 Flink1.17实战教程(第一篇:概念、部署、架构) Flink1.17实战教程(第二篇:DataStream API) Flink1.17实战教程(第三篇:时间和窗口) Flink1.17实战教程&…

2023年12月27日学习记录_加入噪声

目录 1、今日计划学习内容2、今日学习内容1、add noise to audio clipssignal to noise ratio(SNR)加入 additive white gaussian noise(AWGN)加入 real world noises 2、使用kaggel上的一个小demo:CNN模型运行时出现的问题调整采样率时出现bug 3、明确90dB下能否声…

[递归回溯枚举] 装载问题

装载问题 题目描述 有一批共 n 个集装箱要装上 2 艘载重量分别为 c1和 c2的轮船,其中集装箱 i 的重量为 wi,且 装载问题要求确定,是否有一个合理的装在方案可将这 n 个集装箱装上这 2 艘轮船。如果有,找出最优装载方案。 关于输…

14 Arbitration in sequencer(仲裁)

uvm_sequencer 有一个内置机制,可以在sequencer上同时运行的sequence中进行仲裁。基于仲裁算法,sequencer将得到仲裁权的sequence的sequence_item发送到driver。 每个sequence发送的sequence_items也有自己的id来区别于其他sequence。 要设置特定的仲裁…

Apipost-Helper使用流程

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

JavaWeb——监听器Listener 过滤器Filter——韩顺平学习笔记

文章目录 JavaWeb 三大组件之监听器 ListenerListenerJavaWeb 的监听器ServletContextListener 监听器ServletContextAttributeListener 监听器其它监听器-使用较少HttpSessionListener 监听器HttpSessionAttributeListener 监听器ServletRequestListener 监听器ServletRequest…

泰迪智能科技分享:AI大模型发展趋势分析

大规模预训练语言模型,也被称为“大模型”或“基座模型”,其特点在于拥有巨大的参数量,构成了复杂的人工神经网络模型。大模型具有规模性(参数量大)、涌现性(产生预料之外的新能力)以及通用性&a…

uni-app condition启动模式配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应,是什么样的状态 (成功,失败,其他的情况&…

Graph Transformer2023最新研究成果汇总,附15篇必看论文

图Transformer是一种结合了Transformer模型和图神经网络(GNN)的框架,用于在图形结构数据上执行预测任务。在图Transformer中,Transformer的自注意力机制被用来学习节点之间的关系,而GNN则被用来生成节点的嵌入表示。通…

数据结构与算法(C语言版)P10——图

1、图的基本概念和术语 前面学过: 线性是一对一树形是一对多 而今天要学习的图形结构是多对多。 图的定义: G(V,E) V:顶点(数据元素)的__有穷非空__集合。E:边的有穷集合。 __有向图:__每条边都是有方向的 __无…

【linux】touch的基本使用

碎碎念 刚接触linux时候的几个最基础的命令之一,用来创建文件。如果使用touch --help的时候会发现作者对于touch的简介:Update the access and modification times of each FILE to the current time.用于修改文件的访问和时间戳 带我的leader属于那种…

rsync的介绍与使用

rsync的介绍与使用 一、简介 rsync(remote synchronize)是Liunx/Unix下的一个远程数据同步工具。它能够以非常高效的方式传输和同步文件,它可以将一个目录的文件快速地同步到另一个目录,还可以通过网络快速同步多台主机间的文件…

使用Python Flask搭建一个简单的Web站点并发布到公网上访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程…

springBoot整合redis做缓存

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。和Memcache类似,但很大程度补偿了Memcache的不足。和Memcache一样,R…

TDengine 公布 2023 年发展“成绩”,六大亮点引人瞩目

今天,我们进行了 2023 年重大成就和发展成绩盘点,主要归纳为产品创新、市场发展、开源社区、生态建设、活动布道与奖项荣誉六大维度。在元旦前夕,我们也想把这份“2023 年成绩单”分享给所有关注 TDengine 的朋友们。 在今年,最值…

你好!Apache Seata

北京时间 2023 年 10 月 29 日,分布式事务开源项目 Seata 正式通过 Apache 基金会的投票决议,以全票通过的优秀表现正式成为 Apache 孵化器项目! 根据 Apache 基金会邮件列表显示,在包含 13 个约束性投票 (binding votes) 和 6 个…