一、
容器数据持久化的概念
docker做为容器化的领先技术,现在广泛应用于各个平台中,但不知道什么时候有一个说法是docker并不适用容器化数据库,说容器化的数据库性能不稳定,其实,这个说法主要是因为对docker的数据持久化不了解所导致的,数据库持久化做好了,是完全可以在生产环境使用容器化的数据库的
在容器层的 UnionFS(联合文件系统)中对文件/目录的任何修改,无论是手工修改还是
容器在运行过程中的修改,在该容器丢失或被删除后这些修改将全部丢失。即这些修改是无
法保存下来的。若要保存下来这些修改,通常有两种方式:
定制镜像持久化:将这个修改过的容器生成一个新的镜像,让这些修改变为只读的镜像
数据卷持久化:将这些修改通过数据卷同步到宿主机
容器数据持久化主要解决的问题如下:
- 数据丢失:在默认情况下,Docker容器内部产生的数据存储在其自身的存储层上。当容器停止运行或被删除时,与该容器关联的存储层也会被清理,这意味着所有在容器运行期间生成或修改的数据都将永久丢失。
- 迁移和备份困难:由于容器存储层与容器生命周期紧密相连,如果需要将数据从一个容器移动到另一个容器,或者需要对数据进行备份和恢复操作,会非常复杂且不可靠。
- 多容器共享数据:在实际应用中,可能需要多个容器之间共享某些数据,例如数据库服务和Web服务器之间。但是,容器间的直接文件系统交互并不方便,也不利于容器的独立性和可移植性。
- 性能考量:容器存储层通常是通过联合文件系统(如AUFS、OverlayFS等)实现的,频繁写入这类文件系统的性能可能不如直接写入宿主机的磁盘。
二、
docker+docker-compose 部署Oracle11g数据库+数据持久化
1、镜像下载:
本次实验是在VMware虚拟机上实现的,docker环境搭建部署就不在这里废话了,镜像适用的是阿里云的镜像
[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.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:51:04 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:55:29 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: 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:latest
restart: always
container_name: og
ports:
- "15211:1521"
EOF
编排文件里没有写volume,这个时候先启动容器,后面在拷贝文件到宿主机目录
启动容器命令为:
docker-compose up -d
4、
将容器中的文件复制到宿主机相关目录内
确保容器状态是正确的
宿主机创建相关用户:
/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的左边是容器的目录,空格后面的是宿主机的目录,宿主机的目录不需要自己创建,会自动完成,文件很快就拷贝完成,完成后,赋予相关用户权限
5、修改编排文件并重新应用编排文件
cat >docker-compose.yml <<EOF
version: '3.1'
services:
oracle:
image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest
restart: always
container_name: og
volumes:
- "/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这个用户是锁定状态,把锁定去掉后,在重启Oracle容器,可以看到锁定仍然是去掉的,说明持久化成功了
总结:
关键其实就两步,第一个是不带volume,启动容器,容器正常工作,第二步,拷贝容器内文件到宿主机,赋予权限,然后带上volume,先down容器,在up容器,拷贝文件决定了持久化工作是否正常