searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用Docker运行MySQL服务

2024-11-13 09:32:04
3
0

1. docker secret

敏感信息,例如账号密码,可以通过在原有环境变量后面加上 _FILE后缀来传递。这样的话,容器启动脚本会自动去 /run/secrets/<secrect_name>文件加载对应变量值。例如:

​docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

目前仅 MYSQL_ROOT_PASSWORD, MYSQL_ROOT_HOST, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD支持docker secret。

密码存储在Swarm中manager节点的Raft Database中, 方便容器引用。

  1. 从文件导入secret

    echo "pwd" > SecretFile
    docker secret create SecretName SecretFile
    
  2. 从环境变量导入

    echo "pwd" 
    docker secret create SecretName -
    
  3. 查看所有secret

    docker secret ls
    
  4. 引用docker secret

    #docker-compose.yml
    MYSQL_ROOT_PASSWORD_FILE=/run/secrets/SecretName
    

2. 数据初始化

有两种方式来存储MySQL的数据:

  • 默认是通过内置的挂载管理机制来存储,对用户来说简单透明,缺点是不方便容器之外的应用和管理工具定位和查找数据文件。

  • 用户也可以通过挂载数据目录进容器来存储数据文件,方便第三方工具查找。缺点是需要用户确保挂载的目录已存在,且正确配置目录权限以及各种安全机制。例如

    1. 创建存储目录 /my/own/datadir

    2. 通过 -v参数启动容器

      docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -d mysql:tag
      

3. 数据库初始化完成前无法建立连接

当数据库完成初始化之前,不接受任何接入的连接。在使用自动化工具启动容器的时候,例如 docker-compose,容器是同时被创建的,可能会存在连接问题。因此用户需要确保其他容器能够处理MySQL服务器挂掉或者等待服务器启动的情况,例如连接重试(connect-retry)什么的。

4. 存在旧数据库的情况

在启动一个容器实例的时候,如果数据目录已经存在了一个数据库(即存在一个 mysql子目录),那么 docker run参数应该去掉 $MYSQL_ROOT_PASSWORD,反正它不会起作用的,之前存在的数据库不会有任何改变。即使是使用 docker-compose down删除了容器再用 docker-compose启动容器,之前的数据库也不会改变。

5. 修改运行容器的用户

使用 --user参数,需要 UID或者 GID

$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

6. 不想用root用户运行容器,但需要突破文件权限控制

如果用root运行容器里进程,会有安全隐患,该进程拥有容器内全部权限;如果有文件夹挂载在宿主机,那么通过该容器就能控制宿主机的文件夹,一旦容器有漏洞被利用,后果将是严重的。
使用gosu提升指定帐户的权限

7. 重要监控指标

  1. MySQL运行时间

    指MySQL启动后持续运行时间,mysql_global_status_uptime,单位为秒

  2. QPS mysql_global_status_queries

    每秒查询率,指的是数据库每秒响应的查询次数,与TPS(Transaction Per Second)一样都是衡量数据库吞吐量的重要指标,TPS通过事务提交数事务回滚数来计算:

TPS=(Com\_commit+Com\_rollback)/Seconds
  1. 当前运行的线程数:mysql_global_status_threads_running

  2. 当前连接的线程数: mysql_global_status_threads_connected

  3. mysql_global_status_queries,数据库累计接收查询的次数,包括存储过程中内部的查询;mysql_global_status_questions 数据库累计接收查询的次数,包括存储过程中内部的查询;

    两者都不包括COM_PINGCOM_STATISTICS命令,

    • mysql_global_status_qcache_queries_in_cache:当前已缓存的查询(和响应)的数量
    • mysql_global_status_qcache_hits:累计查询时缓存命中的次数
    • mysql_global_status_qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数
    • mysql_global_status_qcache_inserts:当查询没有在缓存中命中时就需要从表中读取,并将查询与结果集缓存至内存中,此时这个计数器增加
    • mysql_global_status_qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。
    • mysql_global_status_innodb_buffer_pool_read_requests:累计执行read请求次数

    • mysql_global_status_innodb_buffer_pool_reads:累计从物理磁盘中读取数据的请求次数

      命中率=(read\_requests-reads)/read\_requests*100\%

buffer_pool是InnoDB存储引擎自带的一个缓存池,缓存的是表中的数据(热),查询数据时,首先从内存中查询,数据如果在内存中存在的话直接返回。buffer_pool设置得越大越好,一般设置为物理服务器内存的70%
Qcache缓存的是sql语句对应的结果集;

0条评论
0 / 1000
八百标兵奔北坡
1文章数
0粉丝数
八百标兵奔北坡
1 文章 | 0 粉丝
八百标兵奔北坡
1文章数
0粉丝数
八百标兵奔北坡
1 文章 | 0 粉丝
原创

使用Docker运行MySQL服务

2024-11-13 09:32:04
3
0

1. docker secret

敏感信息,例如账号密码,可以通过在原有环境变量后面加上 _FILE后缀来传递。这样的话,容器启动脚本会自动去 /run/secrets/<secrect_name>文件加载对应变量值。例如:

​docker run --name some-mysql -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root -d mysql:tag

目前仅 MYSQL_ROOT_PASSWORD, MYSQL_ROOT_HOST, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD支持docker secret。

密码存储在Swarm中manager节点的Raft Database中, 方便容器引用。

  1. 从文件导入secret

    echo "pwd" > SecretFile
    docker secret create SecretName SecretFile
    
  2. 从环境变量导入

    echo "pwd" 
    docker secret create SecretName -
    
  3. 查看所有secret

    docker secret ls
    
  4. 引用docker secret

    #docker-compose.yml
    MYSQL_ROOT_PASSWORD_FILE=/run/secrets/SecretName
    

2. 数据初始化

有两种方式来存储MySQL的数据:

  • 默认是通过内置的挂载管理机制来存储,对用户来说简单透明,缺点是不方便容器之外的应用和管理工具定位和查找数据文件。

  • 用户也可以通过挂载数据目录进容器来存储数据文件,方便第三方工具查找。缺点是需要用户确保挂载的目录已存在,且正确配置目录权限以及各种安全机制。例如

    1. 创建存储目录 /my/own/datadir

    2. 通过 -v参数启动容器

      docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -d mysql:tag
      

3. 数据库初始化完成前无法建立连接

当数据库完成初始化之前,不接受任何接入的连接。在使用自动化工具启动容器的时候,例如 docker-compose,容器是同时被创建的,可能会存在连接问题。因此用户需要确保其他容器能够处理MySQL服务器挂掉或者等待服务器启动的情况,例如连接重试(connect-retry)什么的。

4. 存在旧数据库的情况

在启动一个容器实例的时候,如果数据目录已经存在了一个数据库(即存在一个 mysql子目录),那么 docker run参数应该去掉 $MYSQL_ROOT_PASSWORD,反正它不会起作用的,之前存在的数据库不会有任何改变。即使是使用 docker-compose down删除了容器再用 docker-compose启动容器,之前的数据库也不会改变。

5. 修改运行容器的用户

使用 --user参数,需要 UID或者 GID

$ mkdir data
$ ls -lnd data
drwxr-xr-x 2 1000 1000 4096 Aug 27 15:54 data
$ docker run -v "$PWD/data":/var/lib/mysql --user 1000:1000 --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

6. 不想用root用户运行容器,但需要突破文件权限控制

如果用root运行容器里进程,会有安全隐患,该进程拥有容器内全部权限;如果有文件夹挂载在宿主机,那么通过该容器就能控制宿主机的文件夹,一旦容器有漏洞被利用,后果将是严重的。
使用gosu提升指定帐户的权限

7. 重要监控指标

  1. MySQL运行时间

    指MySQL启动后持续运行时间,mysql_global_status_uptime,单位为秒

  2. QPS mysql_global_status_queries

    每秒查询率,指的是数据库每秒响应的查询次数,与TPS(Transaction Per Second)一样都是衡量数据库吞吐量的重要指标,TPS通过事务提交数事务回滚数来计算:

TPS=(Com\_commit+Com\_rollback)/Seconds
  1. 当前运行的线程数:mysql_global_status_threads_running

  2. 当前连接的线程数: mysql_global_status_threads_connected

  3. mysql_global_status_queries,数据库累计接收查询的次数,包括存储过程中内部的查询;mysql_global_status_questions 数据库累计接收查询的次数,包括存储过程中内部的查询;

    两者都不包括COM_PINGCOM_STATISTICS命令,

    • mysql_global_status_qcache_queries_in_cache:当前已缓存的查询(和响应)的数量
    • mysql_global_status_qcache_hits:累计查询时缓存命中的次数
    • mysql_global_status_qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数
    • mysql_global_status_qcache_inserts:当查询没有在缓存中命中时就需要从表中读取,并将查询与结果集缓存至内存中,此时这个计数器增加
    • mysql_global_status_qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。
    • mysql_global_status_innodb_buffer_pool_read_requests:累计执行read请求次数

    • mysql_global_status_innodb_buffer_pool_reads:累计从物理磁盘中读取数据的请求次数

      命中率=(read\_requests-reads)/read\_requests*100\%

buffer_pool是InnoDB存储引擎自带的一个缓存池,缓存的是表中的数据(热),查询数据时,首先从内存中查询,数据如果在内存中存在的话直接返回。buffer_pool设置得越大越好,一般设置为物理服务器内存的70%
Qcache缓存的是sql语句对应的结果集;

文章来自个人专栏
Docker容器服务部署
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0