1 前言
Docker容器原則上是短暫的,如果容器被刪除或損毀,數據或配置將丟失,所以上個章節部署的MySQL只適合于測試環境,由于生產的需求,本章將使用Docker卷機制持久保存Docker容器中創建的數據。
2 最佳實踐
2.1 環境配置
2.1.1 系統環境配置
IP Address = 10.168.0.71
Host Name = any
OS = CentOS 7.6 x86_64
2.1.2 軟件環境配置
2.2 非持久化方式啟動MySQL
2.2.1 下載MySQL服務器Docker鏡像
docker pull mysql/mysql-server:5.6
其他版本的下載,請使用以下命令,
docker pull mysql/mysql-server:5.5
docker pull mysql/mysql-server:5.6
docker pull mysql/mysql-server:5.7
docker pull mysql/mysql-server:8.0
docker pull mysql/mysql-server:latest
下載完畢后,你可以使用以下命令查看當前下載的鏡像,
docker images
可見如下顯示,
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql/mysql-server 5.6 8fe1c25ccc38 6 weeks ago 218MB
2.2.2 初始化一個非持久化實例
docker run --name mysql1 -d mysql/mysql-server:5.6 --character-set-server=utf8 --collation-server=utf8_general_ci
啟動實力后,可見如下顯示,
87cb7f2615ff3f762332eb826566a566888e7ade0ecf5fe55cc4c462d7f2e9da
可使用如下命令查看正在運行的容器,
docker ps
可見如下顯示,
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18682cd5edea mysql/mysql-server:5.6 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 3306/tcp mysql1
2.2.3 檢查MySQL啟動的log
docker logs mysql1
2.2.4 獲取初始化密碼
docker logs mysql1 2>&1 | grep -i "GENERATED ROOT PASSWORD:"
可見如下輸出,
Entrypoint] GENERATED ROOT PASSWORD: 63JyseNLAsYf4vnydUS0D3x4NasF
注:以上密碼為“[im4DdeRId3gOM0bAKIBzumJYBr”
2.2.5 從容器內部連接MySQL服務器
docker exec -it mysql1 mysql -uroot -p
然后,我們需要使用如下命令修改root密碼才能繼續,
alter user 'root'@'localhost' identified by 'rootpassword';
如果有以下錯誤提示,
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'rootpassword'' at line 1
請使用如下命令配置,
set password for 'root'@'localhost'=PASSWORD('rootpassword');
2.2.6 創建授權賬號
grant all privileges on *.* to 'root'@'%' identified by "rootpassword";
flush privileges;
2.2.7 查詢實例IP
docker inspect mysql1
可見如下顯示,
[...]
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "e3134a755397c4841912004d8ecff4bf918f6484e9873e3da815946062e87940",
"EndpointID": "8ae10d4677c284e21523fbf4457aa8b0c2a297999a717d111f6b05c12a56fa0a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
[...]
注:參數”IPAddress”的聲明即實例當前地址
2.2.8 測試登錄
yum install -y mariadb
安裝完客戶端后,可使用如下命令測試,
mysql -uroot -p -h 172.17.0.2
2.3 持久化方式啟動MySQL
2.3.1 持久化的說明
docker inspect mysql1
可見如下輸出,
[...]
"Mounts": [
{
"Type": "volume",
"Name": "6757102195b9452306e48650023d366d2c3d72b51764878f08279bb58dca1cb2",
"Source": "/data/docker-runningdata/volumes/6757102195b9452306e48650023d366d2c3d72b51764878f08279bb58dca1cb2/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
[...]
如上所示,“docker inspect”命令所輸出的JSON文件,
– “Mount”關鍵字聲明Docker卷相關定義
– “Destination”關鍵字聲明存于容器內部路徑為“/var/lib/mysql”
– “Source”關鍵字聲明存于物理主機的卷路徑為“/data/docker-runningdata/volumes/6757102195b9452306e48650023d366d2c3d72b51764878f08279bb58dca1cb2/_data”
基于以上,如果需要持久保存數據,官方提供以下命令范式用于啟動,
docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:tag
2.3.2 創建數據目錄和配置文件目錄
mkdir -p /data/docker/etc/mysql
mkdir -p /data/docker/data/
2.3.3 復制實例數據到本地
docker cp mysql1:/etc/my.cnf /data/docker/etc/mysql
docker cp mysql1:/etc/my.cnf.d /data/docker/etc/mysql
docker cp mysql1:/var/lib/mysql /data/docker/data/
2.3.4 停止并刪除之前的實例
docker stop mysql1
docker rm mysql1
2.3.5 啟動MySQL數據庫實例
docker run --name=mysql1 \
--mount type=bind,src=/data/docker/etc/mysql/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/data/docker/etc/mysql/my.cnf.d,dst=/etc/my.cnf.d \
--mount type=bind,src=/data/docker/data/mysql,dst=/var/lib/mysql \
-d mysql/mysql-server:5.6 \
--character-set-server=utf8 \
--collation-server=utf8_general_ci
2.3.6 測試登錄
mysql -uroot -p -h 172.17.0.2
2.4 管理MySQL實例
2.4.1 使用shell管理MySQL服務器
docker exec -it mysql1 bash
可見如下命令提示符,
bash-4.2#
可使用如下命令查看MySQL的數據目錄,
bash-4.2# ls /var/lib/mysql
可見如下提示,
auto.cnf ib_logfile0 ib_logfile1 ibdata1 mysql mysql.sock performance_schema test
2.4.2 管理MySQL容器的相關命令
docker start mysql1
docker restart mysql1
docker stop mysql1
docker rm mysql1
2.5 將容器加入一個特定的網絡
2.5.1 創建容器間的網絡
docker network create cmdschool-net
可以使用如下命令確認網絡的創建,
docker network ls
可見如下顯示,
NETWORK ID NAME DRIVER SCOPE
42120d142861 bridge bridge local
a44be59ebfd9 cmdschool-net bridge local
5bf4d2d3d1a6 host host local
e9ee5d7f4acc none null local
2.5.2 停止并刪除之前配置的實例
docker stop mysql1
docker rm mysql1
2.5.3 使用新的參數連接Docker網絡
docker run --name=mysql1 \
--mount type=bind,src=/data/docker/etc/mysql/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/data/docker/etc/mysql/my.cnf.d,dst=/etc/my.cnf.d \
--mount type=bind,src=/data/docker/data/mysql,dst=/var/lib/mysql \
--network=cmdschool-net \
-d mysql/mysql-server:5.6 \
--character-set-server=utf8 \
--collation-server=utf8_general_ci
注:留意“–network”參數
2.5.4 查詢當前實例的IP
docker inspect mysql1
可見如下顯示,
"Networks": {
"cmdschool-net": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"4e0f2027134c"
],
"NetworkID": "a44be59ebfd9319f7c0ae0dd26f4d41f0d576141481388346a0ff870ee2ed809",
"EndpointID": "76513bee3bddd2c80f611e93f003dbb6c9abd53d184ade5e35faf6bb3d19f3cf",
"Gateway": "172.19.0.1",
"IPAddress": "172.19.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:13:00:02",
"DriverOpts": null
}
}
注:參數”IPAddress”的聲明即實例當前地址
2.5.5 測試登錄
mysql -uroot -p -h 172.19.0.2
注:請自行安裝mysql客戶端
參閱文檔
=================