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中, 方便容器引用。
-
从文件导入secret
echo "pwd" > SecretFile docker secret create SecretName SecretFile
-
从环境变量导入
echo "pwd" docker secret create SecretName -
-
查看所有secret
docker secret ls
-
引用docker secret
#docker-compose.yml MYSQL_ROOT_PASSWORD_FILE=/run/secrets/SecretName
2. 数据初始化
有两种方式来存储MySQL的数据:
-
默认是通过内置的挂载管理机制来存储,对用户来说简单透明,缺点是不方便容器之外的应用和管理工具定位和查找数据文件。
-
用户也可以通过挂载数据目录进容器来存储数据文件,方便第三方工具查找。缺点是需要用户确保挂载的目录已存在,且正确配置目录权限以及各种安全机制。例如
-
创建存储目录
/my/own/datadir
-
通过
-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. 重要监控指标
-
MySQL运行时间
指MySQL启动后持续运行时间,
mysql_global_status_uptime
,单位为秒 -
QPS
mysql_global_status_queries
每秒查询率,指的是数据库每秒响应的查询次数,与TPS(Transaction Per Second)一样都是衡量数据库吞吐量的重要指标,TPS通过事务提交数和事务回滚数来计算:
-
当前运行的线程数:
mysql_global_status_threads_running
-
当前连接的线程数:
mysql_global_status_threads_connected
-
mysql_global_status_queries
,数据库累计接收查询的次数,包括存储过程中内部的查询;mysql_global_status_questions
数据库累计接收查询的次数,不包括存储过程中内部的查询;两者都不包括
COM_PING
和COM_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语句对应的结果集;