Docker WSL2安装Postgres数据库

postgres是一款被称为“用了都说好”的数据库,我还没有用过,无法评价。我最近在打算继续学一下数据库,以及ORM。由于求异心理,所有人都在这mysql那mysql,我不想用mysql,但又想用开源免费的东西,所以就盯上了postgres。

今天我尝试使用Docker安装postgres。我的电脑是windows傻大黑粗游戏本,因为上班之后一直月光,没存下钱换轻薄本换Mac或者组台式,就继续用上学时候的游戏本(有薪水合适的工作的话,求求老板们带带我吧,人在上海)。

环境准备
Run起Postgres镜像
解决问题
使用DBMS连接到数据库

环境准备

首先系统里应该装有Docker,这个就不细说了。值得一提的是我的Docker Desktop在上次更新后,提示我要不要从hyper-v切换到WSL2,我当然是切换了,这也给我这次安装造成了一些小麻烦。下面列出一些可能用得到的文档,建议都浏览一下:

Run起Postgres镜像

我习惯先pull下镜像再run。执行pull命令:

docker pull postgres

pull完成后,开始run。我是在WSL的shell里执行的命令,不是在PowerShell里,所以命令格式不太一样。
在文档 https://hub.docker.com/_/postgres 中往下翻,翻到"How to extend this image"标题下的"Environment Variables"小标题,简单浏览一下这几个环境变量的意义。因为页面全是英语,很反人类,我很简单地按照我的理解翻译几个当前可能用得到的,如果有错误或者有不准确地地方,请大家务必在评论区指正,谢谢大家。

  1. POSTGRES_PASSWORD,是唯一的必选环境变量,用于给用户设置密码。默认的用户名是"postgres",如果把POSTGRES_PASSWORD设置为"password",则可以使用用户名"postgres"和密码"password"来连接数据库。
  2. POSTGRES_USER,可以指定用户名,替换默认的"postgres"。
  3. POSTGRES_DB,可以给默认的数据库取一个别名,如果不取,默认数据库名为环境变量POSTGRES_USER的值。
  4. PGDATA,可以指定一个(容器内的)目录,这个目录会存放数据库文件。为了防止容器被删除后数据丢失,一般都把这个目录挂载到本机(WSL 2)上。

剩下的环境变量可以等以后深入使用时再了解,现在看了也记不住。

然后下面有一个示例:

$ docker run -d \
    --name some-postgres \
    -e POSTGRES_PASSWORD=mysecretpassword \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /custom/mount:/var/lib/postgresql/data \
    postgres

看到这个我就直接好起来了,直接一行一行复制上,复制的过程中进行一些修改。给容器重新取个名字,就叫postgres1。把POSTGRES_PASSWORD设成自己的密码,用默认的用户名,我在本机D盘里新建一个目录D:/DockerFolder(踩了个坑),把数据库文件挂载到这个目录下,所以-v的命令也要改。

我的命令是这样:

docker run -d \
    --name postgres1 \
    -e POSTGRES_PASSWORD=password \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /mnt/d/DockerFolder/postgres1mount:/var/lib/postgresql/data/pgdata \
    postgres

其中/mnt/d/DockerFolder是主机的D盘下的DockerFolder文件夹在WSL 2中的位置。按下回车。

解决问题

不出意料地把容器ID返回给了我们。然后我们执行命令来查看容器状态:

docker ps

发现什么都没有......

别慌,问题不大,我们复制一下返回的ID,看一下日志:

原来是加权限的时候被拒了。也不要试什么sudo了,肯定没什么用。

从Docker、WSL 2到postgres,这种在国内很小众的东西出了问题,去百度它的话基本就是浪费时间,直接google,stackoverflow都行。

https://github.com/docker-library/postgres/issues/116

上面这个链接是官方库的issue,里面提了各种解决方法,前面的几十条基本都没什么用,我都试过了,也基本没解释问题的原因,直到这一条:

问题出在我们Docker运行在WSL或者其他虚拟机上,但却挂载到本机的路径下。我原以为WSL中用/mnt/d/DockerFolder这种路径是没有问题的,看来我还是错了。我在WSL的/home/kit(kit是我的用户名)下新建一个目录DockerMount用来挂载Docker的卷。之前我还使用docker ps -a看过了postgres的默认端口是5432,所以docker run的时候加一个-p,映射到主机的5432端口,方便我们后面用DBMS来连接。

别忘了先用docker rm [ID]删掉原来的容器。

docker run -d \
    --name postgres1 \
    -e POSTGRES_PASSWORD=password \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -v /home/kit/DockerMount:/var/lib/postgresql/data \
    -p 5432:5432 \
    postgres

执行完命令后,容器终于跑起来了,端口也映射上了。

使用DBMS连接到数据库

数据库都用开源免费的,DBMS当然不能再用Navicat了,我也负担不起。所以选择使用pgAdmin,现在它的大版本是4。

下载地址:
https://www.pgadmin.org/download/pgadmin-4-windows/

在里面选择一款你喜欢的版本,我选择的是最新的小版本4.27。下载速度极慢,需要用特殊姿势提速。

下载完安装,安装完运行,直接自动在浏览器里打开了,需要设置一个密码。

很好看,长这个样子:

点一下Add New Server,第一个tab页的Name,随便取一个,再点第二个tab页的Connection:

这个是重点,Host填localhost或127.0.0.1(但注意localhost不完全等于127.0.0.1,详情可以自己百度,在这里是一样的)。

Port填docker run时用-p填映射到的本机端口,如果你改了的话,也填修改后的端口。

Maintenance database和Username如果你在docker run时修改了默认值的话,也填修改后的。

Password处填上密码,并选中Save password,点击下方软盘图标的Save,会自动测试能否连接成功并连接。

可以看到这里连接成功了,界面也很好看,剩下的可以慢慢探索。本篇文章就到这里结束了,谢谢大家。

posted @ 2020-10-21 00:53  Kit_L  阅读(945)  评论(0编辑  收藏  举报