基于PHP的家教網站開發(fā)環(huán)境谷歌seo服務商
一、
容器數據持久化的概念
docker做為容器化的領先技術,現在廣泛應用于各個平臺中,但不知道什么時候有一個說法是docker并不適用容器化數據庫,說容器化的數據庫性能不穩(wěn)定,其實,這個說法主要是因為對docker的數據持久化不了解所導致的,數據庫持久化做好了,是完全可以在生產環(huán)境使用容器化的數據庫的
在容器層的 UnionFS(聯合文件系統(tǒng))中對文件/目錄的任何修改,無論是手工修改還是
容器在運行過程中的修改,在該容器丟失或被刪除后這些修改將全部丟失。即這些修改是無
法保存下來的。若要保存下來這些修改,通常有兩種方式:
定制鏡像持久化:將這個修改過的容器生成一個新的鏡像,讓這些修改變?yōu)橹蛔x的鏡像
數據卷持久化:將這些修改通過數據卷同步到宿主機
容器數據持久化主要解決的問題如下:
- 數據丟失:在默認情況下,Docker容器內部產生的數據存儲在其自身的存儲層上。當容器停止運行或被刪除時,與該容器關聯的存儲層也會被清理,這意味著所有在容器運行期間生成或修改的數據都將永久丟失。
- 遷移和備份困難:由于容器存儲層與容器生命周期緊密相連,如果需要將數據從一個容器移動到另一個容器,或者需要對數據進行備份和恢復操作,會非常復雜且不可靠。
- 多容器共享數據:在實際應用中,可能需要多個容器之間共享某些數據,例如數據庫服務和Web服務器之間。但是,容器間的直接文件系統(tǒng)交互并不方便,也不利于容器的獨立性和可移植性。
- 性能考量:容器存儲層通常是通過聯合文件系統(tǒng)(如AUFS、OverlayFS等)實現的,頻繁寫入這類文件系統(tǒng)的性能可能不如直接寫入宿主機的磁盤。
二、
docker+docker-compose 部署Oracle11g數據庫+數據持久化
1、鏡像下載:
本次實驗是在VMware虛擬機上實現的,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的版本說明
docker的版本是?20.10.7?docker-compose的版本是1.25.1? ,需要說明的是,docker版本應該為至少19版本,其它沒有要求
[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的編排文件
這里需要說明,該名字是固定的,如果不是docker-compose.yml ,重啟,停止oracle數據庫需要指定配置文件,十分不方便
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
?編排文件里沒有寫volume,這個時候先啟動容器,后面在拷貝文件到宿主機目錄
啟動容器命令為:
docker-compose up -d
4、
將容器中的文件復制到宿主機相關目錄內
確保容器狀態(tài)是正確的
宿主機創(chuàng)建相關用戶:
/etc/passwd 文件末尾添加?oracle:x:500:500::/home/oracle:/bin/bash
/etc/group 文件末尾添加?oinstall:x:500:
最為關鍵的一步,復制需要持久化的文件到宿主機(復制文件的時候,容器必須是正常啟動的)
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/
?這里說明一下,cp的左邊是容器的目錄,空格后面的是宿主機的目錄,宿主機的目錄不需要自己創(chuàng)建,會自動完成,文件很快就拷貝完成,完成后,賦予相關用戶權限
5、修改編排文件并重新應用編排文件
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
通過上面修改的編排文件,再次啟動容器,這里需要先關閉,在啟動,不能使用參數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
應用新編排文件后,查看容器日志,日志里面必須沒有任何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.
🆗,現在Oracle數據庫的容器持久化就做好了,使用工具連接也沒有任何問題了
sid和服務名都是helowin,隨便用哪個都可以,sys用戶的密碼是oracle,端口由于映射的是15211,因此上面必須這么填寫,角色是sysdba
SH這個用戶是鎖定狀態(tài),把鎖定去掉后,在重啟Oracle容器,可以看到鎖定仍然是去掉的,說明持久化成功了
?總結:
關鍵其實就兩步,第一個是不帶volume,啟動容器,容器正常工作,第二步,拷貝容器內文件到宿主機,賦予權限,然后帶上volume,先down容器,在up容器,拷貝文件決定了持久化工作是否正常