热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Docker环境中高效利用数据库?|Baeldung

在本文中,我们将探讨如何在Docker环境中高效地管理和利用数据库。首先,需要安装DockerDesktop以确保本地环境准备就绪。接下来,可以从DockerHub中选择合适的数据库镜像,并通过简单的命令将其拉取到本地。此外,我们还将介绍如何配置和优化这些数据库容器,以实现最佳性能和安全性。



在本文中,我们将回顾如何与Docker一起使用来管理数据库。
 
在本地运行Docker映像/镜像
首先,我们必须安装Docker Desktop。然后,我们应该从Docker Hub找到我们数据库的现有映像。找到它后,我们将从页面右上角选择docker pull命令。
这里使用PostgreSQL,因此命令为:

$docker pull postgres



当下载完成后,这个运行命令将创建一个Docker容器内正在运行的数据库。对于PostgreSQL,必须使用-e选项指定POSTGRES_PASSWORD环境变量:

$docker run -e POSTGRES_PASSWORD=password postgres


接下来,我们将测试数据库容器连接。
让我们尝试一个简单的测试。我们将使用JDBC数据源将本地Java项目连接到数据库。连接字符串应使用localhost上的默认PostgreSQL端口5432:

jdbc:postgresql://localhost:5432/postgres?user=postgres&password=password



错误是通知我们该端口未打开。实际上,数据库正在侦听来自容器网络内部的连接,而我们的Java项目正在其外部运行。要修复它,我们需要将容器端口映射到我们的本地主机端口。我们将为PostgreSQL使用默认端口5432:

$docker run -p 5432:5432 -e POSTGRES_PASSWORD=password postgres



连接现在正在工作,并且我们应该能够使用我们的JDBC数据源。
现在,我们可以从外壳连接到我们的数据库,例如,运行初始化脚本。
首先,让我们找到正在运行的容器ID:

$docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                    NAMES
65d9163eece2   postgres   "docker-entrypoint.s…"   27 minutes ago   Up 27 minutes   0.0.0.0:5432->5432/tcp   optimistic_hellman


$docker exec -it 65d9163eece2 bash

最后,我们可以使用命令行客户端连接到数据库实例,并粘贴我们的SQL脚本:

root@65d9163eece2:/# psql -U postgres
postgres=CREATE DATABASE TEST;
CREATE TABLE PERSON(
  ID INTEGER PRIMARY KEY,
  FIRST_NAME VARCHAR(1000),
  LAST_NAME VARCHAR(1000)
);
...


例如,如果要加载较大的转储文件,则必须避免复制粘贴。我们可以直接从主机运行import命令,而不是使用docker exec命令:

$docker exec 65d9163eece2 psql -U postgres  

使用Docker卷持久化数据
只要我们使用相同的容器,我们的基本设置就可以使用,每次需要重启时,docker容器都会停止/启动。如果再次使用docker run,则会创建一个新的空容器,并且我们将丢失数据。实际上,默认情况下,Docker将数据保留在临时目录中。
现在,我们将学习如何修改此卷映射。
第一项任务是检查我们的容器,以查看数据库使用了哪个卷:

$docker inspect -f "{{ .Mounts }}" 65d9163eece2

[{volume f1033d3 /var/lib/docker/volumes/f1033d3/_data /var/lib/postgresql/data local true }] 



我们可以看到卷f1033d3已将容器目录/ var / lib / postgresql / data映射到在主机文件系统中创建的临时目录/ var / lib / docker / volumes / f1033d3 / _data。

我们必须通过docker run命令中添加-v选项来修改此映射:

$docker run -v C:\docker-db-volume:/var/lib/postgresql/data -e POSTGRES_PASSWORD=password postgres



现在,我们可以看到在C:\ docker-db-volume目录中创建的数据库文件。我们可以在这篇专门的文章中找到高级卷配置。

另外,我们可能希望在团队成员之间或在不同环境中共享配置。我们可以使用Docker Compose文件,该文件每次都会创建新的容器。在这种情况下,必须使用卷。
下一章将介绍生产环境中Docker数据库的具体用法。
 

在生产中使用Docker
Docker Compose非常适合共享配置并将容器作为无状态服务进行管理。如果服务失败或无法处理工作量,我们可以将Docker Compose配置为自动创建新容器。这对于为REST后端构建生产集群非常有用,该集群在设计上是无状态的。
但是,数据库是有状态的,并且它们的管理更为复杂:让我们回顾一下不同的上下文。
让我们假设我们正在构建一个非关键环境,用于测试或生产,该环境可以容忍停机时间(在部署,备份或故障期间)。
在这种情况下,我们不需要高可用性集群,我们可以简单地将Docker Compose用于单实例数据库:


  • 我们可以使用简单的卷进行数据存储,因为容器将在同一台机器上执行
  • 我们可以限制它使用mode" class='body_href' >全局模式一次运行一个容器

version: '3'
services:       
  database:
    image: 'postgres'
    deploy:
      mode: global
    environment:
      - POSTGRES_PASSWORD=password
    ports:
      - "5432:5432"
    volumes:
      - "C:/docker-db-volume:/var/lib/postgresql/data"



使用此配置,我们的产品将一次仅创建一个容器,并重新使用C:\ docker-db-volume目录中的数据文件。
但是,在此配置中进行定期备份甚至更为重要。如果发生配置错误,该目录可能会被container擦除或破坏。

现在让我们假设我们的生产环境至关重要。
在这种情况下,诸如Docker Swarm和Kubernetes之类的编排工具对于无状态容器是有好处的:它们提供垂直和水平群集,并具有负载平衡,故障转移和自动扩展功能。
不幸的是,由于我们的数据库容器是有状态的,因此这些解决方案没有提供卷复制机制。
另一方面,构建自制配置很危险,因为它可能导致严重的数据丢失。例如:

  • 对卷使用NFS或NAS之类的共享存储不能保证在另一个实例中重新启动数据库时不会丢失数据
  • 在主从集群上,让Docker业务流程选择多个主节点是一个常见错误,这将导致数据损坏

到目前为止,我们的不同选择是:

  • 不要将Docker用于数据库,而应实现特定于数据库或硬件的复制机制
  • 不要将Docker用于数据库,而订阅OpenShift,Amazon AWS或Azure之类的平台即服务解决方案
  • 使用特定于Docker的复制机制,例如KubeDB和Portworx


最后,我们得出结论,当在高可用性环境中使用Docker时,存在缺点。因此,应避免使用它或与专门用于数据库群集的解决方案结合使用。


推荐阅读
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 1.创建目录mkdir-phomerocketmqnamesvr1data&&mkdir-phomerocketmqnamesvr1log&&mkdir-phomerocketm ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • CentOS 7 中 iptables 过滤表实例与 NAT 表应用详解
    在 CentOS 7 系统中,iptables 的过滤表和 NAT 表具有重要的应用价值。本文通过具体实例详细介绍了如何配置 iptables 的过滤表,包括编写脚本文件 `/usr/local/sbin/iptables.sh`,并使用 `iptables -F` 清空现有规则。此外,还深入探讨了 NAT 表的配置方法,帮助读者更好地理解和应用这些网络防火墙技术。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
author-avatar
3e83owut
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有