Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Docker容器中进行部署的镜像文件,下面通过具体的步骤进行演示。
视频讲解如下:
(1)在根目录下创建 /dm8 文件夹,用来放置下载的 Docker 安装包。
mkdir /dm8 cd /dm8
(2)下载 DM Docker安装包。
wget -O dm8_docker.tar -c \ https://download.dameng.com/eco/dm8/dm8_docker.tar
(3)下载完成后,导入DM安装包。
docker import dm8_docker.tar dm8:v01
(4)使用docker images命令来查看导入的镜像。
docker images # 输出的信息如下: REPOSITORY TAG IMAGE ID CREATED SIZE dm8 v01 c5b8632e84e8 3 seconds ago 2.5 GB
(5)启动DM容器。
docker run -itd -p 5237:5236 --name dm8_01 dm8:v01 /bin/bash /startDm.sh # 输出的信息如下: CONTAINER ID IMAGE ...... PORTS NAMES f413eda461b2 dm8:v01 ...... 0.0.0.0:5237->5236/tcp dm8_01 # 这里为了防止与宿主机的端口冲突,将容器内的5236端口映射到了宿主机的5237端口上。
(6)使用SQL命令工具登录DM数据库。
disql sysdba/SYSDBA@localhost:5237 # 用户sysdba的默认密码是SYSDBA。 # 输出的信息如下: 服务器[localhost:5237]:处于普通打开状态 登录使用时间 : 1.976(ms) disql V8 SQL>
(7)查看当前用户和数据库实例的状态信息。
SQL> select user(); 行号 USER() ---------- ------ 1 SYSDBA 已用时间: 2.863(毫秒). 执行号:600. SQL> select status$ from v$instance; 行号 status$ ---------- ------- 1 OPEN 已用时间: 3.772(毫秒). 执行号:601.
(8)停止DM数据库容器。
docker stop dm8_01
这里需要注意的问题是:由于Docker的容器是一个无状态的服务,在实际生产中不适合将一个有状态的服务部署到Docker的容器中,例如数据库服务。这主要体现在以下几方面:
- 数据的安全性
尽管Docker可以通过数据卷的方式将容器内的数据持久化存储到宿主机上,但任然不能保证不丢数据。如果容器崩溃并数据库未正确关闭,则可能会损坏数据。
- 硬件资源的争用
通常在一台Docker的宿主机上往往会启动多个容器。如果将数据库的容器与其他应用的容器运行在同一个宿主机上,由于它们对硬件资源的要求是不同的,必然会造成资源的争用问题。
- 网络带宽的占用
Docker的网络都是虚拟网络,通过宿主机上的docker0网桥进行转发。而数据库通常要求的网络带宽是比较高的。因此将数据库与其他应用都部署在同一个宿主机的容器中,网络带宽必然会成为数据库性能的瓶颈。
- 数据额外的隔离
将数据库部署到容器中,毫无疑问增加了一层容器的隔离。这不利于数据库的水平扩展。
最后还需要说明的一点是,使用Docker的目的就是在于易于构建新环境和易于重新部署应用系统。而在实际情况中数据库一旦部署完成,很少会进行数据库的升级或者重新部署。因此从这一方面看,数据库也不适合Docker及容器化。