1. 介绍
在本教程中,我们将学习如何在 Docker 容器中运行 PostgreSQL。这个技术简化了 postgres 的设置。因此,它是开发和测试环境的理想解决方案。
让我们开始吧。
2. 前提条件
首先,确保Docker已在您的机器上安装并运行。如果还没有安装,请按照官方的 Docker安装指南进行设置。
接下来,从 Docker Hub 拉取 PostgreSQL Docker 镜像:
docker pull postgres:latest
此命令将获取 PostgreSQL 镜像的最新版本。或者,我们可以通过将 latest 替换为所需的标签(例如,13.2)来指定特定版本。所有可用的标签可以在 PostgreSQL Docker Hub 页面上找到。
3. 启动一个PostgreSQL容器
要启动一个PostgreSQL容器,请运行以下命令:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
让我们来解析这个命令:
- –name my-postgres: 为容器指定一个名称。
- -e POSTGRES_PASSWORD=mysecretpassword: 为默认的 postgres 用户设置密码。
- -d: 使容器以分离模式运行。这意味着容器在后台启动。
- postgres: 指定要使用的 Docker 镜像。在本例中,我们将使用最新版本。
4. 访问 PostgreSQL 实例
现在,我们应该在名为 my-postgres 的容器中有一个 PostgreSQL 实例。因此,我们不能直接从终端使用 psql 命令,因为这将不可用。相反,我们可以使用 docker exec 命令来访问容器内的 PostgreSQL 实例:
docker exec -it my-postgres psql -U postgres
现在,我们应该有一个可以用来与数据库交互的shell。
我们通常不会直接访问数据库。但是,目前,这是访问数据库的唯一方式。
让我们配置容器,以便将数据库暴露给主机。
5. 配置 PostgreSQL 容器
要从主机连接,我们需要配置容器使其暴露数据库端口。为此,我们可以使用 –publish 或 -p 选项将容器的端口映射到主机端口:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
现在,如果我们连接到 localhost:5432,就可以从主机访问数据库了。此外,我们为 postgres 用户设置了密码,这样我们就可以使用数据库客户端,例如 DBeaver,来连接数据库。
记住这些命令可能会很困难。相反,我们可以使用一个 docker-compose.yml 文件来定义我们的容器。这样做,我们还可以与团队共享配置。
让我们停止并删除当前的容器:
docker stop my-postgres
docker rm my-postgres
现在,我们可以创建我们的 docker-compose.yml 文件。
6. 使用 Docker Compose
一个 docker-compose 只是我们想要运行的容器的文件描述,格式为 YAML。 让我们为 Postgresql 容器创建一个 docker-compose.yml 文件:
version: '3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: mysecretpassword
ports:
- 5432:5432
在上面的例子中,我们定义了一个名为 db 的服务,其配置与之前类似。唯一新增的部分是重启选项。简而言之,我们告诉 Docker,如果容器停止运行,例如由于错误或系统重启,则始终重新启动容器。
让我们在保存此文件的同一目录下使用 docker-compose 命令运行容器:
docker-compose up -d
再一次,我们使用 -d 选项在分离模式下运行容器。
要停止并移除容器,我们可以使用 docker-compose down 命令:
docker-compose down
现在,我们知道如何使用 Docker 轻松创建一个本地数据库了。但是请记住,这不适用于生产环境。
我们需要为生产环境考虑其他事项。
如果我们有机会,我们应该选择一个托管数据库服务,例如 Amazon RDS、 Google Cloud SQL 或 Azure Database for PostgreSQL。
7. 持久化 PostgreSQL 容器数据
在当前设置下,如果我们删除PostgreSQL容器,我们也会丢失其中包含的数据。为了持久化数据,我们可以使用 –volume 或 -v 选项将本地文件夹挂载到容器中。例如:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -v /path/to/local/folder:/var/lib/postgresql/data -d postgres
简而言之,PostgreSQL 数据将使用文件夹 path/to/local/folder 来存储其内容。因此,如果我们删除容器并使用相同的卷重新创建它,数据仍然会存在。
8. 结论
在本教程中,我们学习了如何在Docker容器中运行和配置PostgreSQL。我们首先展示了一个快速命令来启动数据库的运行实例。接下来,我们使用一个 docker-compose.yml 文件来定义容器。最后,我们讨论了通过将本地文件夹挂载到容器来持久化数据。