【docker实战】02 用docker安装mysql

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

一、镜像搜索

先搜索一下mysql有哪些镜像

bash 复制代码
[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,点击查看官网的说明文档链接

二、拉取镜像

拉取

bash 复制代码
[root@localhost ~]# docker pull bitnami/mysql

查看镜像

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

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

bash 复制代码
docker run \
    -e ALLOW_EMPTY_PASSWORD=yes \
    -v /path/to/mysql-persistence:/bitnami/mysql/data \
    bitnami/mysql:latest

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

通过docker-compose

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

yaml 复制代码
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参数设置了一系列的环境变量

bash 复制代码
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
bash 复制代码
-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 文件

以下的启动参数基本是一个可以实际使用的命令.但是还需要配置一些其它的额外参数. 这里贴出我的配置:

bash 复制代码
[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' 是为中国区的程序员准备的. 这样可以写入正确的默认值.

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

bash 复制代码
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启动的,可以通过下面命令查看日志

bash 复制代码
docker logs mysql

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

bash 复制代码
docker-compose logs mysql

七、实操

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

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

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

准备工作

bash 复制代码
#拉取镜像
[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启动起来

bash 复制代码
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

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

bash 复制代码
#先看有没有启动成功
[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.
...略...

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

可以看到文件都有了

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

数据库操作

远程连接数据库,创建一个数据库,一个表

发现远程连接宿主机的3306端口连接不上,这是什么原因呢

查了一下,说的是,在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;

dbeaver连接设置如下,设置好后,连接成功了

通过dbeaver来创建一个数据库,一个表

sql 复制代码
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);

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

bash 复制代码
[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容器误删演练

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

bash 复制代码
[root@localhost data]# docker stop mysql
mysql
[root@localhost data]# docker rm mysql
mysql

再重新启动容器

bash 复制代码
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进程自动启动

bash 复制代码
 systemctl enable docker

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

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

思考

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

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'
相关推荐
wand codemonkey1 小时前
SpringbootWeb【入门】+MySQL【安装】+【DataDrip安装 】+【连接MySQL】
java·mysql·mybatis
风落无尘8 小时前
Stable Diffusion WebUI & ComfyUI 完整安装教程:官方部署+一键整合包+Docker容器化(2026最新)
docker·容器·stable diffusion
廿一夏9 小时前
MySql存储引擎与索引
数据库·sql·mysql
敲个大西瓜11 小时前
Java项目常用数据归档方式
mysql
CodeMartain13 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
kyriewen13 小时前
面试官让我查各部门工资最高的员工,我用AI三秒写出窗口函数,他愣了
后端·mysql·面试
小码工作室14 小时前
使用 HAVING 进行 MySQL 集合筛选
mysql
罗超驿14 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
万里侯14 小时前
云原生数据备份与恢复:保障数据安全的最佳实践
微服务·容器·k8s
llrraa201014 小时前
配置docker国内镜像源
运维·docker·容器