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語句對應的結果集;