NL和
直接的技术咨询?
立即致电经验丰富的DBA,以获取数据库帮助,支持和支持。如有必要,我们可以直接与您联系!035 369 0304
首页 > 博客

如何在Docker上进行Postgres第2部分,共3部分

克雷格·希利 2019/9/25下午2:32
分类: 博客,云,PostgreSQL,技术,技巧

在我以前的博客文章中,我向您展示了如何在Docker容器中设置postgreSQL,以便可以使用psql或pgAdmin管理数据库。但是,我尚未解释它是如何工作的。如果您尝试做其他事情,甚至很小的事情,或者遇到类似我所概述的错误,那么您需要知道所有这些命令的实际作用。

我将在此博客中向您解释。

Docker是在虚拟环境(容器)中运行软件的产品的集合。在Windows上,这些Docker容器通常在VirtualBox中运行。 Docker在首次运行时创建了这些VirtualBox。上次我们创建了一个名为“ some-postgres”的容器。

但是我们从哪里获得创建容器的软件-操作系统和 PostgreSQL的?

记得 上一篇博客文章中的图片 (如何在Docker上的Postgres第3部分中的第1部分) 在名为Postgres的Docker Hub上?让我们看一下用于创建容器的命令:

Docker运行大多数Docker命令以关键字Docker开头。

docker run --help

为您提供了可能的选项又名标志的列表。

Met de opdracht *run wordt een container gemaakt.

De flag *--name definieert een naam. Containers zijn bijzonder in Docker. Als je ze geen naam geeft, krijgen ze een standaardnaam, zoals angry_davinci, jolly_wing of tender_banach. Voor de meeste andere Docker-objecten geldt dat als je geen naam opgeeft, Docker een hash-key zal genereren en die vervolgens gebruiken. In dit geval heb ik "some-postgres" gebruikt, zoals voorgesteld op postgres中心页面。

港口

De volgende flag definieert de poort van de container. Alle flags hebben een naam met meerdere tekens voorafgegaan door 2 streepjes (POSIX-standaard), maar sommige flags hebben ook een alias die uit één teken bestaat. Ik had dus kunnen gebruiken *-p 5432:5432 of *--publish 5432:5432. Het eerste nummer staat voor de externe- en het tweede - voor de interne poort.

PostgreSQL的服务器的默认端口是5432。因此,如果我们创建在默认端口上运行的多个PostgreSQL容器(我们将在下一步进行操作),则必须为它们指定不同的外部端口。如果我想创建3个可以同时从pgAdmin进行访问的容器,则可以使用以下标志:

-p 5432:5432

-p 5433:5432

-p 5434:5432 

在pgAdmin上,我将创建3个具有端口5432、5433和5434的服务器。

De volgende flag, *-e of *--env, somt omgevingsvariabelen op die specifiek zijn voor de image. In dit geval willen we het postgres-gebruikerswachtwoord instellen zodat we via pgAdmin verbinding kunnen maken. Als een image dergelijke variabelen moet instellen, moeten ze ergens vermeld zijn. In het geval van deze PostgreSQL的-image zijn ze halverwege de 简介页 详细解释: 

De laatste flag is *-d of *--detach, waarmee we aangegeven dat de container op de achtergrond wordt uitgevoerd. Vergeet je dit en voer je het commando uit, dan kom je rechtstreeks in de container en als je weggaat, stopt de container.

最后,指定图像的名称,在本例中为postgres。在映像名称之后,您可以提供容器将要执行的命令的列表,但是在这种情况下,我们不需要这样做。 

Docker文件

以这种方式旋转容器并不能给您太多控制权,尤其是因为Docker应该提高自动化程度而不是打字技能。运行Docker的正常方法是一个三步过程。首先,您创建一个称为Docker文件的文本文件,该文件由基本映像组成。

基本映像首先位于Docker文件中(您也可以使用#开头的注释),并以关键字FROM为开头。有一个特殊的基本映像,称为草稿,根本不包含任何内容。因此,要自己构建自己的映像,Docker文件的第一行将是:

FROM scratch

之后,您可以向图像添加任何内容。但是您不必从头开始。您可以扩展现有图像。您可以使用特定工具和变量设置ubuntu映像。之后,您可以通过在完全相同的基础操作系统上安装不同版本的PostgreSQL来创建其他映像。这样就可以仅测试PostgreSQL版本中的差异。使用Docker文件,您可以构建自己的映像,就像从Docker集线器中获得的映像一样。使用该图像,您可以运行一个容器。

图片

我们将基于上次查看的postgres图像创建一个图像。创建一个名为“ Docker文件”的文本文件。默认情况下,Docker在当前工作目录(称为构建上下文)中查找Docker文件。当然,您可以从命令提示符或PowerShell窗口运行Docker命令,而不仅仅是从Docker Terminal程序运行。您可以将Docker文件保存在所需的任何文件夹中,只需使用标记*-F 指定文件位置。为了使自己更轻松,我在Docker Toolbox文件夹中创建了一个测试文件夹。请记住,运行时必须使用Linux命令 您在“终端”窗口中。因此,用ls代替dir,用pwd代替echo%cd%。如果需要,还可以访问vi编辑器。我的Dockerfile仅包含两行:

FROM postgres

和 V POSTGRES_PASSWORD=mysecretpassword

要创建图像,请键入

docker build -t craig/postgres:version1 .

不要忘记最后的句号(句号)。这告诉Docker使用当前目录中的“ Docker文件”文件。 

Docker构建您可以看到构建过程分为两个步骤。首先,找到基本图像。如果已经下载(如此处所示),请继续进行下一步,否则它将为您从Docker Hub中提取。然后添加以下命令行,在本例中为POSTGRES_PASSWORD。这是一个临时容器,将自动为您删除。构建完成并且为图像提供了图像ID之后,您将获得 安全警告。如果您正在考虑针对实际系统执行此操作,那么这一点很重要,但是现在您可以 安全地忽略它。如果我在不构建Docker文件的情况下构建映像的版本2,则Docker足够聪明,知道无需进行任何更改。将创建一个名为craig / postgres:version 2的新映像,但是映像ID与craig / postgres:version 1相同。您可以在此处看到创建多个依赖项的选项。不幸的是,除了列出依赖项之外,没有简单的方法 第三方脚本和工具。最接近Docker命令的是:

docker inspect --format='{{.Id}} {{.Parent}} {{.RepoTags}}' $(docker images -quiet)

Docker检查这将显示图像的sha256(其前12位用作图像ID),然后显示任何父图像(如果有)。有关此命令格式的更多信息 看到这个博客.

删除图像时,如果它具有基础图像,则无法执行此操作,因此您可以利用此功能来删除不再需要的图像。您还可以使用: 

docker history postgres