一、運行 MySQL 容器
MySQL 鏡像地址:https://hub.docker.com/_/mysql
根據鏡像說明可知:
- 默認的配置文件是:/etc/mysql/my.cnf
- 默認的數據目錄是:/var/lib/mysql
最簡單的啟動方式:
docker run -d --name mysql --rm -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.22
通過 bash 進入容器,查看 my.cnf:
docker exec -it mysql bash cat /etc/mysql/my.cnf
可以發現,主配置文件 my.cnf 加載了 /etc/mysql/conf.d 文件夾下所有的配置(后綴必須是 .cnf),我們只需映射 conf.d 文件夾即可。
宿主機中創建文件夾 mysql,並分別創建 data 目錄和 conf 目錄。新建配置文件 txl.cnf:
[mysqld] server-id = 1 #服務Id唯一 port = 3306 log-error = /var/log/mysql/error.log #只能用IP地址 skip_name_resolve #數據庫默認字符集 character-set-server = utf8mb4 #數據庫字符集對應一些排序等規則 collation-server = utf8mb4_general_ci #設置client連接mysql時的字符集,防止亂碼 init_connect='SET NAMES utf8mb4' #最大連接數 max_connections = 300
接下來分別映射數據庫目錄和配置文件目錄,啟動容器:
docker run --name mysql -d --rm \ -v /home/txl/mysql/conf:/etc/mysql/conf.d \ -v /home/txl/mysql/data:/var/lib/mysql \ -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123 mysql:5.7.22
使用容器客戶端連接:
docker exec -it mysql mysql -uroot -p123
二、微容器 Alpine 構建基礎鏡像
Alpine Linux 是一個面向安全的輕型的 Linux 發行版。采用了 musl libc 和 busybox 以減小系統的體積和運行時資源消耗。在保持瘦身的同時,Alpine Linux 還提供了自己的包管理工具 apk,如:apk add、apk update、apk del。
關鍵的是,相比於其他 Linux 的 Docker 鏡像,它的容量非常小,僅僅只有5MB。
Alpine Linux 的官網:
apline 鏡像地址:https://hub.docker.com/_/alpine
2.1 構建 MySQL 客戶端鏡像
Dockerfile:
FROM alpine:3.8 RUN apk add --no-cache mysql-client ENTRYPOINT ["mysql"]
構建鏡像:
docker build -t myalpine:0.1 .
測試運行:
docker run -it --name myalpine myalpine:0.1 -h 服務端IP -uroot -p密碼
默認鏡像源可能比較慢,可以使用中科大鏡像源:http://mirrors.ustc.edu.cn/alpine/
需要重新構建 Dockerfile,如:
FROM alpine:3.8 RUN echo http://mirrors.ustc.edu.cn/alpine/v3.8/main > /etc/apk/repositories RUN echo http://mirrors.ustc.edu.cn/alpine/v3.8/community >> /etc/apk/repositories RUN apk update && apk upgrade RUN apk add mysql-client ENTRYPOINT ["mysql"]
2.2 MySQL 備份專用鏡像
在之前 MySQL 客戶端鏡像的基礎上,利用 mysqldump 數據庫備份命令制作一個新的鏡像。
Dockerfile:
FROM myalpine:0.1 RUN mkdir data ENV mysql_user root ENV mysql_pass 123 ENV mysql_host 服務端IP ENV mysql_db test ENTRYPOINT mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db > /data/$mysql_db.sql
構建鏡像:
docker build -t mysqlbackup:0.1 .
測試運行:
docker run -it --name mysqlbak --rm \ -v /home/txl/mysqlbak:/data \ -e mysql_host = 服務端IP \ -e mysql_db = test \ mysqlbackup:0.1
容器執行成功后自動刪除。查看 /home/txl/mysqlbak 目錄, test.sql 文件已被自動生成,數據表備份成功。
2.3 MySQL 備份專用鏡像(定時自動備份)
創建腳本 mysqlbak.sh:
#!/bin/sh if [ ! -d "/data" ]; then mkdir /data fi mysqldump -h$mysql_host -u$mysql_user -p$mysql_pass $mysql_db > /data/$mysql_db-$(date +%Y%m%d_%H%M%S).sql
Dockerfile:
FROM myalpine:0.1 ENV mysql_user root ENV mysql_pass 123 ENV mysql_host 180.76.232.93 ENV mysql_db test COPY ./mysqlbak.sh / RUN chmod +x mysqlbak.sh ENV cron_conf "* * * * * " RUN echo "$cron_conf /mysqlbak.sh" >> /var/spool/cron/crontabs/root ENTRYPOINT ["crond","-f"]
crond -f 代表定時任務卡在前台運行:
構建鏡像:
docker build -t mysqlbackup:0.2 .
測試運行:
docker run -d --name mysqlbak \ -v /home/txl/mysqlbak:/data \ -e mysql_user=root \ -e mysql_pass=123 \ -e mysql_host=服務端IP \ -e mysql_db=test \ mysqlbackup:0.2