【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

数据库操作

远程连接数据库,创建一个数据库,一个表
【docker实战】02 用docker安装mysql_第1张图片
发现远程连接宿主机的3306端口连接不上,这是什么原因呢
查了一下,说的是,在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
dbeaver连接设置如下,设置好后,连接成功了
【docker实战】02 用docker安装mysql_第2张图片
通过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'

你可能感兴趣的:(docker,实战,docker,mysql,容器)