基于PHP的家教網(wǎng)站開(kāi)發(fā)環(huán)境谷歌seo服務(wù)商
一、
容器數(shù)據(jù)持久化的概念
docker做為容器化的領(lǐng)先技術(shù),現(xiàn)在廣泛應(yīng)用于各個(gè)平臺(tái)中,但不知道什么時(shí)候有一個(gè)說(shuō)法是docker并不適用容器化數(shù)據(jù)庫(kù),說(shuō)容器化的數(shù)據(jù)庫(kù)性能不穩(wěn)定,其實(shí),這個(gè)說(shuō)法主要是因?yàn)閷?duì)docker的數(shù)據(jù)持久化不了解所導(dǎo)致的,數(shù)據(jù)庫(kù)持久化做好了,是完全可以在生產(chǎn)環(huán)境使用容器化的數(shù)據(jù)庫(kù)的
在容器層的 UnionFS(聯(lián)合文件系統(tǒng))中對(duì)文件/目錄的任何修改,無(wú)論是手工修改還是
容器在運(yùn)行過(guò)程中的修改,在該容器丟失或被刪除后這些修改將全部丟失。即這些修改是無(wú)
法保存下來(lái)的。若要保存下來(lái)這些修改,通常有兩種方式:
定制鏡像持久化:將這個(gè)修改過(guò)的容器生成一個(gè)新的鏡像,讓這些修改變?yōu)橹蛔x的鏡像
數(shù)據(jù)卷持久化:將這些修改通過(guò)數(shù)據(jù)卷同步到宿主機(jī)
容器數(shù)據(jù)持久化主要解決的問(wèn)題如下:
- 數(shù)據(jù)丟失:在默認(rèn)情況下,Docker容器內(nèi)部產(chǎn)生的數(shù)據(jù)存儲(chǔ)在其自身的存儲(chǔ)層上。當(dāng)容器停止運(yùn)行或被刪除時(shí),與該容器關(guān)聯(lián)的存儲(chǔ)層也會(huì)被清理,這意味著所有在容器運(yùn)行期間生成或修改的數(shù)據(jù)都將永久丟失。
- 遷移和備份困難:由于容器存儲(chǔ)層與容器生命周期緊密相連,如果需要將數(shù)據(jù)從一個(gè)容器移動(dòng)到另一個(gè)容器,或者需要對(duì)數(shù)據(jù)進(jìn)行備份和恢復(fù)操作,會(huì)非常復(fù)雜且不可靠。
- 多容器共享數(shù)據(jù):在實(shí)際應(yīng)用中,可能需要多個(gè)容器之間共享某些數(shù)據(jù),例如數(shù)據(jù)庫(kù)服務(wù)和Web服務(wù)器之間。但是,容器間的直接文件系統(tǒng)交互并不方便,也不利于容器的獨(dú)立性和可移植性。
- 性能考量:容器存儲(chǔ)層通常是通過(guò)聯(lián)合文件系統(tǒng)(如AUFS、OverlayFS等)實(shí)現(xiàn)的,頻繁寫(xiě)入這類文件系統(tǒng)的性能可能不如直接寫(xiě)入宿主機(jī)的磁盤(pán)。
二、
docker+docker-compose 部署Oracle11g數(shù)據(jù)庫(kù)+數(shù)據(jù)持久化
1、鏡像下載:
本次實(shí)驗(yàn)是在VMware虛擬機(jī)上實(shí)現(xiàn)的,docker環(huán)境搭建部署就不在這里廢話了,鏡像適用的是阿里云的鏡像
[root@centos1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g latest 3fa112fd3642 8 years ago 6.85GB
鏡像pull命令為:
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
2、
docker和docker-compose的版本說(shuō)明
docker的版本是?20.10.7?docker-compose的版本是1.25.1? ,需要說(shuō)明的是,docker版本應(yīng)該為至少19版本,其它沒(méi)有要求
[root@centos1 ~]# docker version
Client:Version: 20.10.7API version: 1.41Go version: go1.13.15Git commit: f0df350Built: Wed Jun 2 11:51:04 2021OS/Arch: linux/amd64Context: defaultExperimental: trueServer: Docker Engine - CommunityEngine:Version: 20.10.7API version: 1.41 (minimum version 1.12)Go version: go1.13.15Git commit: b0f5bc3Built: Wed Jun 2 11:55:29 2021OS/Arch: linux/amd64Experimental: falsecontainerd:Version: v1.4.6GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285drunc:Version: 1.0.0-rc95GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7docker-init:Version: 0.19.0GitCommit: de40ad0
[root@centos1 ~]# docker-compose version
docker-compose version 1.25.1, build a82fef07
docker-py version: 4.1.0
CPython version: 3.7.4
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
3、
docker-compose的編排文件
這里需要說(shuō)明,該名字是固定的,如果不是docker-compose.yml ,重啟,停止oracle數(shù)據(jù)庫(kù)需要指定配置文件,十分不方便
cat >docker-compose.yml <<EOF
version: '3.1'
services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latestrestart: alwayscontainer_name: ogports:- "15211:1521"
EOF
?編排文件里沒(méi)有寫(xiě)volume,這個(gè)時(shí)候先啟動(dòng)容器,后面在拷貝文件到宿主機(jī)目錄
啟動(dòng)容器命令為:
docker-compose up -d
4、
將容器中的文件復(fù)制到宿主機(jī)相關(guān)目錄內(nèi)
確保容器狀態(tài)是正確的
宿主機(jī)創(chuàng)建相關(guān)用戶:
/etc/passwd 文件末尾添加?oracle:x:500:500::/home/oracle:/bin/bash
/etc/group 文件末尾添加?oinstall:x:500:
最為關(guān)鍵的一步,復(fù)制需要持久化的文件到宿主機(jī)(復(fù)制文件的時(shí)候,容器必須是正常啟動(dòng)的)
mkdir -p /data/oracle/oradata
docker cp og:/home/oracle/app/oracle/oradata/helowin /data/oracle/oradata/test_data
docker cp og:/home/oracle/app/oracle/flash_recovery_area/helowin /data/oracle/oradata/flash_recovery_area
chown -Rf oracle:oinstall /data/oracle/
?這里說(shuō)明一下,cp的左邊是容器的目錄,空格后面的是宿主機(jī)的目錄,宿主機(jī)的目錄不需要自己創(chuàng)建,會(huì)自動(dòng)完成,文件很快就拷貝完成,完成后,賦予相關(guān)用戶權(quán)限
5、修改編排文件并重新應(yīng)用編排文件
cat >docker-compose.yml <<EOF
version: '3.1'
services:oracle:image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latestrestart: alwayscontainer_name: ogvolumes:- "/data/oracle/oradata/test_data:/home/oracle/app/oracle/oradata/helowin"- "/data/oracle/oradata/flash_recovery_area:/home/oracle/app/oracle/flash_recovery_area/helowin"ports:- "15211:1521"
EOF
通過(guò)上面修改的編排文件,再次啟動(dòng)容器,這里需要先關(guān)閉,在啟動(dòng),不能使用參數(shù)restart直接重啟哦:
[root@centos1 ~]# docker-compose down
Stopping og ... done
Removing og ... done
Removing network root_default
[root@centos1 ~]# docker-compose up -d
Creating network "root_default" with the default driver
Creating og ... done
應(yīng)用新編排文件后,查看容器日志,日志里面必須沒(méi)有任何error:
root@centos1 ~]# docker logs -f og
/home/oracle/app/oracle/product/11.2.0/dbhome_2
Processing Database instance "helowin": log file /home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log
Fixed Size 2213776 bytes
Variable Size 402655344 bytes
Database Buffers 1191182336 bytes
Redo Buffers 7360512 bytes
Database mounted.
Database opened.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart: Database instance "helowin" warm started.
tail: unrecognized file system type 0x794c7630 for `/home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log'. Reverting to polling.
🆗,現(xiàn)在Oracle數(shù)據(jù)庫(kù)的容器持久化就做好了,使用工具連接也沒(méi)有任何問(wèn)題了
sid和服務(wù)名都是helowin,隨便用哪個(gè)都可以,sys用戶的密碼是oracle,端口由于映射的是15211,因此上面必須這么填寫(xiě),角色是sysdba
SH這個(gè)用戶是鎖定狀態(tài),把鎖定去掉后,在重啟Oracle容器,可以看到鎖定仍然是去掉的,說(shuō)明持久化成功了
?總結(jié):
關(guān)鍵其實(shí)就兩步,第一個(gè)是不帶volume,啟動(dòng)容器,容器正常工作,第二步,拷貝容器內(nèi)文件到宿主機(jī),賦予權(quán)限,然后帶上volume,先down容器,在up容器,拷貝文件決定了持久化工作是否正常